2013-04-24 2 views
0

파이썬에서 XML 시트를 구문 분석하고 있습니다. XML의 구조는 다음과 같습니다.Python minidom : 요소에 액세스하는 방법

<layer1> 
    <layer2> 
     <element> 
      <info1></info1> 
     </element> 
     <element> 
      <info1></info1> 
     </element> 
     <element> 
      <info1></info1> 
     </element> 
    </layer2> 
</layer1> 

info2에서 데이터를 액세스하는 데 문제가 없습니다. 하지만 layer2에서는 정말 문제가 있습니다. 그들의 내가 ADRESS 수 인포 함께 : 그래서 내가 해결하는 방법입니다 root.firstChild.firstChild.childNodes[0].childNodes[0].data

########## 솔루션

: root.firstChild.childNodes[0].childNodes[0].data

그래서 내 생각이었다 나는 이런 식으로 비슷한 할 수있는 내 문제 :

tree = ET.parse("test.xml") 
root = tree.getroot() 

for elem in root.findall('./layer2/'): 
    for node in elem.findall('element/'): 
     x = node.find('info1').text 
     if x != "abc": 
      elem.remove(node) 
+0

당신이 * 대신 minidom을 사용하는 * 한 모든 이유 ElementTree API? 'root.findall의 컨텍스트 ('.// 요소 /') :.! 정보 = context.find ('인포') 텍스트 경우 정보 = A –

답변

0

minidom API를 사용하지 마십시오. 대신 ElementTree API을 사용하십시오. xml.dom.minidom documentation explicitly states that 다음 DOM에 이미 능숙하지 않은

사용자 대신 자신의 XML 처리에 대한 xml.etree.ElementTree 모듈을 사용하는 것이 좋습니다. 자신의 위치에 관계없이, 이것은 element 요소 안에 포함 된 모든 info1 요소를 나열하는 XPath 식을 사용

from xml.etree import ElementTree as ET 

tree = ET.parse('inputfile.xml') 

for info in tree.findall('.//element/info1'): 
    print info.text 

: 여기

은 요소에 액세스 할 수 ElementTree API를 사용하는 간단한 예제입니다 전체적인 XML 문서에서. 당신이 필요로하는 모든이 처음 info1 요소 인 경우

, .find() 사용하십시오 DOM API와

print tree.find('.//info1').text 

.firstChild 쉽게 대신 Element 노드의 Text 노드가 될 수있다; 당신은 항상 첫 번째 Element 일치 찾기 위해 .childNotes 순서를 반복 할 필요

def findFirstElement(node): 
    for child in node.childNodes: 
     if child.nodeType == node.ELEMENT_NODE: 
      return child 

을 그러나 아마 .getElementsByTagName()를 사용하는 경우, 충분하다 :

root.getElementsByTagName('info1').data 
+0

덕분에,이 날 :) 빠른 질문을하는 데 도움이 : root.remove (컨텍스트)' 작동하지 않습니다. 그것은 목록에없는 그 말은? – Leagis

+0

좋아, 나는 혼자서 해결책을 알아 냈다 :) 당신의 지원 녀석을위한 감사합니다!내 결과를 shwo로 질문을 편집합니다. – Leagis

+0

@FlorianKanus : 아니요, 질문을 편집하지 마십시오. (대신 질문에 답하십시오!) 대신 가장 좋은 대답을 수락하거나 직접 작성하십시오. –

0

ET 등 xml.etree 수입 cElementTree에서

ET

로 xml.etree 수입 cElementTree에서이 일을합니까? 당신이 그것을 도울 수 있다면 (메신저 놀라운하지 파이썬에서 그냥 빨리 생각)

name[0].firstChild.nodeValue