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

Mar*_*tin 5 python xml minidom python-2.7

我想首先在TagName 上获取XML元素列表,然后在属性值上获取第二个 XML元素列表.我正在使用xml.dom库和python 2.7.

虽然很容易完成第一步:

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

我一直在环顾四周,但找不到第二步的解决方案.是否有类似的东西.getElementsByAttributeValue可以给我一个列表来使用?

如果XML看起来像这样

<PFD>
     <PNT A="1" B=.../>
     <PNT A="1" B=.../>
     <PNT A="2" B=.../>
</PFD>
Run Code Online (Sandbox Code Playgroud)

需要所有PNT,其中A ="1"在列表中.

Hol*_*lly 6

如果您不限于使用xml.dom.minidom,则lxml具有更好的搜索功能.请注意,lxml不是内置的,需要安装lxml包和非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"/>
Run Code Online (Sandbox Code Playgroud)

Lxml还支持所有XPath via element.xpath('query').其他便利函数包括element.findtext查找适当元素并返回其文本,element.findelement.findall使用覆盖常见查询的XPath子集返回与查询匹配的所有元素的第一个/列表.


Xeu*_*eun 5

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

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"
Run Code Online (Sandbox Code Playgroud)

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