2014-01-14 1 views
2

this thread에 따라 매우 기본적인 XML 트래버 싱 (읽기 전용)을 수행하기 위해 xml.dom.minidom을 사용하고 있습니다.Python에서 minidom을 사용하여 XML 요소를 찾는 특정 경로 지정

나를 혼란스럽게하는 이유는 정확히 getElementsByTagName이 정확한 경로를 명시 적으로 제공하지 않고 여러 계층 수준의 노드를 찾고 있기 때문입니다.

XML :

<data> 
    <items> 
     <item name="item1"></item> 
     <item name="item2"></item> 
     <item name="item3"></item> 
     <item name="item4"></item> 
    </items> 
    <secondSetOfItems> 
     <item name="item5"></item> 
     <item name="item6"></item> 
     <item name="item7"></item> 
     <item name="item8"></item> 
    </secondSetOfItems> 
</data> 

파이썬 코드 :

xmldoc = minidom.parse('sampleXML.xml') 
items = xmldoc.getElementsByTagName('item') 

for item in items: 
    print item.attributes['name'].value 

인쇄 : 날 귀찮게 무엇

item1 
item2 
item3 
item4 
item5 
item6 
item7 
item8 

이 암시 적으로 모두 data->items에서 item라는 이름의 태그뿐만 아니라 data->secondSetOfItems을 발견 한 것입니다 .

명시적인 경로를 따르고 두 범주 중 하나에서 항목 만 추출하려면 어떻게해야합니까? 예 : data->secondSetOfItems 아래 :

item5 
item6 
item7 
item8 

답변

7

특정 카테고리에서 항목을 가져 오려면 먼저 상위 항목을 가져 와서 항목을 가져올 수 있습니다 . 예를 들어

:

코드 :

xmldoc = minidom.parse('sampleXML.xml') 
#Grab the first occurence of the "secondSetOfItems" element 
second_items = xmldoc.getElementsByTagName("secondSetOfItems")[0] 
item_list = second_items.getElementsByTagName("item") 

for item in item_list: 
    print item.attributes['name'].value 

출력 :

item5 
item6 
item7 
item8 
+0

큰 감사를드립니다. 한 가지 더 질문 : item 태그'item name = "item8"> XYZ'안에 값이 있다고 가정 해보십시오. 어떻게 XYZ를 읽겠습니까? 나는'item.nodeValue'를 noohail – amphibient

+2

nvrmnd로 시도했지만, item.childNodes [0] .nodeValue이어야합니다. – amphibient

1

이 특정 요소 유형 이름을 가진 모든 자손 getElementsByTagName

검색의 선언 된 행동 (직접 어린이, 어린이 어린이 등)입니다.

tree.xpath('//secondSetOfItems/item/@name') 

또는 BeautifulSoup findall은 :

data.secondSetOfItems.item.findAll('name') 

는 일부는 this answer

는 LXML의 XPath를 사용하는 것이 그 minidom 너무 간단 나에게 보이는 볼 그것에 "필터"를 썼다

관련 문제