]>
Commit | Line | Data |
---|---|---|
1f780e48 RD |
1 | #---------------------------------------------------------------------------- |
2 | # Name: xmlprettyprinter.py | |
3 | # Purpose: | |
4 | # | |
5 | # Author: John Spurling | |
6 | # | |
7 | # Created: 9/21/04 | |
8 | # CVS-ID: $Id$ | |
9 | # Copyright: (c) 2004-2005 ActiveGrid, Inc. | |
10 | # License: wxWindows License | |
11 | #---------------------------------------------------------------------------- | |
2eeaec19 | 12 | from activegrid.util.lang import * |
02b800ce RD |
13 | ifDefPy() |
14 | import xml.sax | |
15 | endIfDef() | |
1f780e48 RD |
16 | |
17 | class XMLPrettyPrinter(xml.sax.ContentHandler): | |
18 | def __init__(self, indentationChar=' ', newlineChar='\n'): | |
19 | self.xmlOutput = '' | |
20 | self.indentationLevel = 0 | |
21 | self.indentationChar = indentationChar | |
22 | self.elementStack = [] | |
23 | self.newlineChar = newlineChar | |
24 | self.hitCharData = False | |
25 | ||
26 | ## ContentHandler methods | |
27 | def startElement(self, name, attrs): | |
2eeaec19 | 28 | indentation = self.newlineChar + (self.indentationChar * self.indentationLevel) |
1f780e48 RD |
29 | # build attribute string |
30 | attrstring = '' | |
31 | for attr in attrs.getNames(): | |
32 | value = attrs[attr] | |
33 | attrstring += ' %s="%s"' % (attr, value) | |
34 | self.xmlOutput += '%s<%s%s>' % (indentation, name, attrstring) | |
35 | self.indentationLevel += 1 | |
36 | self.elementStack.append(name) | |
37 | self.hitCharData = False | |
38 | ||
39 | def characters(self, content): | |
2eeaec19 | 40 | ## print "--> characters(%s)" % content |
1f780e48 RD |
41 | self.xmlOutput += content |
42 | self.hitCharData = True | |
43 | ||
44 | def endElement(self, name): | |
45 | self.indentationLevel -= 1 | |
46 | indentation = '' | |
47 | if not self.hitCharData: | |
2eeaec19 RD |
48 | indentation += self.newlineChar + (self.indentationChar * self.indentationLevel) |
49 | ## indentation += self.indentationChar * self.indentationLevel | |
1f780e48 RD |
50 | else: |
51 | self.hitCharData = False | |
2eeaec19 RD |
52 | ## self.xmlOutput += '%s</%s>%s' % (indentation, self.elementStack.pop(), self.newlineChar) |
53 | self.xmlOutput += '%s</%s>' % (indentation, self.elementStack.pop()) | |
1f780e48 RD |
54 | |
55 | def getXMLString(self): | |
56 | return self.xmlOutput[1:] | |
57 | ||
58 | def xmlprettyprint(xmlstr, spaces=4): | |
59 | xpp = XMLPrettyPrinter(indentationChar=' ' * spaces) | |
60 | xml.sax.parseString(xmlstr, xpp) | |
61 | return xpp.getXMLString() | |
62 | ||
2eeaec19 | 63 | if isMain(__name__): |
1f780e48 | 64 | simpleTestString = """<one>some text<two anattr="booga">two's data</two></one>""" |
2eeaec19 | 65 | print xmlprettyprint(simpleTestString) |
1f780e48 | 66 |