有没有办法从 xml 文件中删除所有出现的具有特定属性的特定元素?

问题描述 投票:0回答:1

我有一堆 xml 文件,我想从中删除一个名为 uid 且属性为 type = uri 的元素。还有元素 uid 的其他实例,但我只想删除具有 type=uri 属性的实例。每个 xml 文件中元素出现的次数和结构都是不同的。

我尝试了

root.findall("//uid[@type='uri']")
并尝试使用
remove()
方法来删除所有出现的元素。但这行不通。我无法使用固定的 XPATH,因为这不适用于所有 xml 文件。

例如:

<a>
  <b>
    <c>
      <uid type ="x"> This needs to stay </uid>
    </c>
    <d>
      <uid type ="uri"> This has to be removed </uid>
    </d>
    <e>
      <uid type ="uri"> This has to be removed </uid>
    <e>
  </b>
</a>

我尝试过做

for uid in a.iter("//unitid[@type='uri']"):
    a.remove(uid)

我还尝试使用

a.find()
a.findall()
。该脚本不会抛出任何错误,但也不会执行所需的操作。

我对使用 ElementTree 进行 xml 解析相当陌生,所以我为我的天真道歉 .任何帮助表示赞赏。

python xml xml-parsing elementtree
1个回答
0
投票

一种可能的解决方案是找到所有父标签(其中有

<uid type="uri">
作为子标签),然后删除这些子标签:

import xml.etree.ElementTree as ET

xml_data = """
<a>
  <b>
    <c>
      <uid type="x"> This needs to stay </uid>
    </c>
    <d>
      <uid type="uri"> This has to be removed </uid>
    </d>
    <e>
      <uid type="uri"> This has to be removed </uid>
    </e>
  </b>
</a>
"""

root = ET.fromstring(xml_data)

# this will find all tags that have <uid type="uri"> as child
parents = root.findall('.//uid[@type="uri"]...')

for p in parents:
    p.remove(p.find('./uid[@type="uri"]'))

print(ET.tostring(root).decode())

打印:

<a>
  <b>
    <c>
      <uid type="x"> This needs to stay </uid>
    </c>
    <d>
      </d>
    <e>
      </e>
  </b>
</a>
© www.soinside.com 2019 - 2024. All rights reserved.