我正在尝试以一种可以回读的方式将一些数据序列化为xml。我这样做是通过xml.dom.minidom手动构建DOM,并使用包含的writexml方法将其写入文件。
特别感兴趣的是我如何构建文本节点。我这样做是通过初始化Text对象然后设置其data属性。我不确定Text对象为什么不在构造函数中获取其内容,但这只是在xml.dom.minidom中进行简化的方式。
举一个具体的例子,代码看起来像这样:
import xml.dom.minidom as dom
e = dom.Element('node')
t = dom.Text()
t.data = "The text content"
e.appendChild(t)
dom.parseString(e.toxml())
这对我来说似乎很合理,特别是因为createTextNode本身的实现完全如下:
def createTextNode(self, data):
if not isinstance(data, StringTypes):
raise TypeError, "node contents must be a string"
t = Text()
t.data = data
t.ownerDocument = self
return t
问题是设置这样的数据允许我们编写以后无法解析的文本。举个例子,我对以下角色有困难:
you´ll
引用是ord(180),'\ xb4'。我的问题是,将这些数据编码到xml文档中的正确程序是什么,我用minidom解析文档以恢复原始树?
答案 0 :(得分:3)
您遇到的问题,如Python的online docs中所述,是Unicode编码的问题:
Node.toxml([encoding])
Return the XML that the DOM represents as a string.
With no argument, the XML header does not specify an encoding, and the result is
Unicode string if the default encoding cannot represent all characters in the
document. Encoding this string in an encoding other than UTF-8 is likely
incorrect, since UTF-8 is the default encoding of XML.
With an explicit encoding [1] argument, the result is a byte string in the
specified encoding. It is recommended that this argument is always specified.
To avoid UnicodeError exceptions in case of unrepresentable text data, the
encoding argument should be specified as “utf-8”.
所以,调用.toxml('utf8')
,而不只是.toxml()
,并使用unicode字符串作为文本内容,你应该可以根据需要进行“往返”。例如:
>>> t.data = u"The text\u0180content"
>>> dom.parseString(e.toxml('utf8')).toxml('utf8')
'<?xml version="1.0" encoding="utf8"?><node>The text\xc6\x80content</node>'
>>>