我想在python中创建一个xml文档,但是我正在使用的一些字符串以unicode编码。有没有办法使用unicode字符串使用xml.dom.minidom创建文本节点?有我可以使用的另一个模块吗?Python xml.dom.minidom Unicode
谢谢。
我想在python中创建一个xml文档,但是我正在使用的一些字符串以unicode编码。有没有办法使用unicode字符串使用xml.dom.minidom创建文本节点?有我可以使用的另一个模块吗?Python xml.dom.minidom Unicode
谢谢。
在理论上,每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,所以在这方面一切都有所不同;-)。
有没有办法使用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!
正是我想要的。谢谢! – Jordan 2009-10-23 11:59:20
??这正是你不能做的。 DOM中的文本节点数据被定义为Unicode。传递一个字节字符串会导致错误的信息集,这会在以后的处理中给你UnicodeErrors。 – bobince 2009-10-23 12:35:56
@bobince,理论上你是完全正确的,在实践中,我有时会设法与str一起工作,在unicode中失败(文档说它要么!) - 扩大我的答案澄清。 – 2009-10-23 15:09:01