minidom 모듈을 사용하여 데이터에서 XML 문서를 만듭니다. 내가 거기에 넣어 내 문자열을 탈출 minidom을 방지하기 위해 몇 가지 파이썬 방법을 찾기 위해 사투를 벌인거야 순간 Python xml.dom.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
하고 패치 내 :_write_data
나는 두 가지 기능을 monkeypathing하여이를 방지 할 수있는 방법을 발견이 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=' '))
: 1,363,210
나는 몇 가지 예제를 준비했습니다 , 실수를하지 않도록주의해야합니다.
나에게 당신이 가지고 올 수있는 문제에 대한 가장 파이썬 솔루션을 제시해주십시오 - 그래서 마침내 Snowmans ;-)
& # x2603을 즐길 수 있습니다; & #의 xfe0e;
가이 노드의 새로운 유형을 정의 할 수 없습니다 :