比较两个XML文件并更新其中一个元素

时间:2012-07-13 13:36:13

标签: python xml

如果我的标题听起来令人困惑,我很抱歉。 我正在编写一个比较2个XML文件的Python脚本。在这两个文件中,我们都有数据,其id与其他文件中的id相同。

E.g。

源文件:

  <id>123456</id> 
    <data>blabla</data>
        ......some other data......
  <id>abcde</id>
    <data>gfkgjk</data>
        ......some more data..........

目标文件:

  <id>123456</id> 
    <data> </data>
        ......some other data......
  <id>ghijk</id>
    <data>gfkgjk</data>
        ......some more data..........

正如您在上面的示例中所看到的,源文件中的所有ID都不在目标文件中。此外,虽然2个数据组具有相同的ID,但是一个数据组填写了“数据”标签,另一个没有填充。

我的程序应该查看源文件,提取数据标记之间的id和文本。然后它查看目标文件,如果存在具有相同ID和空数据标记的数据(如上例所示),则会使用源文件中的信息填充这些空标记。 (顺便说一下:除了ID和数据信息之外,两个XML完全不同,因此我不能只保留源文件。)

是的,我能够提取数据标签之间的ID和信息。 现在我正在尝试编写一个函数来比较id并替换空数据信息(如果有的话)。 但是,我对Python和函数不是很熟悉,需要一些帮助。 这是我的函数的样子:

def replace_empty_data():
    for x in xmlData_id_source:
       if xmlData_id_source==xmlData_id_target:
          target = re.sub(xmlData_2,xmlData,target)
       return target
    file_target.close()

功能中可能缺少负载,但我不知道是什么。它没有给我任何错误,只是没有工作。除x之外的变量已在代码的早期部分中定义,因此这不是问题。

xmlData_id_source是源文件中的ID xmlData_id_target是目标文件中的ID xmlData_2是目标文件中的数据信息 xmlData是源文件

中的数据信息

感谢您的输入到目前为止,但我仍然在寻找一个易于理解的方法,对于那些对编程没有任何线索的人....我使用minidom来解析文件,并且希望不使用它导入和安装更多的库。

2 个答案:

答案 0 :(得分:2)

您需要使用XML Parser。看看ElementTree

请勿在此处使用正则表达式或字符串替换

答案 1 :(得分:1)

我使用lxml,它具有良好的性能和其他功能,例如内置ElementTree不支持的XPATH。这就是我要做的事情:

>>> source = """<root>
    <tag>
        <id>123456</id> 
        <data>blabla</data>
    </tag>
    <tag>
        <id>abcde</id>
        <data>gfkgjk</data>
    </tag>
</root>"""
>>> target = """<root>
    <tag>
        <id>123456</id> 
        <data> </data>
    </tag>
    <tag>
        <id>ghijk</id>
        <data>gfkgjk</data>
    </tag>
</root>"""

由于data节点未封装在id节点中,我认为它们都在tag节点中,位于root之下。好的,第1部分旨在获得id s及其相应data的词典:

>>> root = etree.fromstring(source)
>>> for tag in root.findall('tag'):
    id_ = tag.find('id')
    data = tag.find('data')
    id_dict[id_.text] = data.text


>>> id_dict
{'123456': 'blabla', 'abcde': 'gfkgjk'}

现在,感谢这个词典更新目标:

>>> root = etree.fromstring(target)
>>> for tag in root.findall('tag'):
    id_ = tag.find('id')
    data = tag.find('data')
    if data.text.strip() == '':
        data.text = id_dict[id_.text]


>>> print etree.tostring(root)
<root>
    <tag>
        <id>123456</id> 
        <data>blabla</data>
    </tag>
    <tag>
        <id>ghijk</id>
        <data>gfkgjk</data>
    </tag>
</root>

您必须使该解决方案适应您的真实XML结构,这应该是好的!