Hello, I want to create some XML files, following a simple template. For that purpose, I created a simple interface to minidom. This is simple code, but as I spend a little time for understanding how minidom was working, I thought that this may be useful for someone (not that minidom is complex, but even if simplified from the full XML implementation, it still possesses too many functions for what I simply wanted to do).
What you have to do is just to import the class doc, and then: In [258]: xml=doc("toto") In [259]: xml["part1"]=None In [260]: xml["part1"]["1.1"]="coucou" In [261]: xml["part1"]["1.2"]="toto" In [262]: xml["part1"]["1.2"]["1.2.1"]="a" In [263]: xml["part1"]["1.2"]["1.2.2"]="b" In [264]: xml["part2"]="That's all folks!" In [265]: xml["part1"]["1.2"]["1.2.2"]="really b" In [266]: xml["part1"]["cdata"]="This is\nMore complex data\n:-p\n" In [267]: xml.write("test.xml") is sufficient to obtain the following file: <?xml version="1.0" ?> <toto> <part1> <1.1> coucou </1.1> <1.2> toto <1.2.1> a </1.2.1> <1.2.2> really b </1.2.2> </1.2> <![CDATA[This is More complex data :-p ]]> </part1> <part2> That's all folks! </part2> </toto> This piece of code is way too small for being considered as a real package, but it may help someone. Thus, I am just posting it here so that it doesn't get lost. Please feel free to use it and extend it as will (I put a GPL licence in that purpose). If you have some comments/suggestion about this code, I would also be happy to discuss about it :). Raphaël Here is the code: 8x----------------------------------------------------------------------- x8 # Copyright 2010 Raphael Plasson, rplasson_at_gmail_dot_com # # 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 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/ >. from xml.dom.minidom import Document class node: def __init__(self,name,parent,doc): '''Add a node called <name> to the document <doc> inside the node <parent>''' self.name=name self.parent=parent self.doc=doc self.element=self.doc.createElement(self.name) self.parent.element.appendChild(self.element) self.children={} def __getitem__(self,key): return self.children[key] def __setitem__(self,key,val): if key=="text": self.set_text(val) elif key=="cdata": self.set_cdata(val) else: tmp=self.set_node(key) if val != None: tmp.set_text(val) def __repr__(self): tmp=self.name+" : " for i in self.children: tmp += i+", " return tmp def __newchild(self,child,name): self.children[name] = child def set_node(self,name): '''Add a node <name>. If a node with the same name already exists, it is simply returned.''' if self.children.has_key(name): return self.children[name] else: tmp=node(name,self,self.doc) self.__newchild(tmp,name) return tmp def set_text(self,text): '''Add or update the node text <text>''' if self.children.has_key("text"): self.children["text"].data=text else: tmp=self.doc.createTextNode(text) self.__newchild(tmp,"text") self.element.appendChild(tmp) def set_cdata(self,cdata): '''Add or update the node cdata <cdata>''' if self.children.has_key("cdata"): self.children["cdata"].data=cdata else: tmp=self.doc.createCDATASection(cdata) self.__newchild(tmp,"cdata") self.element.appendChild(tmp) self.element.appendChild(self.doc.createTextNode("")) # dirty hack for adding newline after CDATA in file def set_attr(self,attr,val): '''Add or set the attribute <attr> to <val>''' self.element.setAttribute(attr,val) def comment(self,comm): '''Add the comment <comm>''' self.element.appendChild(self.doc.createComment(comm)) class doc(node): def __init__(self,name): ''' Create an xml document, with root node <name>''' self.name=name self.parent=None self.doc=Document() self.element=self.doc.createElement(self.name) self.doc.appendChild(self.element) self.children={} self.text="" def write(self,filename): ''' Write the xml document to <filename>''' out=file(filename,"w") self.doc.writexml(out, newl="\n", addindent=" ") out.close() 8x----------------------------------------------------------------------- x8 -- http://mail.python.org/mailman/listinfo/python-list