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ügler: We are out of real life</title>
jeśli nie zgadłeś – problemem jest ten ü.
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.