Я пытаюсь перейти на Python 2.7, и поскольку Unicode - это большая сделка, я бы попытался разобраться с ними с файлами и текстами XML и проанализировать их с помощью библиотеки xml.etree.cElementTree
. Но я столкнулся с этой ошибкой:
>>> import xml.etree.cElementTree as ET
>>> from io import StringIO
>>> source = """\
... <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
... <root>
... <Parent>
... <Child>
... <Element>Text</Element>
... </Child>
... </Parent>
... </root>
... """
>>> srcbuf = StringIO(source.decode('utf-8'))
>>> doc = ET.parse(srcbuf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 56, in parse
File "<string>", line 35, in parse
cElementTree.ParseError: no element found: line 1, column 0
То же самое происходит при использовании io.open('filename.xml', encoding='utf-8')
для перехода к ET.parse
:
>>> with io.open('test.xml', mode='w', encoding='utf-8') as fp:
... fp.write(source.decode('utf-8'))
...
150L
>>> with io.open('test.xml', mode='r', encoding='utf-8') as fp:
... fp.read()
...
u'<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>\n<root>\n <Parent>\n
<Child>\n <Element>Text</Element>\n </Child>\n </Parent>\n</root>\n
'
>>> with io.open('test.xml', mode='r', encoding='utf-8') as fp:
... ET.parse(fp)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<string>", line 56, in parse
File "<string>", line 35, in parse
cElementTree.ParseError: no element found: line 1, column 0
Есть ли что-то о unicode и синтаксическом анализе ET, которое я здесь отсутствует?
edit. По-видимому, парсер ET не хорошо работает с входным потоком Unicode? Следующие работы:
>>> with io.open('test.xml', mode='rb') as fp:
... ET.parse(fp)
...
<ElementTree object at 0x0180BC10>
Но это также означает, что я не могу использовать io.StringIO
, если я хочу анализировать текст в памяти, если я не сначала его закодирую в буфере в памяти?