Найти - Пользователи
Полная версия: Обработка xml - проблема с entity-ref
Начало » Python для экспертов » Обработка xml - проблема с entity-ref
1 2
ilyay
Всем привет.
Никак не получается обработать xml файл из-за возникающей ошибки.
В xml-файле встречается “ &thetas; ”, и на ней парсер ломается.

import sys
import xml.etree.ElementTree as eTree

for ev, el in eTree.iterparse(sys.stdin):
print ev,el

Работа:

end <Element P at 8104eec>
end <Element P at 8104f4c>
end <Element P at 8104fac>
Traceback (most recent call last):
File “./etr-analyze.py”, line 11, in <module>
for ev, el in eTree.iterparse(sys.stdin):
File “/usr/lib/python2.5/xml/etree/ElementTree.py”, line 937, in next
self._parser.feed(data)
File “/usr/lib/python2.5/xml/etree/ElementTree.py”, line 1245, in feed
self._parser.Parse(data, 0)
xml.parsers.expat.ExpatError: undefined entity: line 1, column 14191

Пробовал сделать обработку через SAX, minidom, pulldom, elementtree , но так и не нашел, как сказать парсеру добавить эту энтити в список известных, превратить в текст или игнорировать вообще. Второй день на сайтах роюсь - не могу найти информацию. Помогите, пожалуйста. Буду рад ответу под любой парсер из перечисленных.
shiza
мммм…. может так:
import xml.sax.saxutils
....
xml.sax.saxutils.unescape( data, {'&thetas;':'sho za shtuka?'})
....
shiza
Я правда с XML совсем плохо дружу, но вроде по хорошему разные там левые ентити должны быть прописаны в DTD.
Поправьте меня, если я не прав.
ilyay
1. Что такое data здесь? Строка?
При обработке параграфа, такое впечатление, что сначала параграф обрабатывается до thetas, а thetas обрабатывается на следующей итерации как элемент другого рода. Т.е. в виде строки entity не появляется. Да и смешивать SAX с DOM-парсерами как-то не очень…

2. Передаю элемент внутри цикла: Нет метода replace
Traceback (most recent call last):
File “./etr-analyze.py”, line 16, in <module>
xml.sax.saxutils.unescape(el, {'&thetas;': ‘byaka’})
File “/usr/lib/python2.5/site-packages/_xmlplus/sax/saxutils.py”, line 45, in unescape
data = data.replace(“&lt;”, “<”)
AttributeError: _ElementInterface instance has no attribute ‘replace’

3. Да, в DTD обычно прописываются. Но у тысяч файлов, ждущих обработки, внутри они не прописаны. Как передать парсеру этот параметр DTD из python?
shiza
Есть еще один стандартный парсер:
xml.parsers.expat
он не валидирующий - ему на DTD положить, и поэтому в нем есть разные Entity обработчики.
shiza
data - да, это строка. Перед тем как попадает в парсер =)
ilyay
shiza
Есть еще один стандартный парсер:
xml.parsers.expat
он не валидирующий, и в нем есть разные Entity обработчики.
Он-то и выдал ошибку: xml.parsers.expat.ExpatError
И ошибка какая-то фатальная. После нее обработка прекращается. :-(
ilyay
shiza
data - да, это строка. Перед тем как попадает в парсер =)
И где в коде ее нужно поставить? Ума не приложу.
Или это парсинг за 2 прохода?
shiza
ilyay
3. Да, в DTD обычно прописываются. Но у тысяч файлов, ждущих обработки, внутри они не прописаны. Как передать парсеру этот параметр DTD из python?
Есть в sax - метод - setDTDHandler
shiza
ilyay
shiza
data - да, это строка. Перед тем как попадает в парсер =)
И где в коде ее нужно поставить? Ума не приложу.
Или это парсинг за 2 прохода?
Читаем строку, делаем замену, передаем в парсер, если он может работать с потоком.
Или читаем XML-ку целиком, передаем в парсер.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB