使用Python中的minidom查找XML元素的特定路径

问题描述:

根据this thread,我使用xml.dom.minidom来执行一些非常基本的XML遍历,只读。使用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> 

Python代码:

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 

如果您想获取特定类别的项目,可以通过先抓取父元素。

例如:

代码

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

十分感谢。还有一个问题:假设我在项目标签“ XYZ'内有一个值。我如何阅读XYZ?我试过'item.nodeValue'无效 – amphibient

+2

nvrmnd,它应该是'item.childNodes [0] .nodeValue' – amphibient

这是getElementsByTagName

搜索所有后代与特定元素类型名称申报行为(直接孩子,孩子的孩子,等等)。

一些上面写了一个 “过滤器”,看到this answer

在我看来minidom被太简单了,可以考虑使用LXML的XPath:

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

BeautifulSoup的findAll:

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