我们假设我有几个xml文件。 假设第一个文件是基础,下一个文件是覆盖(比如更新基本文件)。 我想编写一个程序来获取文件列表(更新)并创建包含所有数据的最终xml。 我成功阅读了每个文件,但我不知道如何将它们组合在一起。
原始xml:
<Base>
<Module ID = "Module1"
Prop1 = "A"
Prop2 = "B"
Prop3 = "C"
/>
<!-- XML comment -->
<Module ID = "Module2"
Prop1 = "D"
Prop2 = "E"
Prop3 = "F"
/>
</Base>
更新:
<!-- XML comment -->
<Override>
<Module ID = "Module1"
Prop2 = "B_ov"
Prop4 = "ZZ"
/>
<!-- XML comment -->
<Module ID = "Module2"
Prop1 = "D_ov"
Prop5 = "F"
/>
</Override>
最终的xml文件应如下所示:
<!-- XML comment -->
<final>
<Module ID = "Module1"
Prop1 = "A"
Prop2 = "B_ov"
Prop3 = "C"
Prop4 = "ZZ"
/>
<!-- XML comment -->
<Module ID = "Module2"
Prop1 = "D_ov"
Prop2 = "E"
Prop3 = "F"
Prop5 = "F"
/>
</final>
代码:
from argparse import ArgumentParser
from xml.etree import ElementTree
def main():
parser = ArgumentParser()
parser.add_argument('xml', nargs='+')
a=parse_xml("Base.xml")
print (a)
b= parse_xml("Override.xml")
print (b)
def parse_xml(path):
return {m.attrib.pop('ID'): m.attrib for m in ElementTree.parse(path).findall('Module')}
if __name__ == '__main__':
main()
答案 0 :(得分:0)
扩展解决方案(没有<!-- XML comment -->
项目):
import xml.etree.ElementTree as ET
base_tree = ET.parse('Base.xml')
base_root = base_tree.getroot()
override = ET.parse('Override.xml').getroot()
base_root.tag = 'final' # set new `root` tag
for m in base_root.findall('Module[@ID]'):
# finding the `overridden` Module element with respective `ID`
repl_el = override.find('Module[@ID="{}"]'.format(m.get('ID')))
base_attrs = dict(m.items())
base_attrs.update(repl_el.items())
for k,v in base_attrs.items():
m.set(k, v)
print(base_tree.write('output.xml', encoding='unicode'))
最终output.xml
内容:
<final>
<Module ID="Module1" Prop1="A" Prop2="B_ov" Prop3="C" Prop4="ZZ" />
<Module ID="Module2" Prop1="D_ov" Prop2="E" Prop3="F" Prop5="F" />
</final>