如果我的标题听起来令人困惑,我很抱歉。 我正在编写一个比较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来解析文件,并且希望不使用它导入和安装更多的库。
答案 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结构,这应该是好的!