import threading import StringIO from lxml import etree from path import path NS_MAP = {'svg': "http://www.w3.org/2000/svg", 'inkscape': "http://www.inkscape.org/namespaces/inkscape"} # thread safe parser storage class ParserTLS(threading.local): def getParser(self): parser = getattr(self, "parser", None) if parser is not None: return parser self.parser = parser = etree.XMLParser() return parser parsel_tls = ParserTLS() def TreeToString(tree, pretty=False, encoding=None, method="xml"): return etree.tostring(tree, pretty_print=pretty, encoding=encoding, method=method) def TreeToFile(tree, fname, encoding='utf-8'): tree.write(fname, encoding=encoding, xml_declaration=True, method="xml") def FileToTree(fname): return etree.parse(fname, parsel_tls.getParser()) def StringToTree(s): if not s: raise ValueError("Empty or invalid string %r (%s)'" % (s, type(s))) return etree.parse(StringIO.StringIO(s), parsel_tls.getParser()) def subelement(destEl, tag, pos=None, attribs=None): e = etree.SubElement(destEl, tag) if pos is not None: e.getparent().insert(pos, e) if attribs is not None: e.attrib.update(dict(((k, unicode(v)) for k, v in attribs.items()))) return e prettyXSL = """ """ def prettyPrint(data): ''' pretty-print data - can be a: * xml string * list of etree.elements (return single pretty-prints that will be \n concatenated) * single etree or single element ''' xslt_doc = etree.fromstring(prettyXSL) transform = etree.XSLT(xslt_doc) if isinstance(data, basestring): doc = etree.fromstring(data) return etree.tostring(transform(doc)) elif isinstance(data, (tuple, list)): #assume data is list of etree.elements return '\n'.join(etree.tostring(transform(e)) for e in data) else: return etree.tostring(transform(data))