【问题标题】:Select XML tags that have certain tags inside them选择其中包含特定标签的 XML 标签
【发布时间】:2021-09-28 12:19:07
【问题描述】:

我正在使用 ElementTree 使用 Python 解析 xml 文件,我需要选择下面的标签,如 <PostalAddressText>,其中包含 <insert> 等标签。我怎么做?我需要得到满足条件的xml文件中所有相关标签名的列表。

这是我正在解析的 XML 片段(除内部标记外的实际文本已替换为 Lorem Ipsum):

<?xml version="1.0"?>
<data>
    <PostalAddressText>123456,
    <insert>
</insert>Lorem ipsum dolor sit amet, <insert>
</insert>consectetur adipiscing elit.<insert>
</insert>Etiam cursus ligula non malesuada fringilla.<delete> </delete><insert>
</insert>Quisque porta quam eu finibus pulvinar.<delete>or</delete><insert>er</insert> Mauris at semper urna.<delete>a</delete><insert>o</insert> Donec feugiat<delete>arcu purus</delete><insert>et lacinia</insert></PostalAddressText>
    <PersonNameText>789012,
    <insert>
</insert>Lorem ipsum dolor sit amet, <insert>
</insert>consectetur adipiscing elit.<insert>
</insert>Etiam cursus ligula non malesuada fringilla.<delete> </delete><insert>
</insert>Quisque porta quam eu finibus pulvinar.<delete>or</delete><insert>er</insert> Mauris at semper urna.<delete>a</delete><insert>o</insert> Donec feugiat<delete>arcu purus</delete><insert>et lacinia</insert>
    </PersonNameText>
</data>

我已经尝试过了,但没有任何东西打印到控制台:

test_data = root.findall(".//")
for el in test_data:
    if el.text == '*<insert>*':
        print(el.tag, el.text)

【问题讨论】:

  • &lt;/diff:insert&gt;只能在&lt;com:PostalAddressText下吗?
  • @balderman 不,可能有不同的标签,其下带有 。我只需要找到所有 “在里面”的标签
  • 请发布一个有效的 xml。确保解析器可以解析它。
  • @balderman 我现在已经更改了 xml 示例,它可以解析成功。

标签: python xml tags


【解决方案1】:

不确定您的预期输出是什么,但请查看下面的代码和输出

import xml.etree.ElementTree as ET

xml = '''<?xml version="1.0"?>
<data>
    <PostalAddressText>123456,
    <insert>
</insert>Lorem ipsum dolor sit amet, <insert>
</insert>consectetur adipiscing elit.<insert>
</insert>Etiam cursus ligula non malesuada fringilla.<delete> </delete><insert>
</insert>Quisque porta quam eu finibus pulvinar.<delete>or</delete><insert>er</insert> Mauris at semper urna.<delete>a</delete><insert>o</insert> Donec feugiat<delete>arcu purus</delete><insert>et lacinia</insert></PostalAddressText>
    <PersonNameText>789012,
    <insert>
</insert>Lorem ipsum dolor sit amet, <insert>
</insert>consectetur adipiscing elit.<insert>
</insert>Etiam cursus ligula non malesuada fringilla.<delete> </delete><insert>
</insert>Quisque porta quam eu finibus pulvinar.<delete>or</delete><insert>er</insert> Mauris at semper urna.<delete>a</delete><insert>o</insert> Donec feugiat<delete>arcu purus</delete><insert>et lacinia</insert>
    </PersonNameText>
</data>'''

root = ET.fromstring(xml)
for idx, insert in enumerate(root.findall('.//insert'), 1):
    print(f'{idx}) {insert.text}  {insert.tail}')

输出

1) 
  Lorem ipsum dolor sit amet, 
2) 
  consectetur adipiscing elit.
3) 
  Etiam cursus ligula non malesuada fringilla.
4) 
  Quisque porta quam eu finibus pulvinar.
5) er   Mauris at semper urna.
6) o   Donec feugiat
7) et lacinia  None
8) 
  Lorem ipsum dolor sit amet, 
9) 
  consectetur adipiscing elit.
10) 
  Etiam cursus ligula non malesuada fringilla.
11) 
  Quisque porta quam eu finibus pulvinar.
12) er   Mauris at semper urna.
13) o   Donec feugiat
14) et lacinia  

【讨论】:

  • 谢谢!但我需要一些不同的东西。我需要获取满足条件“包含标签”的标签名称列表。如果我们以上面的 xml 为例,列表将是:PostalAddressText, PersonNameText
  • 我已经使用你的代码来解决我的问题,谢谢!
  • 很高兴我能帮上忙。
【解决方案2】:

我通过以下代码得到了我需要的结果(我的想法来自@balderman):

for el in root.findall('.//*[insert]'): 
    print(el.tag)

这给了我标签的名称。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多