xmlindent (version 1.2)
index
/home/pjk/websrc/xmlindent.py

Generate indented XML.
 
An extension of the XMLGenerator class from the SAX interface which provides
features for generating indented XML. The method 'newline' in the extension
class XMLIndentGenerator outputs a newline character and the appropriate
number of blank characters for indentation of the next item.
 
Other features are:
- Attributes to the 'startElement' method are passed as keyword arguments.
- The extension class maintains an internal stack of current element tags,
  obviating the need to specify tag name in method 'endElement'. This
  simplifies XML generation slightly for application code.
- A number of common attribute keys are automatically translated from
  the form 'xxx_yyy' to 'xxx:yyy', to simplify giving attributes
  as keyword arguments.
- The class 'Xml' to build lightweight element trees for output with
  XMLIndentGenerator.
 
The prefix mapping and NS methods have not yet been properly implemented.
 
Example usage:
 
    from xmlindent import XMLIndentGenerator
    gen = XMLIndentGenerator()
    gen.startDocument()
    gen.startElement('root', attr1='1', attr2='text&data')
    gen.newline()
    gen.startElement('item')
    xml = Xml('another', Xml('and-another'), id='2', color='grey')
    xml.output(gen)
    gen.newline()
    gen.startElement('item2')
    gen.characters('stuff')
    gen.endElement()
    gen.newline()
    gen.endElement()
    gen.newline()
    gen.endElement()
    gen.endDocument()
 
This is the resulting XML:
 
<?xml version="1.0" encoding="iso-8859-1"?>
<root attr2="text&amp;data" attr1="1">
  <item>
    <another color="grey" id="2">
      <and-another/>
    </another>
    <item2>stuff</item2>
  </item>
</root>
 
------------------------------------------------------------
Version 1.2
 
2004-12-09  split out from other code
2007-08-23  cleanup, docs written
2007-08-31  added Xml
 
Copyright (C) 2007 Per Kraulis
 
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

 
Classes
       
__builtin__.object
Xml
xml.sax.saxutils.XMLGenerator(xml.sax.handler.ContentHandler)
XMLIndentGenerator

 
class XMLIndentGenerator(xml.sax.saxutils.XMLGenerator)
    This extension class provides features to generate indented XML.
Attributes to startElement are passed as keyword arguments.
It also maintains an internal stack of current element tags, thus
obviating the need to specify the element tag in endElement.
 
 
Method resolution order:
XMLIndentGenerator
xml.sax.saxutils.XMLGenerator
xml.sax.handler.ContentHandler

Methods defined here:
__init__(self, out=None, encoding='iso-8859-1', increment=2)
out        Opened output file; sys.stdout if None given.
encoding   Character encoding to use.
increment  Indentation increment to use.
characters(self, content)
Output the given character content.
comment(self, content)
Output an XML comment.
emptyElement(self, tagname, **attrs)
Output an element with no content, with appropriate indentation.
endCDATA(self)
Finish a CDATA block of characters.
endDocument(self)
Finish document output; checks that the element tag stack is empty.
endElement(self, tagname=None)
Finish the current element.
The tagname argument is not required and is in fact currently ignored,
since the internal element tagname stack is used.
newline(self, force=False)
Output a newline character. If force, then do so even if the
previous character was a newline.
startCDATA(self)
Start a CDATA block of characters. The application must finish
the CDATA block explicitly. There is currently no internal check
that this is done properly.
startElement(self, tagname, **attrs)
Start a new element, with appropriate indentation.

Class methods defined here:
translate_name_aliases(cls, **attrs) from __builtin__.classobj

Data and other attributes defined here:
attr_name_aliases = {'href_template': 'href-template', 'xlink_actuate': 'xlink:actuate', 'xlink_arcrole': 'xlink:arcrole', 'xlink_from': 'xlink:from', 'xlink_href': 'xlink:href', 'xlink_label': 'xlink:label', 'xlink_show': 'xlink:show', 'xlink_title': 'xlink:title', 'xlink_to': 'xlink:to', 'xlink_type': 'xlink:type', ...}

Methods inherited from xml.sax.saxutils.XMLGenerator:
endElementNS(self, name, qname)
endPrefixMapping(self, prefix)
ignorableWhitespace(self, content)
processingInstruction(self, target, data)
startDocument(self)
startElementNS(self, name, qname, attrs)
startPrefixMapping(self, prefix, uri)

Data and other attributes inherited from xml.sax.saxutils.XMLGenerator:
GENERATED_PREFIX = 'xml.sax.saxutils.prefix%s'

Methods inherited from xml.sax.handler.ContentHandler:
setDocumentLocator(self, locator)
Called by the parser to give the application a locator for
locating the origin of document events.
 
SAX parsers are strongly encouraged (though not absolutely
required) to supply a locator: if it does so, it must supply
the locator to the application by invoking this method before
invoking any of the other methods in the DocumentHandler
interface.
 
The locator allows the application to determine the end
position of any document-related event, even if the parser is
not reporting an error. Typically, the application will use
this information for reporting its own errors (such as
character content that does not match an application's
business rules). The information returned by the locator is
probably not sufficient for use with a search engine.
 
Note that the locator will return correct information only
during the invocation of the events in this interface. The
application should not attempt to use it at any other time.
skippedEntity(self, name)
Receive notification of a skipped entity.
 
The Parser will invoke this method once for each entity
skipped. Non-validating processors may skip entities if they
have not seen the declarations (because, for example, the
entity was declared in an external DTD subset). All processors
may skip external entities, depending on the values of the
http://xml.org/sax/features/external-general-entities and the
http://xml.org/sax/features/external-parameter-entities
properties.

 
class Xml(__builtin__.object)
    Lightweight XML element node, for output via XMLIndentGenerator.
 
  Methods defined here:
__init__(self, tagname, *nodes, **attrs)
tag    tagname of this element
nodes  Xml instances or strings that are the content of this element
attrs  attributes of this element
output(self, gen)
Output the contents of this Xml using the given generator.

Data and other attributes defined here:
__dict__ = <dictproxy object>
dictionary for instance variables (if defined)
__weakref__ = <attribute '__weakref__' of 'Xml' objects>
list of weak references to the object (if defined)

 
Data
        __version__ = '1.2'