Python xml.dom.minidom Unicode问题

1 投票
3 回答
7045 浏览
提问于 2025-04-15 15:18

我正在尝试在Python中创建一个xml文档,但我用的一些字符串是用unicode编码的。请问有没有办法使用xml.dom.minidom来创建一个文本节点,使用这些unicode字符串?或者有没有其他的模块可以使用?

谢谢。

3 个回答

1

DOM对象似乎有一个编码参数,具体可以查看Python文档中的20.7.1部分。记得也要看看脚注;要注意使用正确的编码字符串。

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!
3

理论上,根据文档的说法:

推荐中定义的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字符串,所以在这方面一切都比较不同;-)。

撰写回答