3

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

例如

源文件:

  <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 来解析文件并希望在不导入和安装的情况下使用它更多的图书馆。

4

2 回答 2

2

为此,您需要使用 XML 解析器。看看ElementTree

不要在这里使用正则表达式或字符串替换

于 2012-07-13T13:41:09.973 回答
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一个中,它位于 a 下的某个地方root。好的,第一部分旨在获取ids 的字典及其对应的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 结构,这应该很好!

于 2012-07-13T14:08:15.803 回答