Tom: Probleme beim Zusammenspiel von Perl, XML und HTML

Hallo Leute.
Ich hab ein Problem, welches mir jetzt schon den ganzen Tag gekostet hat und immer noch
besteht.
Auszug aus meiner XML-Datei:
...
<part>
<QUESTION value="[1]Test Question
[2]Ahoi
[3]Tschau"/>
</part>
...
Das Tag Question beinhaltet also Text und Zeilenumbrüche.
Ich verwende XML::DOM um mein xml File zu bearbeiten. Ich habe mir eine
Methode geschrieben welche mir den Inhalt des Question Tags zurückgibt.
Funktioniert auch tadelos. Nur wenn ich den zurückgegebenen String mittel
textarea (ich benutze CGI.pm) schreibe verschluckt mir irgendetwas meine
Zeilenumbrüche.
textarea(-name    => "QUESTION",
               -value   => "$TempTag",     #TempTag wird so belegt $TempTag=$tree->getString('QUESTION');
               -rows    => 10,
               -columns => 77
               );
Ich weiss jetzt nicht an was das liegen könnte.
Vielen Dank im Voraus.
tom

  1. Hi,

    -value   => "$TempTag",     #TempTag wird so belegt $TempTag=$tree->getString('QUESTION');

    hm, vielleicht liegt's ja daran? Ich habe XML::DOM gerade eben installiert, und in der Doku finde ich kein getString.

    Wie Du es allerdings machen mußt, kann ich Dir leider auch nicht sagen. Ich stoße auf getAttributes, kann anhand der Doku spontan aber nicht erkennen, wie es praktisch eingesetzt wird.

    Cheatah

    1. Moin,

      getString ist eine Methode von mir. Sie stützt sich aber auf getAttribute.
      Aber mein Problem scheint nicht lösbar wie es scheint, da wie ich jetzt aus einer
      Antwort auf meine Frage schliessen kann, XML:Parser Zeilenumbrüche zu
      Leerzeichen konvertiert.

      Gruß
      tom

      1. Hi,

        Aber mein Problem scheint nicht lösbar wie es scheint, da wie ich jetzt aus einer
        Antwort auf meine Frage schliessen kann, XML:Parser Zeilenumbrüche zu
        Leerzeichen konvertiert.

        da hilft nur, die Attributwerte selbst als XML-Fragment zu speichern, oder zumindest als Ausschnitt eines solchen:

        <element attribute="Zeile 1<br />Zeile 2<br />Zeile 3" />

        (Hm, oder müssen die Slashes da maskiert werden? Bin mir jetzt nicht ganz sicher... schreib im Zweifel "<br />")

        Das Parsen mußt Du dann natürlich selbst übernehmen, aber das sollte mit einer kleinen RegExp kein Thema sein.

        Cheatah

        1. da hilft nur, die Attributwerte selbst als XML-Fragment zu speichern, oder zumindest als Ausschnitt eines solchen:
          <element attribute="Zeile 1<br />Zeile 2<br />Zeile 3" />

          Da bin ich grad dran, das geht ganz gut.

          Das Parsen mußt Du dann natürlich selbst übernehmen, aber das sollte mit einer kleinen RegExp kein Thema sein.

          Nun das Parsen muß ich nicht selbst machen, nur vor der eigentlichen Ausgabe muss ich halt meine
          Sonerzeichen unkonvertieren. Für was hab ich schliesslich XML::DOM

          Eine andere  Frage zum Parser. Wenn ich ein xml-Dokumtent parse welches
          "not well formed" ist, bricht der Parser sofort ab.
          Mein Problem, wie kann ich im Programm prüfen ob ein Dokument well-formed ist,
          bzw, den Fehler mittels Parser abfangen und eine anständige Fehlermedlung ausgeben?

          gruß tom

          1. Hi,

            Mein Problem, wie kann ich im Programm prüfen ob ein Dokument well-formed ist,

            da muß ich passen, aber vielleicht hilft Dir das Stichwort "Tidy" weiter. Ob es dazu ein Modul gibt, weiß ich nicht.

            bzw, den Fehler mittels Parser abfangen und eine anständige Fehlermedlung ausgeben?

            Das müßte mit "or die" bzw. alternativen Methoden gehen; analog zu 'open xyz or die "Fehler: $!";', nur daß Du vielleicht nicht wirklich "die" benutzen solltest ;-)

            Cheatah

            1. Hi,

              Mein Problem, wie kann ich im Programm prüfen ob ein Dokument well-formed ist,

              da muß ich passen, aber vielleicht hilft Dir das Stichwort "Tidy" weiter. Ob es dazu ein Modul gibt, weiß ich nicht.

              bzw, den Fehler mittels Parser abfangen und eine anständige Fehlermedlung ausgeben?

              Das müßte mit "or die" bzw. alternativen Methoden gehen; analog zu 'open xyz or die "Fehler: $!";', nur daß Du vielleicht nicht wirklich "die" benutzen solltest ;-)

              Cheatah

          2. Hi!

            da hilft nur, die Attributwerte selbst als XML-Fragment zu speichern, oder zumindest als Ausschnitt eines solchen:
            <element attribute="Zeile 1<br />Zeile 2<br />Zeile 3" />

            Wenn schon, dann muessen die < und > innerhalb des Wertes maskiert werden, und das geht in XML mit & (genauso wie in HTML). Die Slashes dagegen muessen nicht irgendwie maskiert werden. In XML sind das keine besonderen Zeichen.

            Eine andere  Frage zum Parser. Wenn ich ein xml-Dokumtent parse welches
            "not well formed" ist, bricht der Parser sofort ab.
            Mein Problem, wie kann ich im Programm prüfen ob ein Dokument well-formed ist,
            bzw, den Fehler mittels Parser abfangen und eine anständige Fehlermedlung ausgeben?

            XML::Parser verwendet hier Perl's Interpretation von Exceptions, naemlich die(). Eine die()-Exception faengt man mit eval() ab, ungefaehr so:

            $my xp = XML::Parser->new(Style => 'MyOwn::StylePackage');

            {   # 'local' is restricted to this block
                    local $SIG{__DIE__} = 'IGNORE';     # prevent calling a possibly installed __DIE__ signal handler
                    eval {  $parsed = $xp->parse($xml);  };
                }

            if ($@) {
                    # parse error messages look like this:
                    # not well-formed at line 10, column 8, byte 382 at d:/bin/perl/site/lib/XML/Parser.pm line 183

            $@ =~ /(.*) at .*? line \d+.?\s*$/;
                    my $errmsg = $1 $@;
                    print STDERR "Parse error: $errmsg\n";
                }

            So long

  2. Hallo!

    White-spaces gleich welcher Art innerhalb von Attributewerten werden vom XML-Parser zu einfache Leerzeichen konvertiert. Dies ist ein MUST der XML-Spec. Siehe XML-1.0-Spec Kapitel 3.3.3 (http://www.w3.org/TR/1998/REC-xml-19980210#AVNormalize). Du kannst also gar keine Zeilenumbrueche in Attributwerten speichern.

    So long

    1. Hallo und erstmal danke.
      Deine Antwort scheint mir das Genick zu brechen :->
      Aber ich hätt noch eine Unklarheit.
      Beim Abspeichern der Attributwerte, werden Zeilenumbrüche nicht durch Leerzeichen ersetzt.
      Was soll das dann?

      Vielen Dank nochmals
      tom

      1. Aber ich hätt noch eine Unklarheit.
        Beim Abspeichern der Attributwerte, werden Zeilenumbrüche nicht durch Leerzeichen ersetzt.

        Warum auch? Von Seiten der Spec ist erstmal nur gesagt, dass die Umsetzung beim Parsen geschieht, also beim Einlesen, aber nicht beim Abspeichern. Von der Seite der Logik aus stellt sich die Frage, wozu sollte dies beim Speichern gut sein, wenn es beim Einlesen sowieso konvertiert wird. (Na gut, man koennte das mit den oft herangezogenen "for interoperability" oder "for compatibility" begruenden.) Des weiteren bietet es sich bei sehr langen Attributenwerten an, das XML-Dokument durch Zeilenumbrueche lesbarer zu halten; diese sollten also ruhig beibehalten werden.

        So long