2015-01-07 98 views
3

我有一個XML文件,它具有許多具有相同屬性的不同節點。使用Python 2在XML中按屬性查找所有節點

我想知道是否有可能找到所有這些節點使用Python和任何其他包如minidom或ElementTree。

+0

感謝球員,我使用的是minidom,似乎它不是如此強大,最終將轉移到ElementTree。 – tinySandy

回答

7

您可以使用內置的xml.etree.ElementTree模塊。

如果你想有不管屬性值的特定屬性的所有元素,你可以使用XPath表達式

//tag[@attr] 

或者,如果你在乎值:

//tag[@attr="value"] 

示例(使用​​):

import xml.etree.ElementTree as ET 

data = """ 
<parent> 
    <child attr="test">1</child> 
    <child attr="something else">2</child> 
    <child other_attr="other">3</child> 
    <child>4</child> 
    <child attr="test">5</child> 
</parent> 
""" 

parent = ET.fromstring(data) 
print [child.text for child in parent.findall('.//child[@attr]')] 
print [child.text for child in parent.findall('.//child[@attr="test"]')] 

打印:

['1', '2', '5'] 
['1', '5'] 
+0

爲什麼假設所有這些節點都將成爲根元素的直接子節點?如果孩子和孫輩,或任何嵌套級別的後代具有這些屬性,那麼呢? 'parent.findall('.//[@ attr]')'在Python 2.7中拋出無效的後代錯誤。 – alex

+1

@alex wait,'//'或'.//'會在任何嵌套層次上尋找節點。或者,我誤解了你的問題..謝謝。 – alecxe

+1

@alex啊,如果你的意思是要查找任何節點名稱,請使用'.//*[@ attr]'。 – alecxe

2

這是一個很好的示例使用 /啓動腳本:

# -*- coding: utf-8 -*- 
from lxml import etree 
fp = open("xml.xml") 
tree = etree.parse(fp) 
for el in tree.findall('//node[@attr="something"]'): 
    print(el.text) 
相關問題