Python xml.dom.minidom Unicode问题
我正在尝试在Python中创建一个xml文档,但我用的一些字符串是用unicode编码的。请问有没有办法使用xml.dom.minidom来创建一个文本节点,使用这些unicode字符串?或者有没有其他的模块可以使用?
谢谢。
3 个回答
DOM对象似乎有一个编码参数,具体可以查看Python文档中的20.7.1部分。记得也要看看脚注;要注意使用正确的编码字符串。
有没有办法用xml.dom.minidom创建一个文本节点,并使用unicode字符串呢?
当然可以,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!
理论上,根据文档的说法:
推荐中定义的DOMString会被映射成Python的字符串或Unicode字符串。应用程序应该能够处理从DOM返回的任何字符串都是Unicode的。
所以你可以放心使用Unicode字符串或者Python字符串(在XML中,utf-8是默认编码)。
不过在实际使用中,在Python 2里,我有时候会遇到使用Unicode字符串时在xml.dom中出现的问题(我几乎完全转向使用ElementTree,所以不太确定最近的Python 2版本中这些问题是否依然存在)。
如果你在直接使用Unicode字符串时遇到问题,我建议你试试编码后的字符串,比如说,thedoc.createTextNode(u'pié'.encode('utf-8'))
。
在Python 3中,当然,str
类型就是Unicode字符串,所以在这方面一切都比较不同;-)。