使用Python中的minidom查找XML元素的具体路径

按照这个线程,我使用xml.dom.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->itemsdata->secondSetOfItems下隐式地找到了名为item标签。

我如何使它遵循明确的路径,并且只提取两个类别之一的项目? 例如在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

这是getElementsByTagName的声明行为

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

有些人写了一个“过滤器”,看到这个答案

在我看来,minidom太简单了,请考虑使用lxml xpath:

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

或BeautifulSoup findAll:

data.secondSetOfItems.item.findAll('name')
链接地址: http://www.djcxy.com/p/29953.html

上一篇: Specific pathing to find XML elements using minidom in Python

下一篇: python xml query get parent