【问题标题】:XML: How to get Elements by Attribute Value - Python 2.7 and minidomXML:如何按属性值获取元素 - Python 2.7 和 minidom
【发布时间】:2014-01-29 10:04:09
【问题描述】:

我想获取基于 first 标签名和 second 属性值的 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")

我一直在环顾四周,但找不到第二步的解决方案。有没有像.getElementsByAttributeValue 这样的东西可以给我一个可以使用的列表?

如果 XML 看起来像这样

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

需要列表中 A="1" 的所有 PNT。

【问题讨论】:

    标签: python xml python-2.7 minidom


    【解决方案1】:

    如果您没有找到内置方法,为什么不迭代项目?

    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"
    

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

    【讨论】:

      【解决方案2】:

      如果您不限于使用 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 的子集覆盖常见查询。

      【讨论】:

        【解决方案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 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-23
          • 2017-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-25
          • 2021-08-07
          • 1970-01-01
          相关资源
          最近更新 更多