繁体   English   中英

使用python 3解析xml文件

[英]parse xml files with python 3

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

扩展解决方案(不带<!-- 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM