如何在Python中使用xml ElementTree获取XML元素的兄弟标签值?

huangapple go评论62阅读模式
英文:

How to get the sibling tag value in a xml ElementTree using python,

问题

要使用ElementTree获取XML中同级元素的值。示例XML如下所示,想要获取John的值23和Jin的值20。

<MainTag xmlns="http://www.example.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>

如果要获取John和Jin的值,你可以使用Python的ElementTree库进行解析。以下是示例代码:

import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse('sample.xml')
root = tree.getroot()

# 遍历XML并获取John和Jin的值
for tag1 in root.findall('.//{http://www.example.com}Tag1'):
    name = tag1.find('{http://www.example.com}Tag11').text
    value = tag1.find('{http://www.example.com}Tag13').text
    if name == 'John' or name == 'Jin':
        print(f'Value against {name}: {value}')

这段代码将遍历XML文件中的Tag1元素,找到Tag11和Tag13元素,然后检查它们的值是否为'John'或'Jin',如果是,则打印出相应的值。

英文:

Want to get the value of the sibling element in xml using ElementTree.
sample.xml is as below
want to get value 23 against John & 20 against Jin.

&lt;MainTag xmlns=&quot;http://www.exmple.com&quot;&gt;
    &lt;Tag1&gt;
        &lt;Tag11&gt;Sam&lt;/Tag11&gt;
        &lt;Tag12&gt;New York&lt;/Tag12&gt;
        &lt;Tag13&gt;21&lt;/Tag13&gt;
        &lt;Tag14&gt;Dance&lt;/Tag14&gt;
    &lt;/Tag1&gt;
    &lt;Tag1&gt;
        &lt;Tag11&gt;John&lt;/Tag11&gt;
        &lt;Tag12&gt;New York&lt;/Tag12&gt;
        &lt;Tag13&gt;23&lt;/Tag13&gt;
        &lt;Tag14&gt;Music&lt;/Tag14&gt;
    &lt;/Tag1&gt;
    &lt;Tag1&gt;
        &lt;Tag11&gt;Jenny&lt;/Tag11&gt;
        &lt;Tag12&gt;Sydney&lt;/Tag12&gt;
        &lt;Tag13&gt;20&lt;/Tag13&gt;
    &lt;/Tag1&gt;
    &lt;Tag1&gt;
        &lt;Tag11&gt;Jin&lt;/Tag11&gt;
        &lt;Tag12&gt;Jakarta&lt;/Tag12&gt;
        &lt;Tag13&gt;20&lt;/Tag13&gt;
        &lt;Tag14&gt;Music&lt;/Tag14&gt;
    &lt;/Tag1&gt;
&lt;/MainTag&gt;

答案1

得分: 0

以下是翻译好的部分:

有趣的情况!由于您的XML文件具有默认命名空间,您需要考虑它。这可以通过两种方式之一来完成:要么声明一个命名空间,要么使用通配符。

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

问题在于通配符命名空间和f-strings都使用{},因此如果要使用通配符,您必须转义{},或者放弃它并声明命名空间。

所以:

import xml.etree.ElementTree as ET
tags = """[您的XML内容]"""
doc = ET.fromstring(tags)
targets = ["John","Jin"]

# 不声明命名空间,使用通配符:

for target in targets:
    print(doc.find(f'.//{{*}}Tag1[{{*}}Tag11="{target}"]/{{*}}Tag13').text)

# 或者不使用通配符

ns = {'': 'http://www.exmple.com'}
for target in targets:
    print(doc.find(f'.//Tag1[Tag11="{target}"]/Tag13', namespaces=ns).text)

无论哪种情况,输出都是:

23
20
英文:

Interesting situation! Since your xml has a default namespace, you have to account for it. That can be done in one of two ways: either declare a namespace or use a wildcard.

In this case, you have a list of two target names (John and Jin) which presumably you want to iterate over and interpolate into the xpath expression using f-strings.

The problem is that both the wildcard namespace and f-strings use {}, so you either have to escape the {} if you want to use wildcards, or give that up and declare the namespaces.

So:

import xml.etree.ElementTree as ET
tags = &quot;&quot;&quot;[your xml above]&quot;&quot;&quot;
doc = ET.fromstring(tags)
targets = [&quot;John&quot;,&quot;Jin&quot;]

#using wildcards without a namespace declaration:

for target in targets:
    print(doc.find(f&#39;.//{{*}}Tag1[{{*}}Tag11=&quot;{target}&quot;]/{{*}}Tag13&#39;).text)

#or without wildcards

ns = {&#39;&#39;: &#39;http://www.exmple.com&#39;}
for target in targets:
    print(doc.find(f&#39;.//Tag1[Tag11=&quot;{target}&quot;]/Tag13&#39;,namespaces=ns).text)

Output in either case is

23
20

huangapple
  • 本文由 发表于 2023年2月8日 21:50:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/75386761.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定