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

时间:2014-01-14 21:05:18

标签: python xml dom

根据this thread,我使用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

让我感到困扰的是,它隐含地在itemdata->items下找到了名为data->secondSetOfItems的标签。

如何使其遵循显式路径并仅提取两个类别之一的项目?例如。在data->secondSetOfItems下:

item5
item6
item7
item8

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是getElementsByTagName

的声明行为
  

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

有人写了一个“过滤器”,请参阅this answer

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

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

BeautifulSoup findAll:

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