minidomモジュールを使用して、自分のデータからXML文書を作成しています。Python xml.dom.minidom - 文字列をエスケープしないでください
私はそこに入れて、私の文字列をエスケープからminidomを防ぐためにいくつかの神託の方法を見つけるのに苦労しています現時点では..すべての悪の
原因は、(モジュール内のライン302上の)_write_data
メソッドです。
def _write_data(writer, data):
"Writes datachars to writer."
if data:
data = data.replace("&", "&").replace("<", "<"). \
replace("\"", """).replace(">", ">")
writer.write(data)
私が欲しいのは、これらのreplace
メントなしdata
です。親ノード
writexml
:
私は2つの機能をmonkeypathingことにより、これを防ぐためにいくつかの方法を見つけた
_write_data
minidom
の内部と周り台無しとして個人的に <?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>
は、私は、これは良いコードであるとは思わない:それは、この出力を生成します
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=' '))
:
私はいくつかの例を用意しましたあなたは間違いをしないように気をつけなければなりません。
私にあなたが思い付くことができ、その問題に最も神託のソリューションをご提示ください - ので、私は最終的にSnowmans ;-)
&#x2603を楽しむことができます;&#のxfe0e。
は、ノードの新しいタイプを定義することはできません: