Python从xml树中删除重复元素

2023-12-01

我有一个 xml 结构,其中一些元素不是唯一的。因此,我设法对子树进行排序,并且可以正确过滤我拥有多次的元素。但删除功能似乎不适用。

我的 XML 结构看起来像这样简化:

<root>
  <page>
    <text>blabla blub unique</text>
    <text>blabla blub not unique</text>
    <text>blabla blub not unique</text><!-- line should be removed -->
    <text>blabla blub not unique</text><!-- line should be removed -->
    <text>blabla blub not unique</text><!-- line should be removed -->
    <text>blabla blub again unique</text>
  </page>
  <page>
    <text>2nd blabla blub unique</text>
    <text>2nd blabla blub not unique</text>
    <text>2nd blabla blub not unique</text><!-- line should be removed -->
    <text>2nd blabla blub again unique</text>
  </page>
</root>

我想删除每个页面上的双字符串,因此我在两个 for 循环中迭代页面和页面中的元素:(摘录重要行,我希望没有忘记任何内容)

import xml.etree.ElementTree as ET
self.tree = ET.parse(path)
self.root = self.tree.getroot()
self.prev = None
# [...]
for page in self.root:                     # iterate over pages
    for elem in page:
        if elements_equal(elem, self.prev):
            print("found duplicate: %s" % elem.text)   # equal function works well
            page.remove(elem) # <---- removes just one line
            continue
        self.prev = elem
# [...]
self.tree.write("out.xml") # 2 duplicate lines still there....

update:该代码似乎有效,但它只删除了一个重复项,而不是所有重复项


我不知道你是如何定义的elements_equal,但是(无耻地改编自测试 xml.etree.ElementTree 的等效性)这对我有用:

编辑:存储迭代时要删除的每个元素的列表page然后删除它们,而不是在一个循环内进行删除。

编辑:在元素标签的比较中注意到代码中的一个小拼写错误并更正它。

import xml.etree.ElementTree as ET

path = 'in.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 != 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)])

for page in root:                     # iterate over pages
    elems_to_remove = []
    for elem in page:
        if elements_equal(elem, prev):
            print("found duplicate: %s" % elem.text)   # equal function works well
            elems_to_remove.append(elem)
            continue
        prev = elem
    for elem_to_remove in elems_to_remove:
        page.remove(elem_to_remove)
# [...]
tree.write("out.xml")

Gives:

$ python undupe.py
found duplicate: blabla blub not unique
found duplicate: 2nd blabla blub not unique
$ cat out.xml
<root>
  <page>
    <text>blabla blub unique</text>
    <text>blabla blub not unique</text>
    <text>blabla blub again unique</text>
  </page>
  <page>
    <text>2nd blabla blub unique</text>
    <text>2nd blabla blub not unique</text>
    <text>2nd blabla blub again unique</text>
  </page>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python从xml树中删除重复元素 的相关文章

随机推荐

  • 用于打印文本文件中搜索字符串的上一行和下一行的批处理脚本

    我有一个批处理脚本 它将把搜索字符串的整行打印到文本文件中 for i in log txt do FINDSTR G pattern txt i gt gt output txt 例子 pattern txt 包含搜索字符串ERROR下面
  • 发推文,不使用推文表

    我使用下面的代码来分享内容 来自UITextView UIImageView 通过推特 void shareViaTweet NSString shareMessage if SLComposeViewController isAvaila
  • Java 6 JVM 挂起

    对于这么长的帖子 我深表歉意 但我想知道在向 Sun 提交错误报告之前是否可以吸引更多人的关注 虚拟机 6u11操作系统 Windows XP SP3硬件 AMD Athlon 64 X2 4600 2 41GHz 配备 3 25 GB R
  • CollapsingToolbarLayout 副标题

    我可以设置标题吗CollapsingToolbarLayout通过setTitle方法 还有设置字幕的方法吗 如果你想让字幕转到Toolbar当 的时候AppBar已完全折叠 您应该创建您的自定义CoordinatorLayout Beha
  • 缺少 libmmal.so 和 picamera 库

    使用 pip 安装 picamera 库后 每当我导入该库时 都会收到此错误 OSError libmmal so cannot open shared object file No such file or directory 我正在运行
  • 如何本地化alloyui调度程序组件?

    我正在尝试将 Alloyui 调度程序完全本地化为法语 继这篇文章之后 如何获取 YUI 3 或 AlloyUI 组件的本地化版本 工作快完成了 但是我仍然缺少两件事的提示 我需要将左栏中的时间格式从 1 12am pm 更改为 1 24
  • html,css - 图片下方奇怪的隐形边距

    我在这里疯了 不知何故 在我页面中的所有图像下方有一个间隙 代码中不存在的边距 即使 Firebug 也看不到它 但 Firefox 和 Safari 正在渲染它 即使根本没有 CSS 这以前从未发生在我身上
  • 进行 GameCenter 身份验证的正确方法是什么?

    我在有关堆栈溢出的帖子中看到过 其中显示了处理 GameCenter 身份验证的片段 然而 这些解决方案都不能解决现实世界用例所涉及的任何问题 也就是说 GKLocalPlayer localPlayer authenticateHandl
  • 使用 Ajax 检查 WooCommerce 结帐中的现有电子邮件

    我正在尝试检查 WooCommerce 结账中 billing email 字段的插入值 以了解它是否存在 这是functions php中的代码 add action wp enqueue scripts live validation
  • JOIN 结果长度超过 50,000 个字符的限制

    我正在尝试组合 A 列中的文本并将其与 B 列的每种可能性相匹配 我使用了以下公式 in C1 transpose split join arrayformula rept filter A1 A len A1 A char 9999 co
  • OpenMP set_num_threads() 不起作用

    我正在使用 C 中的 OpenMP 编写并行程序 我想使用控制程序中的线程数omp set num threads 但它不起作用 include
  • Fortran 中的大实数运算

    我编写了一个 Fortran 代码来计算给定列表的第 i 次排列 1 2 3 n 无需计算所有其他的 即n 我需要它来找到 TSP 旅行推销员问题 的第 i 条路径 When n 很大 代码给了我一些错误 我测试发现找到的第 i 个排列不是
  • circular_buffer 和 Managed_mapped_file 分段错误

    我正在使用 boost 1 73 0 并尝试将circular buffer 与manage mapped file 一起使用以将字符串存储在磁盘上持久存在的循环缓冲区中 我执行以下操作来创建 打开circular buffer boost
  • 如何找到不同 numpy 数组中两点之间的距离?

    这是针对 K 均值算法的 这是为了家庭作业 所以我不想使用 内置 Kmeans 函数 我有 2 个 numpy 数组 一种是质心 另一个是数据点 我试图找到从每个质心到每个数据点的距离 我不知道如何将数组传递给我的函数以使其打印 我想结束
  • JavaScript 中的保留字列表

    有没有比这个更完整的列表莫斯拉的关于保留字 它缺少像这样的词解析浮点型 toString 原型 etc parseFloat toString and prototype are not保留字 仅仅因为它们有时具有特殊含义 并不意味着您不能
  • 使用 Pandas 与 DataFrame 合并时出现 ValueError

    我正在尝试使用 Pandas 合并三个 DataFrame 为什么我会收到此错误消息 ValueError DataFrame 的真值不明确 使用 a empty a bool a item a any 或 a all 这是代码 df pd
  • 如何在给定(一条线上的两个点)和(从第三点到第一点的距离)的情况下找到第三点

    给定 一条线上的两个点 和 第三点到第一点的距离 如何找到第三点 语言 Visual Basic 2012 第三点与第二点在同一条线上 并且可能更接近第一点 也可能更接近第二点 这是一个可以处理两者 来自数据数组 的函数 奇怪的是 我似乎无
  • SQL 从一张表的字段更新另一张表的字段

    我有两张桌子 A ID column1 column2 column3 B ID column1 column2 column3 column4 A将永远是子集B 意味着所有列A也在B 我想用特定的内容更新记录ID in B他们的数据来自A
  • 如何在页面加载时使用 Javascript 发出成功的 Ajax 请求

    我正在开发一个购物车应用程序 用户将向其存储在本地存储中的 购物车 添加商品 当用户导航到将商品添加到购物车的不同页面时 需要使用他们添加到购物车 本地存储 的商品填充该页面 我使用 Handbars 为我的页面构建模板 使用 NodeJS
  • Python从xml树中删除重复元素

    我有一个 xml 结构 其中一些元素不是唯一的 因此 我设法对子树进行排序 并且可以正确过滤我拥有多次的元素 但删除功能似乎不适用 我的 XML 结构看起来像这样简化