【问题标题】:How to get the sibling tag value in a xml ElementTree using python,如何使用 python 获取 xml ElementTree 中的兄弟标记值,
【发布时间】:2023-02-09 01:18:04
【问题描述】:

想用ElementTree获取xml中兄弟元素的值。 sample.xml 如下 想在 John 的比赛中获得 23 的价值,在 Jin 的比赛中获得 20 的价值。

<MainTag xmlns="http://www.exmple.com">
    <Tag1>
        <Tag11>Sam</Tag11>
        <Tag12>New York</Tag12>
        <Tag13>21</Tag13>
        <Tag14>Dance</Tag14>
    </Tag1>
    <Tag1>
        <Tag11>John</Tag11>
        <Tag12>New York</Tag12>
        <Tag13>23</Tag13>
        <Tag14>Music</Tag14>
    </Tag1>
    <Tag1>
        <Tag11>Jenny</Tag11>
        <Tag12>Sydney</Tag12>
        <Tag13>20</Tag13>
    </Tag1>
    <Tag1>
        <Tag11>Jin</Tag11>
        <Tag12>Jakarta</Tag12>
        <Tag13>20</Tag13>
        <Tag14>Music</Tag14>
    </Tag1>
</MainTag>

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    不太熟悉 xml,但快速谷歌搜索说你应该使用 xml.etree.elemttree 模块来解析 xml 并提取信息

    【讨论】:

      【解决方案2】:

      有趣的情况!由于您的 xml 具有默认名称空间,因此您必须考虑到它。这可以做到in one of two ways:声明一个命名空间或使用通配符。

      在这种情况下,您有一个包含两个目标名称(JohnJin)的列表,您可能希望使用f-strings 对其进行迭代并插入到 xpath 表达式中。

      问题是通配符命名空间和 f 字符串都使用 {},因此如果您想使用通配符,您要么必须转义 {},要么放弃它并声明命名空间。

      所以:

      import xml.etree.ElementTree as ET
      tags = """[your xml above]"""
      doc = ET.fromstring(tags)
      targets = ["John","Jin"]
      
      #using wildcards without a namespace declaration:
      
      for target in targets:
          print(doc.find(f'.//{{*}}Tag1[{{*}}Tag11="{target}"]/{{*}}Tag13').text)
      
      #or without wildcards
      
      ns = {'': 'http://www.exmple.com'}
      for target in targets:
          print(doc.find(f'.//Tag1[Tag11="{target}"]/Tag13',namespaces=ns).text)
      

      两种情况下的输出都是

      23
      20
      

      【讨论】:

        猜你喜欢
        • 2020-03-24
        • 2019-08-29
        • 1970-01-01
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多