2

xml.dom.minidom python パッケージで奇妙な問題が発生しました。ドキュメントを生成し、ターミナルから取得したデータを入力します。このようなデータには、端末制御文字が含まれている場合があります。このような文字をテキスト データ ノードに格納すると、minidom.toprettyxml()すべて問題ないように見えますが、生成されたドキュメントは有効な XML ではありません。

minidom が無効なドキュメントの生成を許可する理由を知っている人はいますか? これは「ミニ」部分とつながっていますか?

抽出されたサンプルコードは次のとおりです (システム情報もいくつかあります)。

Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.dom import minidom
>>> impl = minidom.getDOMImplementation()
>>> doc = impl.createDocument(None, "results", None)
>>> root = doc.firstChild
>>> outString = "test "+chr(1) #here goes control character
>>> root.appendChild(doc.createTextNode(outString))
<DOM Text node "'test \x01'">
>>> doc.toprettyxml(encoding="utf-8")
'<?xml version="1.0" encoding="utf-8"?>\n<results>\n\ttest \x01\n</results>\n'
>>> with open("/tmp/outfile", "w") as f:
...     f.write(doc.toprettyxml(encoding="utf-8"))
... 
>>> doc2 = minidom.parse("/tmp/outfile")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/xml/dom/minidom.py", line 1918, in parse
    return expatbuilder.parse(file)
  File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 924, in parse
    result = builder.parseFile(fp)
  File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 207, in parseFile
    parser.Parse(buffer, 0)
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 3, column 6
>>> open("/tmp/outfile","r").readlines()
['<?xml version="1.0" encoding="utf-8"?>\n', '<results>\n', '\ttest \x01\n', '</results>\n']
>>> 
4

1 に答える 1

1

_write_dataのコードを見ると、アンパサンド、スラッシュ、角かっこのみがエスケープされています。

def _write_data(writer, data):
    "Writes datachars to writer."
    data = data.replace("&", "&amp;").replace("<", "&lt;")
    data = data.replace("\"", "&quot;").replace(">", "&gt;")
    writer.write(data)

ご想像のとおり、minidomは完全に堅牢な実装として意図されたものではありません(たとえば、名前空間の実装が不足しています)。

于 2011-04-20T14:06:05.130 に答える