删除XML中的重复节点

时间:2010-11-09 14:08:59

标签: python xml

我正在使用Python和markup.py生成一个XML文件....它已经全部解决了但由于最近脚本的变化,我现在在节点中得到重复值,因为我放了检查到位。这是一个输出样本(它们是车辆记录):

<?xml version='1.0' encoding='UTF-8' ?>
<datafeed>
<vehicle>
    <vin>2HNYD18816H532105</vin>
    <features>
        <feature>AM/FM Radio</feature>
        <feature>Air Conditioning</feature>
        <feature>Anti-Lock Brakes (ABS)</feature>
        <feature>Alarm</feature>
        <feature>CD Player</feature>
        <feature>Air Bags</feature>
        <feature>Air Bags</feature>
        <feature>Anti-Lock Brakes (ABS)</feature>
        <feature>Alarm</feature>
        <feature>Air Bags</feature>
        <feature>Alarm</feature>
        <feature>Air Bags</feature>
    </features>
</vehicle>
<vehicle>
    <vin>2HKYF18746H537006</vin>
    <features>
        <feature>AM/FM Radio</feature>
        <feature>Anti-Lock Brakes (ABS)</feature>
        <feature>Air Bags</feature>
        <feature>Air Bags</feature>
        <feature>Anti-Lock Brakes (ABS)</feature>
        <feature>Alarm</feature>
        <feature>Air Bags</feature>
        <feature>Alarm</feature>
    </features>
</vehicle>
</datafeed>

这是一个包含100多条记录的较大XML文件的摘录。我该怎么做才能删除重复的节点?

1 个答案:

答案 0 :(得分:1)

XML中没有真正的“重复”。根据定义,每个节点都不同。但我理解你想要摆脱你的解释中的所有重复功能。

您可以通过简单地解析该树,将要素(节点的值)放在一个集合中(以消除重复)并写出新的XML文档来实现此目的。

鉴于您使用Python生成文件,您应该以不会生成重复值的方式修改创建例程。您可能想告诉我们markup.py是什么或做什么。

修改

我刚看了一下标记脚本,所以这样的内容可能出现在你的脚本中:

// well, this might come from somewhere else, but I guess you have such a list somewhere
features = [ 'AM/FM Radio', 'Air Conditioning', 'Anti-Lock Brakes (ABS)', 'Alarm', 'CD Player', 'Air Bags', 'Air Bags', 'Anti-Lock Brakes (ABS)', 'Alarm', 'Air Bags', 'Alarm', 'Air Bags' ]

// write the XML
markup.features.open()
markup.feature( features )
markup.features.close()

在这种情况下,只需将功能设为set,然后再将其传递给标记脚本:

// write the XML
markup.features.open()
markup.feature( set( features ) )
markup.features.close()

如果您有多个单独的列表,其中包含单个车辆的功能,请首先合并这些列表(或集合):

list1 = [...]
list2 = [...]
list3 = [...]
features = set( list1 + list2 + list3 )