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