使用python 3解析xml文件

时间:2017-11-17 16:32:12

标签: python xml python-3.x xml-parsing

我们假设我有几个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()

1 个答案:

答案 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>