使用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
答
搜索所有后代与特定元素类型名称申报行为(直接孩子,孩子的孩子,等等)。
一些上面写了一个 “过滤器”,看到this answer
在我看来minidom被太简单了,可以考虑使用LXML的XPath:
tree.xpath('//secondSetOfItems/item/@name')
或BeautifulSoup的findAll:
data.secondSetOfItems.item.findAll('name')
十分感谢。还有一个问题:假设我在项目标签“- XYZ
'内有一个值。我如何阅读XYZ?我试过'item.nodeValue'无效 –
amphibient
nvrmnd,它应该是'item.childNodes [0] .nodeValue' – amphibient