Philipp Hasenfratz: Umlaute und Specialchars in TextNodes

Halihallo Forumer

<programm>
   use strict;
   use XML::DOM;

my $doc = XML::DOM::Document->new;

my $root = $doc->createElement( 'root' );
   my $text = $doc->createTextNode( 'test äöü äöü test' );

$doc->appendChild($root);
   $root->appendChild($text);

print $doc->toString;
</programm>

wie bringe ich XML::DOM bei, folgendes auszugeben ...

test äöü äöü test

... statt ...

test &auml;&ouml;&uuml; äöü test

? - Ich weiss zwar, warum er die Amp's kodiert, jedoch nicht, wie man das umgehen kann. Muss man die Entities zuerst "registrieren", bevor er sie unkodiert stehen lässt?
Mich interessieren auch andere Fakten, die ich bei der Verwendung von XHTML über XML::DOM zu Wissen habe (gibt's da was zu beachten, muss man XML::DOM einige Sachen "beibringen/zu wissen geben"?).

Viele Grüsse

Philipp

  1. Hallo Philipp,

    vielleicht mit:

    &#38;auml;  etc.

    Mich interessieren auch andere Fakten, die ich bei der Verwendung von XHTML über XML::DOM zu Wissen habe (gibt's da was zu beachten, muss man XML::DOM einige Sachen "beibringen/zu wissen geben"?).

    Da diese aber alles keine Fragen zu XML sind, habe ich mal das Thema geändert.

    Grüße
    Thomas

    1. Halihallo Thomas

      vielleicht mit:

      &#38;auml;  etc.

      Das gibt mir &#38;auml; aus. Jedes & wird schlicht weg in & umgewandelt. Gibt's eine Möglichkeit, dies mit XML::DOM zu unterbinden?

      Mich interessieren auch andere Fakten, die ich bei der Verwendung von XHTML über XML::DOM zu Wissen habe (gibt's da was zu beachten, muss man XML::DOM einige Sachen "beibringen/zu wissen geben"?).

      Da diese aber alles keine Fragen zu XML sind, habe ich mal das Thema geändert.

      Und wo stellte ich eine Perl-Frage? :-)

      Viele Grüsse

      Philipp

  2. Halihallo Philipp Hasenfratz (ich liebe Automatismen *g*)

    wie bringe ich XML::DOM bei, folgendes auszugeben ...

    test äöü äöü test

    ... statt ...

    test &auml;&ouml;&uuml; äöü test

    Tja, leider war ich noch nicht im Stande, die '&' unkodiert ausgeben zu lassen. Hat vielleicht noch wer eine Idee? - Mir werden, um es nochmals zu wiederholen, alle '&' in '&' ersetzt, was zwar normalerweise OK ist, jedoch in meinem Kontext nicht erwünscht ist.

    Viele Grüsse

    Philipp

    PS: Ja, meine Tastatur klemmt und Thomas: Dir zuliebe habe ich auch auf Perl gestellt :-)

    1. Hallo Philipp,

      Tja, leider war ich noch nicht im Stande, die '&' unkodiert
      ausgeben zu lassen. Hat vielleicht noch wer eine Idee? - Mir
      werden, um es nochmals zu wiederholen, alle '&' in '&'
      ersetzt, was zwar normalerweise OK ist, jedoch in meinem
      Kontext nicht erwünscht ist.

      Wie siehts mit perldoc XML::DOM::Entity aus? Und mit
      createCDATASection? Aus perldoc XML::DOM:

      IMPLEMENTATION DETAILS
      [...]

      Text and CDATASection nodes
                 The Expat parser expands EntityReferences and
                 CDataSection sections to raw strings and does not
                 indicate where it was found.  This implementation
                 does therefore convert both to Text nodes at parse
                 time. CDATASection and EntityReference nodes that
                 are added to an existing Document (by the user)
                 will be preserved.

      Also, subsequent Text nodes are always merged at
                 parse time. Text nodes that are added later can be
                 merged with the normalize method. Consider using
                 the addText method when adding Text nodes.

      Gruesse,
       CK

      1. Halihallo Christian

        Entschuldige die Verspätung und besten Dank für deine Antwort.

        Tja, leider war ich noch nicht im Stande, die '&' unkodiert
        ausgeben zu lassen. Hat vielleicht noch wer eine Idee? - Mir
        werden, um es nochmals zu wiederholen, alle '&' in '&'
        ersetzt, was zwar normalerweise OK ist, jedoch in meinem
        Kontext nicht erwünscht ist.

        Wie siehts mit perldoc XML::DOM::Entity aus? Und mit
        createCDATASection? Aus perldoc XML::DOM:

        Mit CDATA funktioniert es (komisch, als ich das vor langem versucht habe noch nicht... Naja, wohl mein Fehler). Spielt es den Browsern (XHTML) keine Rolle, ob sie normale Textnodes oder CDATASections bekommen? - Die Antwort sollte nein lauten, aber ich frage mal lieber.

        Mit XML::DOM::Entity hab ich immer noch Probleme:

        ---
        use strict;
        use XML::DOM;

        my $doc = XML::DOM::Document->new;

        XML::DOM::DocumentType::addEntity( $doc, 0, 'auml', 'ä' );

        my $root = $doc->createElement( 'root' );
        my $text = $doc->createTextNode( 'test äöü test' );
        my $cdat = $doc->createCDATASection( 'test ä test' );

        $doc->appendChild($root);
        $root->appendChild($text);
        $root->appendChild( $cdat );

        print $doc->toString;
        ---

        stirbt mir bei XML::DOM::DocumentType::addEntity mit der Fehlermeldung:

        "can't call method setNamedItem on an undefined value @ ...". Hätte jemand vielleicht eine Idee, woran dies liegen könnte?

        Viele Grüsse

        Philipp