XML::DOM::Parser produziert Invaliden
daywalker
- perl
Hallo zusammen,
ein mittels simplem Aggregator-Script erstellter Feed verliert den validen Status und das kommt so:
Der erste Eintrag wird aus praktischen Gründen per heredoc erstellt und dann so gespeichert:
open (XML, ">:utf8","$file") || die ("xfile: $!\n");
print XML "$start";
close XML;
Das Ergebnis findet der Validator vom W3C noch gut, aber nach Ergänzung auf solche Weise
use XML::DOM;
use utf8;
$parser=XML::DOM::Parser->new();
$doc=$parser->parsefile($file);
$root=$doc->getDocumentElement();
$entries=$doc->getElementsByTagName("entry");
$new=$doc->createElement("entry");
$tobj=$doc->createElement("title");
$tobj->addText($title);
$new->appendChild($tobj);
(...)
$root->insertBefore($new,$entries->item(0));
$doc->printToFile($file);
ist das Ding nicht mehr valide. Der Parser kann den selbst erstellten Feed nicht mehr ausgeben (wg. "invalid Token") und auch der W3C-Validator streikt.
Da allerdings das XML ohne erkennbare Fehler in die Datei geschrieben wird, habe ich den Verdacht, dass es ein Encoding-Problem geben könnte. Kann es sein, dass printToFile hier kein UTF-8 auswirft? Und wie ließe sich das prüfen/ändern?
Greetz
daywalker
Benutze XML::Feed. Es ist eine schlechte Idee, XML manuell zusammenzuschustern, wenn bereits ein spezialisiertes Modul existiert.
XML::DOM ist überholt, aber das sagte ich dir bereits.
printToFile ist nicht PerlIO-konform, d.h. du musst deine Ausgaben selber kodieren. Ungetestet: verwende stattdessen die Methode printToFileHandle, der du ein vorher geöffnetes Handle geben kannst, welches die vernünftigen IO-Layer aufweist.
use autodie qw(:all);
open my $h, '>:encoding(UTF-8)', $file;
printToFile ist nicht PerlIO-konform,
Das ist ein wichtiger Hinweis, der eine Menge unnützte Sucharbeit erspart.
d.h. du musst deine Ausgaben selber kodieren. Ungetestet: verwende stattdessen die Methode printToFileHandle,
Ulkiger Weise klappt hier nur ein schlichtes $doc->print($h)
Egal:
open my $h, '>:encoding(UTF-8)', $file;
Das war jedenfalls der Knackpunkt- besten Dank.
(Die Idee war und bleibt für einen simplen Job auch ein simples Modul zu verwenden- und nebenbei noch ein paar Basics über Perl & XML zu lernen. Hat gut geklappt, Perfektion war nicht der Anspruch)