Python xml.dom.minidom Unicode - PullRequest
       17

Python xml.dom.minidom Unicode

1 голос
/ 23 октября 2009

Я пытаюсь создать XML-документ на Python, однако некоторые строки, с которыми я работаю, кодируются в Unicode. Есть ли способ создать текстовый узел, используя xml.dom.minidom, используя строки Unicode? Есть ли другой модуль, который я могу использовать?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 23 октября 2009

Теоретически, за документы :

DOMString, определенный в рекомендация сопоставлена ​​с Python строка или строка Юникода. Приложения должен уметь обрабатывать Unicode всякий раз, когда строка возвращается из DOM.

так что у вас должно быть все в порядке либо со строкой Unicode, либо со строкой Python (utf-8 является кодировкой по умолчанию в XML).

На практике, в Python 2, у меня иногда возникали проблемы со строками Unicode в xml.dom (я почти полностью переключился с него на ElementTree некоторое время назад, поэтому я не уверен, что проблемы все еще существуют в последних выпусках Python 2).

Если вы сталкиваетесь с проблемами при использовании строк Unicode напрямую, я думаю, что вместо этого вы захотите попробовать закодированные строки, например, thedoc.createTextNode(u'pié'.encode('utf-8')).

В Python 3, конечно, str s - это Unicode, поэтому в этом отношении все обстоит иначе; -).

1 голос
/ 23 октября 2009

Есть ли способ создать текстовый узел, используя 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!
1 голос
/ 23 октября 2009

Кажется, что у объектов dom есть аргумент кодировки, см. 20.7.1 документации по Python. Читайте также сноску; старайтесь использовать правильную строку кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...