parsowanie rss’ów

prace nad dnews postępują powoli. bardzo powoli.

pisałem dziś kawałek kodu do czytania rss'ów/atom'ów/rdf'ów.

prosty test na rss'ach planety ubuntu i wynik:

undefined entity at line 527, column 19, byte 70093 at /usr/lib/perl5/XML/Parser.pm line 187

wrrrrrr.

a co jest w tej linii?

=> head -n 527 planet.ubuntulinux.org.xml | tail -n 1
<title>Sebastian K&uuml;gler: We are out of real life</title>

jeśli nie zgadłeś – problemem jest ten &uuml;.

co z tym zrobić? popytałem na ircu, poszukałem na googlu. w końcu trafiłem na stronę która mówi o przyczynach i jak zapobiec.

w związku z tym musiałem zastosować taki kawałek hacka:

$content =~ s{
\A
(
\s*
<\?.*\?>
\s*
)
<
([A-Z0-9:_-]+)
}{$1 . get_doctype($2) . "<" . $2}eixms;

gdzie funkcja get_doctype wygląda:

sub get_doctype {
my $tag = shift;
return <<__DOCTYPE__;
<!DOCTYPE $tag [
<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"> %HTMLlat1;
<!ENTITY % HTMLspecial PUBLIC "-//W3C//ENTITIES Special for XHTML//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent"> %HTMLspecial;
<!ENTITY % HTMLsymbol PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent"> %HTMLsymbol;
]>
__DOCTYPE__
}

co to powoduje?

wstawia przed pierwszy tag w xml'u deklarację używania entity z html'a.

po tym – xml::feed działa mi już poprawnie nie marudząc o nic 🙂

wniosek? część (zgaduję, że większość) feedów rdf/rss/atom jest zwalona jeśli chodzi o poprawność xml'a.

dnews

projekt dnews doczekał się wznowienia.

na razie jest site z layoutem który nic nie robi (i nie ma wszystkich elementów), ale będę po kolei dokładał kolejne cegiełki funkcjonalnościowe.

jeśli macie jakieś sugestie/pomysły/idee – proszę o komentarze do tego wpisu.

—- UPDATE z 2007.04.25 —-

projekt (a dokładniej to co w nim jest, czyli na razie niewiele) można ściągnąć:

svn co http://svn.depesz.com/svn/dNews/trunk/ dNews

dostęp anonimowy jest read only.