0

I'm trying to merge two xml files in python with the following code. That I found in another thread: Merge xml files with nested elements without external libraries

import sys
from xml.etree import ElementTree as et


class hashabledict(dict):
    def __hash__(self):
        return hash(tuple(sorted(self.items())))


class XMLCombiner(object):
    def __init__(self, filenames):
        assert len(filenames) > 0, 'No filenames!'
        # save all the roots, in order, to be processed later
        self.roots = [et.parse(f).getroot() for f in filenames]

    def combine(self):
      for r in self.roots[1:]:
        # combine each element with the first one, and update that
        self.combine_element(self.roots[0], r)
    # return the string representation
      return et.ElementTree(self.roots[0])

    def combine_element(self, one, other):
    """
    This function recursively updates either the text or the children
    of an element if another element is found in `one`, or adds it
    from `other` if not found.
    """
    # Create a mapping from tag name to element, as that's what we are fltering with
    mapping = {(el.tag, hashabledict(el.attrib)): el for el in one}
    for el in other:
        if len(el) == 0:
            # Not nested
            try:
                # Update the text
                mapping[(el.tag, hashabledict(el.attrib))].text = el.text
            except KeyError:
                # An element with this name is not in the mapping
                mapping[(el.tag, hashabledict(el.attrib))] = el
                # Add it
                one.append(el)
        else:
            try:
                # Recursively process the element, and update it in the same way
                self.combine_element(mapping[(el.tag, hashabledict(el.attrib))], el)
            except KeyError:
                # Not in the mapping
                mapping[(el.tag, hashabledict(el.attrib))] = el
                # Just add it
                one.append(el)

if __name__ == '__main__':

  r = XMLCombiner(sys.argv[1:-1]).combine()
  print '-'*20
  print et.tostring(r.getroot())
  r.write(sys.argv[-1], encoding="iso-8859-1", xml_declaration=True)

The code works perfectly for merging two xml files, however I would also like to merge the comments I have in the files. I'm new at this and don't know how to not just merge the xml but also the comments I have in the files.

Community
  • 1
  • 1
  • Per [the docs](https://docs.python.org/3/library/xml.etree.elementtree.html#parsing-xml): *"**Note**: Not all elements of the XML input will end up as elements of the parsed tree. Currently, this module skips over any XML comments, processing instructions, and document type declarations in the input..."* You will have to try to find a parser that *does* include comments. – jonrsharpe May 13 '15 at 12:10
  • http://bugs.python.org/issue8277 – jezrael May 13 '15 at 12:15

0 Answers0