Original Post
Using python 2.5, with xml.dom.minidom My output is:
<?xml version="1.0" ?>
<Log>
<msg>
game start!
</msg>
<msg>
game end.
</msg>
</Log> I want indentation, but I don't want whitespace inbetween the text of elements. Like this output:<?xml version="1.0" ?>
<Log>
<msg>game start!</msg>
<msg>game end.</msg>
</Log> This is my code:from xml.dom.minidom import getDOMImplementation
class LoggerXML():
"""A XML logger"""
def __init__(self, filename, root_element ):
self.filename = os.path.join('logs', filename)
impl = getDOMImplementation()
doc = self.doc = impl.createDocument(None, root_element, None)
self.root = doc.documentElement
def log(self, msg):
"""Log message. same as .add_element(); set_text()"""
text = self.set_text( self.add_element(self.root, 'msg'), msg )
def add_element(self, parent, element_name):
"""creates new 'element' as child of 'parent'"""
if parent==None: parent = self.root
element = self.doc.createElement(element_name)
parent.appendChild( element )
return element
def set_text(self, parent, text):
"""set text; merge text element;"""
self.add_text( parent, text )
self.element_normalize( parent )
def get_text(self, parent):
"""get text value / child of the parent node"""
if parent.childNodes: return str( parent.childNodes[0].nodeValue )
return None # bad element / no text
def add_text(self, parent, text):
"""adds a text element to parent."""
text_node = self.doc.createTextNode( str(text) )
parent.appendChild( text_node )
return parent # i'm returning parent because its more usefull than text_node
def element_normalize( self, element ):
"""will merge all text elements into one element"""
element.normalize()
def writexml(self, indent='', addindent=' ', newl='\n'):
"""write file to .filename. [indent,[addindent[,newl]]]"""
file = open( self.filename, "w" )
self.doc.writexml( file, indent, addindent, newl ) # self.doc.writexml( self.filename )
if __name__ == '__main__':
l = LoggerXML("log.xml", "Log")
l.log("game start!")
l.log("game end.")
l.writexml()