如何删除所有 xml python 中重复的 xml 节点

How do you remove duplicate xml nodes throughout all of the xml python

我知道这几乎是

的重复

但是我无法弄清楚为什么我的示例(类似于真实数据问题)为什么没有完全删除重复项。

我使用的代码删除了 4 个中的 2 个而不是 3 个?

我正在尝试创建一个 python 脚本来清除 xml 个文件中的重复项。

代码;

tree = etree.parse(path)
root = tree.getroot()

def elements_equal(e1, e2):
    if type(e1) != type(e2):
        return False
    if e1.tag != e2.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)])

prev = ""
for page in root:
    elems_to_remove = []
    for elem in page:
        if elements_equal(elem, prev):
            print("found duplicate: %s" % elem.text)
            elems_to_remove.append(elem)
            continue
        prev = elem
    for elem_to_remove in elems_to_remove:
        page.remove(elem_to_remove)
tree.write("clean.xml")

xml;

<?xml version="1.0" encoding="UTF-8"?>  
<emails>  
<email>  
  <to>Vimal</to>  
  <from>Sonoo</from>  
  <heading>Hello</heading>  
    <body>Hello brother, how are you!</body>  
    <body>Hello brother, how are you!</body>  
    <body>Hello brother, how are you!</body>  
    <body>Hello brother, how are you!</body>  
</email>  
<email>  
  <to>Peter</to>  
  <from>Jack</from>  
  <heading>Birth day wish</heading>  
  <body>Happy birth day Tom!</body>  
</email>  
<email>  
  <to>James</to>  
  <from>Jaclin</from>  
  <heading>Morning walk</heading>  
  <body></body>  
</email>  
<email>  
  <to>Kartik</to>  
  <from>Kumar</from>  
  <heading>Health Tips</heading>  
  <body>Smoking is injurious to health!</body>  
</email>  
</emails>

希望这只是我遗漏了一些明显的情况,我可以了解那是什么并继续快乐。

您得到此结果的原因是第 3 个和第 4 个 <body> 元素之间存在差异 - 它们的 tail 属性的长度(分别为 7 和 3)。因此,

if e1.tail != e2.tail:
    return False

returns False.

您可以通过删除 tail 相等性作为测试或修改 xml 本身来处理它。