Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中合并两个XML文件_Python_Xml_Merge_Elementtree - Fatal编程技术网

在Python中合并两个XML文件

在Python中合并两个XML文件,python,xml,merge,elementtree,Python,Xml,Merge,Elementtree,我有两个如下所示的XML文件- XML1 打印>>输出,r是python吗?@Elisha是的。它也可能被用在其他语言中,我不知道,但它暂时满足了我写文件的目的。一旦获得所需的输出,我以后可能会将其更改为更具python风格的方式。@abn我建议现在更改它。@Iplodman这会有什么不同,因为它提供与print语句相同的输出,而不写入文件?我只是好奇。无意冒犯。@abn当然不是,但这是个好习惯。最好早点开始;P <root> <info> <

我有两个如下所示的XML文件- XML1


打印>>输出,r
是python吗?@Elisha是的。它也可能被用在其他语言中,我不知道,但它暂时满足了我写文件的目的。一旦获得所需的输出,我以后可能会将其更改为更具python风格的方式。@abn我建议现在更改它。@Iplodman这会有什么不同,因为它提供与print语句相同的输出,而不写入文件?我只是好奇。无意冒犯。@abn当然不是,但这是个好习惯。最好早点开始;P
<root>
    <info>
        <order>2</order>
        <infoID>Information</infoID>
        <child>
            <info>
                <order>1</order>
                <infoID>AAAAA</infoID>
            </info>
            <info>
                <order>2</order>
                <infoID>BBBBB</infoID>
            </info>
            <info>
                <order>3</order>
                <infoID>CCC</infoID>
            </info>
            <info>
                <order>4</order>
                <infoID>DD</infoID>
            </info>
            <info>
                <order>5</order>
                <infoID>EEEEE</infoID>
            </info>
        </child>
    </info>
</root>
<root>
    <Name>XYZ</Name>
    <ID>1234</ID>
    <Data>
        <info>
            <desc>Data1</desc>
            <displayName>dID</displayName>
            <infoID>AAAAA</infoID>
            <type>String</type>
        </info>
        <info>
            <desc>Data2</desc>
            <displayName>sID/displayName>
            <infoID>BBBBB</infoID>
            <type>String</type>
        </info>
    </Data>
</root>
<root>
    <Name>XYZ</Name>
    <ID>1234</ID>
    <Data>
        <info>
            <order>2</order>
            <infoID>Information</infoID>
            <child>
                <info>
                    <order>1</order>
                    <infoID>AAAAA</infoID>
                    <desc>Data1</desc>
                    <displayName>dID</displayName>
                    <type>String</type>
                </info>
                <info>
                    <order>2</order>
                    <infoID>BBBBB</infoID>
                    <desc>Data2</desc>
                    <displayName>sID/displayName>
                    <type>String</type>
                </info>
                <info>
                    <order>3</order>
                    <infoID>CCC</infoID>
                </info>
                <info>
                    <order>4</order>
                    <infoID>DD</infoID>
                </info>
                <info>
                    <order>5</order>
                    <infoID>EEEEE</infoID>
                </info>
            </child>
        </info>
</root>
from xml.etree import ElementTree as et
out = open ("combined.xml", "wb")
class XMLCombiner(object):
    def __init__(self, filenames):
        assert len(filenames) > 0, 'No filenames!'
        self.roots = [et.parse(f).getroot() for f in filenames]

    def combine(self):
        for r in self.roots[1:]:
            self.combine_element(self.roots[0], r)
        return et.tostring(self.roots[0])

    def combine_element(self, one, other):
        one.attrib.update(other.attrib)
        mapping = {el.tag: el for el in one}
        for el in other:
            if len(el) == 0:
                try:
                    mapping[el.tag].text = el.text
                except KeyError:
                    mapping[el.tag] = el
                    one.append(el)
            else:
                try:
                    self.combine_element(mapping[el.tag], el)
                except KeyError:
                    mapping[el.tag] = el
                    one.append(el)

if __name__ == '__main__':
    r = XMLCombiner(('XML1.xml', 'XML2.xml')).combine()
    print >> out, r