Python을 사용하여 미니돔으로 요소 값 가져오기
저는 파이썬에서 이브 온라인 API를 위한 GUI 프론트엔드를 만들고 있습니다.
나는 그들의 서버에서 XML 데이터를 성공적으로 꺼냈습니다.
"name"이라는 노드에서 값을 가져오려고 합니다.
from xml.dom.minidom import parse
dom = parse("C:\\eve.xml")
name = dom.getElementsByTagName('name')
print name
노드를 찾는 것처럼 보이지만 출력은 다음과 같습니다.
[<DOM Element: name at 0x11e6d28>]
노드의 값을 인쇄하려면 어떻게 해야 합니까?
그래야 합니다.
name[0].firstChild.nodeValue
당신이 원하는 문자 부분이라면 아마도 이런 것일 것입니다.
from xml.dom.minidom import parse
dom = parse("C:\\eve.xml")
name = dom.getElementsByTagName('name')
print " ".join(t.nodeValue for t in name[0].childNodes if t.nodeType == t.TEXT_NODE)
노드의 텍스트 부분은 요청한 노드의 하위 노드로 배치된 노드로 간주됩니다.따라서 모든 하위 노드를 살펴보고 텍스트 노드인 모든 하위 노드를 찾습니다.노드에는 여러 개의 텍스트 노드가 있을 수 있습니다.
<name>
blabla
<somestuff>asdf</somestuff>
znylpx
</name>
blabla'와 'znylpx'가 모두 필요하므로 ".join()"이 필요합니다.공백을 새 줄이나 다른 줄로 바꾸거나 아무 것도 아닌 것으로 바꾸려고 할 수 있습니다.
이런 것을 사용할 수 있습니다.저는 잘 해결되었습니다.
doc = parse('C:\\eve.xml')
my_node_list = doc.getElementsByTagName("name")
my_n_node = my_node_list[0]
my_child = my_n_node.firstChild
my_text = my_child.data
print my_text
이제 이 질문이 꽤 오래된 것은 알지만, 저는 당신이 Element와 함께하는 것이 더 쉬울 것이라고 생각했습니다.나무
from xml.etree import ElementTree as ET
import datetime
f = ET.XML(data)
for element in f:
if element.tag == "currentTime":
# Handle time data was pulled
currentTime = datetime.datetime.strptime(element.text, "%Y-%m-%d %H:%M:%S")
if element.tag == "cachedUntil":
# Handle time until next allowed update
cachedUntil = datetime.datetime.strptime(element.text, "%Y-%m-%d %H:%M:%S")
if element.tag == "result":
# Process list of skills
pass
그것이 매우 구체적이지 않다는 것을 알지만, 저는 방금 그것을 발견했고, 지금까지 미니돔보다 훨씬 더 쉽게 머리를 돌립니다(많은 노드가 기본적으로 흰색 공간이기 때문입니다).
예를 들어 다음과 같이 태그 이름과 실제 텍스트를 함께 사용할 수 있습니다.
>>> element[0]
<Element currentTime at 40984d0>
>>> element[0].tag
'currentTime'
>>> element[0].text
'2010-04-12 02:45:45'e
위의 답변은 정확합니다. 즉, 다음과 같습니다.
name[0].firstChild.nodeValue
하지만 다른 사람들과 마찬가지로 저에게도 제 가치는 훨씬 아래에 있었습니다.
name[0].firstChild.firstChild.nodeValue
이를 찾기 위해 다음을 사용했습니다.
def scandown( elements, indent ):
for el in elements:
print(" " * indent + "nodeName: " + str(el.nodeName) )
print(" " * indent + "nodeValue: " + str(el.nodeValue) )
print(" " * indent + "childNodes: " + str(el.childNodes) )
scandown(el.childNodes, indent + 1)
scandown( doc.getElementsByTagName('text'), 0 )
Inkscape로 만든 간단한 SVG 파일을 실행하여 다음과 같은 이점을 얻었습니다.
nodeName: text
nodeValue: None
childNodes: [<DOM Element: tspan at 0x10392c6d0>]
nodeName: tspan
nodeValue: None
childNodes: [<DOM Text node "'MY STRING'">]
nodeName: #text
nodeValue: MY STRING
childNodes: ()
nodeName: text
nodeValue: None
childNodes: [<DOM Element: tspan at 0x10392c800>]
nodeName: tspan
nodeValue: None
childNodes: [<DOM Text node "'MY WORDS'">]
nodeName: #text
nodeValue: MY WORDS
childNodes: ()
xml.dom.minidom을 사용했는데, 다양한 필드가 MiniDom Python 페이지에 설명되어 있습니다.
다음은 여러 노드에 대한 Henrik의 약간 수정된 답변입니다(예: getElementsByTagName이 둘 이상의 인스턴스를 반환하는 경우).
images = xml.getElementsByTagName("imageUrl")
for i in images:
print " ".join(t.nodeValue for t in i.childNodes if t.nodeType == t.TEXT_NODE)
질문에 답했습니다. 저의 기여는 초보자를 혼란스럽게 할 수 있는 한 가지를 명확히 하는 데 있습니다.
사용된 제안 및 정답 중 일부firstChild.data
기타 사용된 항목firstChild.nodeValue
대신.당신이 그들 사이에 무엇이 다른지 궁금해 할 때, 당신은 그들이 같은 일을 한다는 것을 기억해야 합니다. 왜냐하면nodeValue
의 별칭일 뿐입니다.data
.
내 진술에 대한 참조는 미니돔의 소스 코드에 대한 주석으로 찾을 수 있습니다.
#
nodeValue
는 의 별칭입니다.data
저도 비슷한 사례가 있었는데, 저에게 효과가 있었던 것은 다음과 같습니다.
name.firstChild.childNodes[0].data
XML은 간단해야 하는데 실제로 그렇습니다. 그리고 저는 왜 파이썬의 미니돔이 그렇게 복잡하게 만들었는지 모르겠습니다.하지만 그것이 만들어진 방식입니다.
그것은 나무이고, 중첩된 요소들이 있을 수 있습니다.시도:
def innerText(self, sep=''):
t = ""
for curNode in self.childNodes:
if (curNode.nodeType == Node.TEXT_NODE):
t += sep + curNode.nodeValue
elif (curNode.nodeType == Node.ELEMENT_NODE):
t += sep + curNode.innerText(sep=sep)
return t
언급URL : https://stackoverflow.com/questions/317413/get-element-value-with-minidom-with-python
'programing' 카테고리의 다른 글
Set-Content가 내 파일 끝에 새 줄(줄 바꿈, CRLF)을 추가합니다. (0) | 2023.08.26 |
---|---|
하위 폴더로 폴더를 복사하는 방법은 무엇입니까? (0) | 2023.08.26 |
스크립트 태그에서 온로드 이벤트를 실행하려고 합니다. (0) | 2023.08.26 |
Get-ChildItem은 어떻게 결과가 없음(파일 0개)에 대해 테스트할 수 있습니까? (0) | 2023.08.26 |
jquery 호버 이벤트 지연? (0) | 2023.08.26 |