【发布时间】:2014-12-18 15:08:46
【问题描述】:
我有一个 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....
更新:代码似乎可以工作,但它只删除了一个重复项,而不是全部
【问题讨论】:
-
你试过用 root.remove(elem) 代替 page 吗?
-
我认为这是一个列表;如果是这样,请尝试将其设置为一组并查看是否删除了重复项。我想它归结为如何为节点实现 eq 方法,如果有的话
-
它应该是 xmlTree 对象的一个元素,但我不知道它是如何实现的。当我尝试从根目录中删除时,它说:
ValueError: list.remove(x): x not in list -
如何制作成一套? eq方法是什么意思? @omu_negru
-
好吧,只要做 set(your_list) 或任何迭代器就可以了。要检查 eq 方法是否正确实现,获取第二个和第三个节点并查看 second == third 是否返回 true(应该)