daywalker: XML::DOM::Parser produziert Invaliden

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

  1. 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;
    
    1. 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)