Ich verwende das minidom Modul, um XML-Dokumente aus meinen Daten zu erstellen.Python xml.dom.minidom - Bitte nicht entkommen meine Strings
Im Moment bin ich kämpfen einige pythonic Weg zu finden minidom entweicht meinen Strings ich da ..
Ursache allen Übels ist das (auf im Modul 302 Linie) _write_data
Verfahren setzen zu verhindern:
def _write_data(writer, data):
"Writes datachars to writer."
if data:
data = data.replace("&", "&").replace("<", "<"). \
replace("\"", """).replace(">", ">")
writer.write(data)
Alles, was ich will, ist die data
ohne diese replace
gen.
fand ich einige Möglichkeit, dies durch monkeypathing zwei Funktionen zu verhindern:
writexml
des Elternknotens- und innerhalb dieses Patch:
_write_data
Ich habe einige Beispiele vorbereitet:
<?xml version="1.0" ?>
<root>
<evil>&#x2603;&#xfe0e;</evil>
<good>☃︎</good>
</root>
<?xml version="1.0" ?>
<root>
<evil>&#x2603;&#xfe0e;</evil>
<good>&#x2603;&#xfe0e;</good>
</root>
Ich persönlich glaube nicht, dass dies eine gute Code, wie es mit den Interna von verunstaltet um minidom
:
from xml.dom import minidom
SNOWMAN = '☃︎'
imp = minidom.getDOMImplementation()
dom = imp.createDocument(None, 'root', None)
root = dom.documentElement
evil = dom.createElement('evil')
root.appendChild(evil)
# this does unwanted double escaping:
evil.appendChild(dom.createTextNode(SNOWMAN))
# now for something completely different ...
# this is some way to fix this:
good = dom.createElement('good')
root.appendChild(good)
# - store original ``writexml`` and ``_write_data``
original_writexml = good.writexml
original_write_data = minidom._write_data
def fake_writexml(writer, indent, addindent, newl):
def fake_writedata(writer, data):
if data:
writer.write(data)
# - overwrite ``_write_data``
minidom._write_data = fake_writedata
# - call original ``writexml``
# -> which itself calls the now patched ``_write_data``
original_writexml(writer, indent, addindent, newl)
# - reset ``_write_data`` again
minidom._write_data = original_write_data
# - overwrite ``writexml``
good.writexml = fake_writexml
# - do stuff
good.appendChild(dom.createTextNode(SNOWMAN))
# -> yay, it works!
print(dom.toprettyxml(indent=' '))
# - reset ``writexml`` again
good.writexml = original_writexml
# -> returns trash again..
print(dom.toprettyxml(indent=' '))
Es diese Ausgabe erzeugen wird und du musst aufpassen, dass du keine Fehler machst.
Bitte zeigen Sie mir die pythonic Lösung für dieses Problem, das Sie mit oben kommen können - so kann ich endlich das
& # x2603 ;-) Snowmans genießen; & # xfe0e;