Python 检查并删除XML中重复的子标记
我正在通过python中的元素树解析一个类似XML的文件,并将内容写入数据框架 我目前面临着以下问题:子标记的存在对于不同的标记是不同的。这不会是上述解决方案的问题。然而,复杂的部分是,一些标记具有重复的子标记,而其他标记则没有。例如,第一个产品标签有两个(不同的)商品编号和两个相同的产品类型(重复),而第二个产品标签只有一个Python 检查并删除XML中重复的子标记,python,xml,parsing,elementtree,Python,Xml,Parsing,Elementtree,我正在通过python中的元素树解析一个类似XML的文件,并将内容写入数据框架 我目前面临着以下问题:子标记的存在对于不同的标记是不同的。这不会是上述解决方案的问题。然而,复杂的部分是,一些标记具有重复的子标记,而其他标记则没有。例如,第一个产品标签有两个(不同的)商品编号和两个相同的产品类型(重复),而第二个产品标签只有一个 <main> <product> <article_nr>B00024J7C6</article_nr&g
<main>
<product>
<article_nr>B00024J7C6</article_nr>
<article_nr>44253</article_nr>
<product_type>x</product_type>
<product_type>x</product_type>
</product>
<product>
<article_nr>B00024J7C7</article_nr>
<product_type>y</product_type>
</product>
</main>
这在第一个示例中很好,但在第二个示例中显然不行,因为第二个“article_nr”和“product_type”没有值
输出应为:
article_nr article_nr product_type
B00024J7C6 44253 x
B00024J7C7 NULL y
看,也许它能帮你。
像这样的事情:
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 != 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:
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")
您能添加到目前为止您拥有的代码和所需的输出吗?谢谢。那你为什么不能在解析后再做呢?为什么需要在之前执行此操作?我已经添加了代码和所需的输出@alecxe@e4c5谢谢你的提示。我已经更改了标题,因为在解析之后这样做可以,甚至更好。代码通过删除所有重复项解决了第一个问题。我自己用以下代码解决了第二个问题:
对于root.findall('product'):article\u nr=product.findall('article\u nr'),如果len(article\u nr)==1:product.insert(1,ET.Element('article\u nr'))
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 != 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:
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")