Есть ли способ создать текстовый узел, используя 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 позволяет вам помещать не-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, вам нужно преобразовать эти байтовые строки в строки Unicode, прежде чем поместить их в DOM:
>>> 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!