Изящно восстановиться после ошибки анализа в экспатрите

StackOverflow https://stackoverflow.com/questions/5381577

Вопрос

Предполагается, что XML был строгим, и поэтому есть некоторые символы Unicode, которые не допускаются в XML. Однако я пытаюсь работать с RSS -каналами, которые в любом случае часто содержат эти символы, и я хотел бы либо избежать ошибок анализа от недействительных символов, либо изящно изящно из них и в любом случае представлять документ.

Смотрите пример здесь (в любом случае 21 марта): http://feeds.feedburner.com/chrisblattman

Каков рекомендуемый способ обработать Unicode в XML -канале? Обнаруживать символы и заменить в нулевых байтах, отредактировать анализатор или какой -то другой метод?

Это было полезно?

Решение

Похоже, что RSS -канал содержал вертикальный символ вкладки \x0c что незаконно по спецификации XML 1.0.

Мой совет - отфильтровать нелегальных символов, прежде чем передавать данные в экспатрианту, а не пытаться поймать ошибки и восстановить. Вот рутина, чтобы отфильтровать символов Unicode, которые являются незаконными. Я проверил это на вашем chrisblattman.xml Новостная лента:

import re
from xml.parsers import expat

# illegal XML 1.0 character ranges
# See http://www.w3.org/TR/REC-xml/#charsets
XML_ILLEGALS = u'|'.join(u'[%s-%s]' % (s, e) for s, e in [
    (u'\u0000', u'\u0008'),             # null and C0 controls
    (u'\u000B', u'\u000C'),             # vertical tab and form feed
    (u'\u000E', u'\u001F'),             # shift out / shift in
    (u'\u007F', u'\u009F'),             # C1 controls
    (u'\uD800', u'\uDFFF'),             # High and Low surrogate areas
    (u'\uFDD0', u'\uFDDF'),             # not permitted for interchange
    (u'\uFFFE', u'\uFFFF'),             # byte order marks
    ])

RE_SANITIZE_XML = re.compile(XML_ILLEGALS, re.M | re.U)

# decode, filter illegals out, then encode back to utf-8
data = open('chrisblattman.xml', 'rb').read().decode('utf-8')
data = RE_SANITIZE_XML.sub('', data).encode('utf-8')

pr = expat.ParserCreate('utf-8')
pr.Parse(data)

Обновлять: Вот есть страница Википедии О достоверности символов XML. Моя режима REGEXP выше фильтрует диапазон управления C1, но вы можете разрешить эти символы в зависимости от вашего приложения.

Другие советы

Вы можете попробовать Красивый супWich может разобрать документы HTML/XML, даже если они плохо сформированы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top