Domanda

XML dovrebbe essere severo, e quindi ci sono alcuni caratteri Unicode che non sono ammessi in XML. Tuttavia, sto cercando di lavorare con feed RSS che spesso contengono comunque questi personaggi, e vorrei evitare errori di analisi da personaggi non validi o recuperare con grazia da loro e presentare comunque il documento.

Vedi un esempio qui (il 21 marzo comunque): http://feeds.feedburner.com/chrisblattman

Qual è il modo consigliato per gestire Unicode nel feed XML? Rilevare i caratteri e sostituire in byte null, modificare il parser o qualche altro metodo?

È stato utile?

Soluzione

Sembra che il feed RSS contenesse un carattere di scheda verticale \x0c che è illegale Secondo la specifica XML 1.0.

Il mio consiglio è di filtrare i personaggi illegali prima di passare i dati a espatriare, piuttosto che tentare di catturare errori e recuperare. Ecco una routine per filtrare i personaggi Unicode che sono illegali. L'ho provato sul tuo chrisblattman.xml RSS Feed:

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)

Aggiornare: Qui è Una pagina Wikipedia Informazioni sulla validità del carattere XML. Il mio regexp sopra filtra l'intervallo di controllo C1, ma potresti voler consentire quei caratteri a seconda della tua applicazione.

Altri suggerimenti

Puoi provare Bella zuppache possono analizzare i documenti HTML/XML anche se non sono ben formati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top