Python xml.dom.minidom Unicode

时间:2009-10-23 01:27:07

标签: python unicode

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

感谢。

3 个答案:

答案 0 :(得分:3)

理论上,按the docs

  

中定义的DOMString   推荐被映射到Python   字符串或Unicode字符串。应用   应该能够处理Unicode   每当从...返回一个字符串   DOM。

所以你可以使用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,所以在这方面一切都不同; - )。

答案 1 :(得分:1)

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

答案 2 :(得分: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确实允许你在DOM中放入非Unicode字符串,但是如果你这样做并且它们包含非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!