我正在尝试在python中创建一个xml文档,但是我正在使用的一些字符串是用unicode编码的。有没有办法使用unicode字符串使用xml.dom.minidom创建文本节点?我可以使用另一个模块吗?
感谢。
答案 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!