XML:如何通过属性值获取元素-Python 2.7和minidom

2024-10-01 02:25:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想得到一个XML元素列表,它基于标记名上的第一个和属性值上的第二个。 我使用的是xml.dom库和Python2.7。

虽然第一步很容易完成:

from xml.dom import minidom
xmldoc = minidom.parse(r"C:\File.xml")
PFD = xmldoc.getElementsByTagName("PFD")
PNT = PFD.getElementsByTagName("PNT")

我四处寻找,但找不到第二步的解决办法。有没有类似于.getElementsByAttributeValue的东西可以给我一个列表来使用?

如果XML看起来像这样

<PFD>
     <PNT A="1" B=.../>
     <PNT A="1" B=.../>
     <PNT A="2" B=.../>
</PFD>

需要列表中A=“1”的所有pnt。


Tags: from标记import元素列表属性parsexml
3条回答

试试这个:

from xml.dom import minidom

xmldoc = minidom.parse(r"C:\File.xml")
PNT = xmldoc.getElementsByTagName("PNT")

for element in PNT:
    print element.attributes.keys()
    for elem in element.attributes.values():
        print elem.firstChild.data 

如果不局限于使用xml.dom.minidom,lxml具有更好的搜索功能。注意,lxml不是内置的,需要安装lxml package和非Python依赖项。

例如:

>>> from lxml import etree
>>> root = etree.parse(r"C:\File.xml")
>>> for e in root.findall('PNT[@A="1"]'):
...     print etree.tostring(e)
<PNT A="1" B="c"/>
<PNT A="1" B="b"/>

Lxml还通过element.xpath('query')支持所有XPath。其他方便的函数包括element.findtext,它可以找到适当的元素并返回其文本,element.findelement.findall,后者返回所有匹配查询的元素的第一个/列表,这些元素使用包含公共查询的XPath子集。

如果找不到内置方法,为什么不遍历这些项?

from xml.dom import minidom
xmldoc = minidom.parse(r"C:\File.xml")
PFD = xmldoc.getElementsByTagName("PFD")
PNT = xmldoc.getElementsByTagName("PNT")
for element in PNT:
    if element.getAttribute('A') == "1":
        print "element found"

现在将项目添加到列表应该很容易。

相关问题 更多 >