programing

Python을 사용하여 미니돔으로 요소 값 가져오기

codeshow 2023. 8. 26. 00:07
반응형

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

반응형