2009-10-23 86 views
1

我想在python中创建一个xml文档,但是我正在使用的一些字符串以unicode编码。有没有办法使用unicode字符串使用xml.dom.minidom创建文本节点?有我可以使用的另一个模块吗?Python xml.dom.minidom Unicode

谢谢。

回答

3

在理论上,每the docs

的DOMString在 建议定义映射到一个Python 字符串或Unicode字符串。每当从 DOM返回字符串时,应用程序 应该能够处理Unicode 。

所以你应该罚款一个Unicode字符串或Python字符串(utf-8是XML中的默认编码)。

实际上,在Python 2中,我有时在xml.dom中有Unicode字符串的问题(我几乎完全从它切换到ElementTree,所以我不积极地认为问题是肯定的在最近的Python 2版本中仍然存在)。

如果您确实遇到直接使用Unicode字符串的问题,我想您应该尝试使用编码字符串,例如thedoc.createTextNode(u'pié'.encode('utf-8'))

在Python 3中,当然,str是Unicode,所以在这方面一切都有所不同;-)。

+0

正是我想要的。谢谢! – Jordan 2009-10-23 11:59:20

+0

??这正是你不能做的。 DOM中的文本节点数据被定义为Unicode。传递一个字节字符串会导致错误的信息集,这会在以后的处理中给你UnicodeErrors。 – bobince 2009-10-23 12:35:56

+0

@bobince,理论上你是完全正确的,在实践中,我有时会设法与str一起工作,在unicode中失败(文档说它要么!) - 扩大我的答案澄清。 – 2009-10-23 15:09:01

1

dom对象似乎有一个编码参数,请参阅Python文档的20.7.1。阅读脚注;请注意使用正确的编码字符串。

+0

我不知道这将为我工作。我需要实际创建一个dom对象(使用createTextNode(string)),但如果字符串是unicode,则会失败。 20.7.1似乎允许我从节点创建unicode字符串,但不能从unicode字符串创建节点。有另一种方法吗?或者,我只是误解了文档? – Jordan 2009-10-23 02:26:59

1

有没有办法使用unicode字符串使用xml.dom.minidom创建文本节点?

是的,createTextNode 总是需要Unicode字符串。在XML信息集的文本模式是Unicode,因为你可以看到:

>>> doc= minidom.parseString('<a>b</a>') 
>>> doc.documentElement.firstChild.data 
u'b' 

所以:

>>> doc.createTextNode(u'Hell\xF6') # OK 
<DOM Text node "u'Hell\xf6'"> 

minidom命名确实让你把非Unicode字符串在DOM,但如果这样做它们包含非ASCII字符,你会以后栽跟头:

>>> doc.documentElement.appendChild(doc.createTextNode('Hell\xF6')) # Wrong, not Unicode string 
<DOM Text node "'Hell\xF6'"> 

>>> doc.toxml() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/xml/dom/minidom.py", line 45, in toxml 
    return self.toprettyxml("", "", encoding) 
    File "/usr/lib/python2.6/xml/dom/minidom.py", line 60, in toprettyxml 
    return writer.getvalue() 
    File "/usr/lib/python2.6/StringIO.py", line 270, in getvalue 
    self.buf += ''.join(self.buflist) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) 

这是假设,通过“以Unicode编码的”你的意思是你正在使用Unicode字符串。如果你的意思是别的东西,就像你在一个UTF-8编码得到字节串,就需要你把他们在DOM之前,这些字节字符串转换为Unicode字符串:

>>> b= 'Hell\xc3\xb6' # Hellö encoded in UTF-8 bytes 
>>> u= b.decode('utf-8') # Proper Unicode string Hellö 
>>> doc.documentElement.appendChild(doc.createTextNode(u)) 
>>> doc.toxml() 
u'<?xml version="1.0" ?><a>bHell\xf6</a>' # correct!