我有一个 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(使用前将#替换为@)