Scrivere XML da Python: equivalente di Python di .NET XmlTextWriter?
-
06-07-2019 - |
Domanda
Ho del codice IronPython che fa uso di XmlTextWriter che mi permette di scrivere codice come
self.writer = System.Xml.XmlTextWriter(filename, None)
self.writer.Formatting = Formatting.Indented
self.writer.WriteStartElement(name)
self.writer.WriteString(str(text))
self.writer.WriteEndElement()
...
self.writer.Close()
Vorrei rendere il mio codice portatile attraverso le implementazioni di Python (CPython, IronPython e Jython). Esiste un masterizzatore Python XML in streaming che posso utilizzare per questo senza la necessità di utilizzare le istruzioni di stampa o di costruire un intero albero DOM prima di scriverlo in un file?
Soluzione
Ho scritto un modulo chiamato loxun per fare proprio questo: http://pypi.python.org / PyPI / loxun / . Funziona con CPython 2.5 e Jython 2.5, ma non l'ho mai provato con IronPython.
Esempio di utilizzo:
with open("...", "wb") as out:
xml = XmlWriter(out)
xml.addNamespace("xhtml", "http://www.w3.org/1999/xhtml")
xml.startTag("xhtml:html")
xml.startTag("xhtml:body")
xml.text("Hello world!")
xml.tag("xhtml:img", {"src": "smile.png", "alt": ":-)"})
xml.endTag()
xml.endTag()
xml.close()
E il risultato:
<?xml version="1.0" encoding="utf-8"?>
<xhtml:html xlmns:xhtml="http://www.w3.org/1999/xhtml">
<xhtml:body>
Hello world!
<xhtml:img alt=":-)" src="smile.png" />
</xhtml:body>
</xhtml:html>
Tra le altre funzionalità, rileva i tag non allineati durante la scrittura, utilizza un'API di streaming con un ingombro di memoria ridotto, supporta Unicode e consente di disabilitare la stampa piuttosto.
Altri suggerimenti
Non ho mai usato l'implementazione .NET di cui stai parlando, ma sembra che il più vicino che otterrai sarà Python's parser SAX (in particolare, XMLGenerator class - codice di esempio qui ).