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

Specific pathing to find XML elements using minidom in Python

按照该线程,我正在使用xml.dom.minidom进行一些非常基本的XML遍历,只读。

令我感到困惑的是为什么它的getElementsByTagName在没有显式提供其确切路径的情况下却发现了几个层次级别的节点。

XML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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代码:

1
2
3
4
5
xmldoc = minidom.parse('sampleXML.xml')
items = xmldoc.getElementsByTagName('item')

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

印刷品:

1
2
3
4
5
6
7
8
item1
item2
item3
item4
item5
item6
item7
item8

令我困扰的是它隐式地在data->itemsdata->secondSetOfItems下找到了名为item的标签。

如何使它遵循明确的路径,并且仅提取两个类别之一下的项目? 例如。 在data->secondSetOfItems下:

1
2
3
4
item5
item6
item7
item8


如果要从特定类别中获取商品,可以先获取父元素。

例如:

码:

1
2
3
4
5
6
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

输出:

1
2
3
4
item5
item6
item7
item8


这是getElementsByTagName的声明行为

Search for all descendants (direct children, children’s children, etc.) with a particular element type name.

有些人在上面写了一个"过滤器",看到这个答案

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

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

或BeautifulSoup findAll:

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