简体   繁体   English

使用带有重复元素的 ElementTree 解析 Python 中的 XML

[英]Parsing a XML in Python using ElementTree with repeat elements

I have an XML file that is structured like我有一个 XML 文件,其结构如下

<?xml version="1.0" encoding="utf-8"?>
<Method>
  <Version>1.0</Version>
  <Parameter key="IM-MS Browser Method">
   <Parameter key="FileOperations">
      <Parameter key="CondenseFilePSet">
        <Parameter key="AutoFrameSelect">
          <Value>True</Value>
        </Parameter>
    </Parameter>
    <Parameter key="MethodBookmark">
      <Parameter key="MassRange">
        <Value />
      </Parameter>
      <Parameter key="PolygonRegion">
        <Value>
          <XUnits>Milliseconds</XUnits>
          <YUnits>MassToCharge</YUnits>
          <Vertices>
            <V x="0.2705684" y="102.2292" />
            <V x="59.79562" y="3173.849" />
            <V x="0.676421" y="3173.849" />
            <V x="0.2705684" y="142.8233" />
          </Vertices>
        </Value>
      </Parameter>

I would like to retrieve the values of "Vertices".我想检索“顶点”的值。 How can I do this with python's native XML parser ElementTree?如何使用 python 的本机 XML 解析器 ElementTree 执行此操作? Thanks!谢谢!

Use xml.etree.ElementTree.Element.findall with an XPath expression that selects all Vertices tags on all levels beneath the root.xml.etree.ElementTree.Element.findall与 XPath 表达式一起使用,该表达式选择根下所有级别上的所有Vertices标记。

See https://docs.python.org/3/library/xml.etree.elementtree.html#supported-xpath-syntax请参阅https://docs.python.org/3/library/xml.etree.elementtree.html#supported-xpath-syntax

import xml.etree.ElementTree as ET

xml_string = r"""<?xml version="1.0" encoding="utf-8"?>
<Method>
  <Version>1.0</Version>
  <Parameter key="IM-MS Browser Method">
    <Parameter key="FileOperations">
      <Parameter key="CondenseFilePSet">
        <Parameter key="AutoFrameSelect">
          <Value>True</Value>
        </Parameter>
      </Parameter>
    </Parameter>
    <Parameter key="MethodBookmark">
      <Parameter key="PolygonRegion">
        <Parameter key="MassRange">
          <Value/>
        </Parameter>
        <Value>
          <XUnits>Milliseconds</XUnits>
          <YUnits>MassToCharge</YUnits>
          <Vertices>
            <V x="0.2705684" y="102.2292"/>
            <V x="59.79562" y="3173.849"/>
            <V x="0.676421" y="3173.849"/>
            <V x="0.2705684" y="142.8233"/>
          </Vertices>
        </Value>
      </Parameter>
    </Parameter>
  </Parameter>
</Method>"""

root = ET.fromstring(xml_string)

# It returns a list of Elements
vertices_tags = root.findall(".//Vertices")

for v_tags in vertices_tags:
    for v_tag in v_tags:
        print(v_tag.tag, v_tag.attrib)

Output: Output:


V {'x': '0.2705684', 'y': '102.2292'}
V {'x': '59.79562', 'y': '3173.849'}
V {'x': '0.676421', 'y': '3173.849'}
V {'x': '0.2705684', 'y': '142.8233'}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM