2009-06-06 63 views
0

我想以一種可以回讀的方式將一些數據序列化到xml。我正在通過xml.dom.minidom手動構建DOM並使用包含的writexml方法將其寫入文件來完成此操作。如何確保xml.dom.minidom可以解析自己的輸出?

特別感興趣的是我如何構建文本節點。我通過初始化一個Text對象然後設置它的數據屬性來做到這一點。我不確定爲什麼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解析文檔來恢復原始樹?

回答

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>' 
>>>