Transforming an XML Document Using Python
Credit: David Ascher
Problem
You have an XML document that you want to tweak.
Solution
Suppose that you want to convert element attributes into child
elements. A simple subclass of the
XMLGenerator object gives you complete freedom in such
XML-to-XML transformation tasks:
from xml.sax import saxutils, make_parser
import sys
class Tweak(saxutils.XMLGenerator):
def startElement(self, name, attrs):
saxutils.XMLGenerator.startElement(self, name, {})
attributes = attrs.keys( )
attributes.sort( )
for attribute in attributes:
self._out.write("<%s>%s</%s>" % (attribute,
attrs[attribute], attribute))
parser = make_parser( )
dh = Tweak(sys.stdout)
parser.setContentHandler(dh)
parser.parse(sys.argv[1])Discussion
This particular recipe defines a Tweak subclass of
the XMLGenerator class provided by the
xml.sax.saxutils module. The only purpose of the
subclass is to perform special handling of element starts while
relying on its base class to do everything else. SAX is a nice and
simple (after all, that’s what the S stands for) API
for processing XML documents. It defines various kinds of events that
occur when an XML document is being processed, such as
startElement and endElement.
The key to understanding this recipe is to understand that
Python’s XML library provides a base class,
XMLGenerator, which performs an identity transform. If you feed it an XML document, it will output an equivalent XML document. Using standard Python object-oriented techniques ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access