[Munich-pm] XML::RSS::Parser::Lite - Whitespace in Source

Harald Jörg Harald.Joerg at arcor.de
Tue Feb 14 16:39:14 PST 2012


Hallo Stefan,

Du schreibst:

> ich nutze XML::RSS::Parser::Lite um RSS-Feeds zu parsen.
>
> Einer der RSS-Feeds macht jedoch Probleme und mein Skript meldet 
>
> junk '' before XML element beim Parsen der Datei.

Soweit kann ich das reproduzieren.  Aaaber:

> Das Problem sind Whitespaces vor </channel> in der Datei....

Wie kommst Du denn auf dieses schmale Brett?  Diese Diagnose erscheint
mir sehr verwegen.

> ... Hier die Quelle:
> http://rss.jobsearch.monster.com/rssquery.ashx?rad_units=km&lv=11&lv=12&cy=de&indid=77&pp=15&jt=3&tm=0&sort=rv.di.dt&occ=660.11996&occ=660.11774&occ=660.11754&occ=660.11772&occ=660.11787&occ=660.11847&occ=660.11848&occ=660.11969&occ=660.11970&occ=660.11904&occ=660.11882&occ=660.11979&occ=660.11987&occ=660.12005&baseurl=stellenanzeige.monster.de
>
> Verletzt jetzt die Seite den RSS/XML-Standard mit dem Whitespace oder ist XML::RSS::Parser::Lite zu strikt?

Die RSS-Seite ist korrekt, der Parser stolpert.  Der junk, den Du
siehst, ist nämlich tatsächlich *vor* dem ersten Element, und es handelt
sich dabei um die BOM (Byte Order Mark), oder hex EF BB BF.  UTF-8 darf
sowas mitbringen, weil's eben Unicode ist, obwohl man es bei UTF-8 (im
Unterschied zu UTF-16) gar nicht braucht.  Perl an sich macht das
richtig, drum siehst Du rein gar nichts, wenn Du den RSS-Text mit print
ausgibst.

Wenn Du das Ding mit use bytes einliest und die ersten drei Bytes
schlachtest, dann stirbt der Parser nicht mehr.

Wenn Du das Ding mit binmode UTF8 einliest, dann musst Du nur den ersten
Character (hier nicht Byte!) schlachten.  Der sieht nämlich so aus:

  DB<16> printf("%X",ord(substr($xml,0,1)))
FEFF

...und FEFF ist eben der Unicode-Codepoint der BOM.
Ein robuster Code könnte so aussehen:

   1) den Content-Type checken: bei text/xml ist UTF-8 default
   2) falls ja: mit binmode $fh, ':UTF8' einlesen
   3) danach mit $rss =~ s/^\x{FEFF}// die BOM schlachten,
      falls vorhanden
   4) ...und dann erst an den Parser verfüttern.

--
Cheers,
haj


More information about the Munich-pm mailing list