检查并删除XML中重复的子标记

2024-10-03 13:30:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过python中的元素树解析一个类似XML的文件,并将内容写入pandas数据帧。在

我目前面临以下问题:子标签的存在对于不同的标签来说是不同的。这对here中提到的解决方案没有问题。然而,复杂的部分是有些标签有重复的子标签,而另一些标签没有。例如,第一个产品标签有两个(不同)商品编号和两个相等的产品类型(重复),而第二个产品标签只有一个。在

<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>

我想做的是: 1.)删除“产品类型”和 2.)如果不存在第二个物品编号,则设置值NULL,否则取该值。在

目前我的代码:

^{pr2}$

对于第一个示例来说,这很好,但是对于第二个示例显然不行,因为第二个“article_nr”和“product_type”没有值。在

输出应为:

article_nr    article_nr    product_type
B00024J7C6    44253           x
B00024J7C7    NULL            y

Tags: 文件元素示例类型产品maintypearticle
1条回答
网友
1楼 · 发布于 2024-10-03 13:30:13

看看Python remove duplicate elements from xml tree,也许它能帮你。 像这样的事情:

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")

相关问题 更多 >