python - 如何删除重复的节点 xml Python

标签 python xml parsing

我有一个特殊情况的 xml 文件结构类似于:

<Root>
    <parent1>
         <parent2>
             <element id="Something" >
         </parent2>
     </parent1>
     <parent1>
         <element id="Something">
     </parent1>
</Root>

我的用例是删除重复的元素,我想删除具有相同 Id 的元素。我尝试了以下代码,但没有得到积极的结果(它没有找到重复的节点)

import xml.etree.ElementTree as ET

path = 'old.xml'

tree = ET.parse(path)
root = tree.getroot()
prev = None

def elements_equal(e1, e2):
    if type(e1) != type(e2):
        return False
    if e1.tag != e1.tag: return False
    if e1.text != e2.text: return False
    if e1.tail != e2.tail: return False
    if e1.attrib != e2.attrib: return False
    if len(e1) != len(e2): return False
    return all([elements_equal(c1, c2) for c1, c2 in zip(e1, e2)])

for page in root:                     # iterate over pages
elems_to_remove = []
for elem in page:
   for insideelem in page:
       if elements_equal(elem, insideelem) and elem != insideelem:
           print("found duplicate: %s" % insideelem.text)   # equal function works well
           elems_to_remove.append(insideelem)
           continue

for elem_to_remove in elems_to_remove:
    page.remove(elem_to_remove)
# [...]
tree.write("out.xml")

有人可以帮我告诉我如何解决这个问题吗?我对 python 非常陌生,几乎零经验。

最佳答案

首先,您正在做的事情是您正在使用的库中的一个难题,请参阅这个问题:How to remove a node inside an iterator in python xml.etree.ElemenTree

解决方案是使用 lxml,它“实现相同的 API,但具有额外的增强功能”。然后您可以进行以下修复。

您似乎只遍历 XML 树中的第二级节点。您将获得root,然后让 child 走它的 child 。这将使您从第一页获得 parent2 ,并从第二页获得 element 。此外,您不会在这里进行跨页面比较:

您的比较只会在同一页面中找到二级重复项。

使用适当的遍历函数(例如 iter)选择正确的元素集:

# Use a `set` to keep track of "visited" elements with good lookup time.
visited = set()
# The iter method does a recursive traversal
for el in root.iter('element'):
    # Since the id is what defines a duplicate for you
    if 'id' in el.attr:
        current = el.get('id')
        # In visited already means it's a duplicate, remove it
        if current in visited:
            el.getparent().remove(el)
        # Otherwise mark this ID as "visited"
        else:
            visited.add(current)

关于python - 如何删除重复的节点 xml Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31914130/

相关文章:

c++ - 使用Qt5解析以括号 `[`开头的JSON

xml - 有没有办法将目录中的一些 XML 文件转换为 AVRO 文件?

python - 如何在狮身人面像中制作彩色盒子

python - setuptools 入口点。将可执行文件安装到/usr/sbin

c# - 反序列化大型 XML 文档中的单个元素 : xmlSerializer. Deserialize(xmlReader.ReadSubtree()) 由于命名空间问题而失败

php - 使用 PHP DOM 的具有混合内容的 XML 节点

python - 在 Django 中搜索应用程序

python - 使用 ColumnTransformer/FeatureUnion 后构建完整数据框(特征值 + 名称)的推荐方法是什么?

java - 从 AttributeSet 获取颜色

java - 如何分别获取名词、动词、形容词同义词集?