Python xml.dom.minidom是否生成无效的xml?

Python xml.dom.minidom是否生成无效的xml?,python,xml,minidom,Python,Xml,Minidom,我在xml.dom.minidom python包中遇到了一个奇怪的问题。我生成一个文档,用从终端获取的数据填充它。有时,此类数据包含终端控制字符。当我使用minidom.toprettyxml()将这样的字符存储在文本数据节点中时,一切似乎都正常,但是,生成的文档不是有效的XML 有人知道为什么minidom允许生成无效文档吗?这和“迷你”部分有关吗 以下是提取的示例代码(也有一些系统信息): Python 2.6.5(r265:79063,2010年4月16日,13:57:41) [GCC

我在xml.dom.minidom python包中遇到了一个奇怪的问题。我生成一个文档,用从终端获取的数据填充它。有时,此类数据包含终端控制字符。当我使用
minidom.toprettyxml()
将这样的字符存储在文本数据节点中时,一切似乎都正常,但是,生成的文档不是有效的XML

有人知道为什么minidom允许生成无效文档吗?这和“迷你”部分有关吗

以下是提取的示例代码(也有一些系统信息):

Python 2.6.5(r265:79063,2010年4月16日,13:57:41) [GCC 4.4.3]关于linux2 有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。 >>>从xml.dom导入minidom >>>impl=minidom.getdoImplementation() >>>doc=impl.createDocument(无,“结果”,无) >>>root=doc.firstChild >>>outString=“test”+chr(1)#这里是控制字符 >>>root.appendChild(doc.createTextNode(outString)) >>>doc.toprettyxml(encoding=“utf-8”) “\n\n\t测试\x01\n\n” >>>打开(“/tmp/outfile”,“w”)作为f: ... f、 写入(doc.toprettyxml(encoding=“utf-8”)) ... >>>doc2=minidom.parse(“/tmp/outfile”) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/usr/lib/python2.6/xml/dom/minidom.py”,第1918行,解析中 返回expatbuilder.parse(文件) 解析中的文件“/usr/lib/python2.6/xml/dom/expatbuilder.py”,第924行 结果=builder.parseFile(fp) 文件“/usr/lib/python2.6/xml/dom/expatbuilder.py”,第207行,在parseFile中 parser.Parse(缓冲区,0) xml.parsers.expat.expat错误:格式不正确(无效令牌):第3行第6列 >>>打开(“/tmp/outfile”,“r”).readlines() ['\n'、'\n'、'\t测试\x01\n'、'\n'] >>>
查看“写入”数据的代码,它只会转义符号、斜杠和括号:

def _write_data(writer, data):
    "Writes datachars to writer."
    data = data.replace("&", "&amp;").replace("<", "&lt;")
    data = data.replace("\"", "&quot;").replace(">", "&gt;")
    writer.write(data)
def_write_数据(写入器,数据):
“将数据字符写入写入器。”
数据=数据。替换(&),“&;”。替换(“,”)
writer.write(数据)

正如您所猜测的,minidom并不是一个完全健壮的实现(例如,它缺少名称空间的实现)。

尝试将文本移动到CDATA区域。有各种可能的解决方法,我甚至比CDATA更好,但问题是:为什么minidom生成无效的XML?这是一个bug还是一个特性?(可能与minidom的“光明”有关)
def _write_data(writer, data):
    "Writes datachars to writer."
    data = data.replace("&", "&amp;").replace("<", "&lt;")
    data = data.replace("\"", "&quot;").replace(">", "&gt;")
    writer.write(data)