Volker Nebelung: DOM und &

Aloha 'oe,

ich lese in PHP eine XML-Datei ein und will den Inhalt aller "control"-Elemente ausgeben:

  
$xml = new DOMDocument();  
$xml->load("datei.xml");  
foreach ($xml->getElementsByTagName("control") as $control) {  
    echo $control->nodeValue;  
}  

Mein Problem: Der Inhalt besteht unter anderem aus der Zeichenfolge "xxx&xxx", was allerdings im HTML-Code dann als "xxx&xxx" zu lesen ist.

Nun kann man natürlich nachträglich Zeichen per PHP wieder hinzufügen, aber mich interessiert, wo das Verfälschen des Ursprungtextes passiert und wie ich es verhindern kann?!

Gruß, Volker

--
„I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."
- Tony Hoare
  1. Hallo,

    DOM formt entitäten automatisch um.

    Wenn du & haben willst musst du entweder & schreiben, oder danach eine funktion a la htmlspecialchars anwenden.

    mfg, Flo

    --
    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
    1. DOM formt entitäten automatisch um.

      nein, er behandelt sie nur kontextgerecht - von umformen kann keine rede sein, der xml-parser liest &amp; schlichtweg als amp

      genauso wie beim url encoding - da steht auch in der adresszeile foo%26bar, im klartext heissts aber foo&bar

      wenn ich im klartext foo%26bar brauche, muss ich diesen string kontextgerecht codieren/maskieren, dann würde halt foo%2526bar draus

      1. der xml-parser liest &amp; schlichtweg als amp

        als ampersand (im klartext &)

        wo bleibt eigentlich die edit-funktion? :D

        1. 你好 suit,

          wo bleibt eigentlich die edit-funktion? :D

          Die wird es (in der Standard-Distro) vom CForum nie geben :)

          再见,
           克里斯蒂安

          --
          http://wwwtech.de/
          WWWTech.de | Wayne Revived
          Die Stärke des Geistes ist unendlich, die Muskelkraft dagegen ist begrenzt.
          1. Die wird es (in der Standard-Distro) vom CForum nie geben :)

            das war ja auch eine rhetorische frage :p

  2. Hi,

    Mein Problem: Der Inhalt besteht unter anderem aus der Zeichenfolge "xxx&amp;xxx", was allerdings im HTML-Code dann als "xxx&xxx" zu lesen ist.

    Nun kann man natürlich nachträglich Zeichen per PHP wieder hinzufügen, aber mich interessiert, wo das Verfälschen des Ursprungtextes passiert

    Es passiert *gar nicht*.

    Wenn du in einem XML-Textknoten &amp; notierst, dann *ist* der *Inhalt* dieses Textknotens an der Stelle ein &.

    Von einer "Verfaelschung" kann also keine Rede sein.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Aloha 'oe,

      Wenn du in einem XML-Textknoten &amp; notierst, dann *ist* der *Inhalt* dieses Textknotens an der Stelle ein &.

      Von einer "Verfaelschung" kann also keine Rede sein.

      Hm, ich hätte erwartet, dass im HTML-Quelltext auch ein &amp; auftaucht, aber da lag ich wohl falsch ...

      Danke, dann hilft wohl doch nur die nachträgliche Rekonstruktion des &amp;.

      Gruß, Volker

      --
      „I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies."
      - Tony Hoare
      1. Hm, ich hätte erwartet, dass im HTML-Quelltext auch ein &amp; auftaucht, aber da lag ich wohl falsch ...

        das nennt sich kontextgerechtes maskieren der zeichen, in xml html ein & einfach als &amp; maskiert zu sein, wenn du &amp; als zeichenkette in einem xml-file unterbringen willst, musst du es als &amp;amp; maskieren

        Danke, dann hilft wohl doch nur die nachträgliche Rekonstruktion des &amp;.

        htmlspecialchars()

      2. echo $begrüßung;

        Wenn du in einem XML-Textknoten &amp; notierst, dann *ist* der *Inhalt* dieses Textknotens an der Stelle ein &.
        Von einer "Verfaelschung" kann also keine Rede sein.
        Hm, ich hätte erwartet, dass im HTML-Quelltext auch ein &amp; auftaucht, aber da lag ich wohl falsch ...
        Danke, dann hilft wohl doch nur die nachträgliche Rekonstruktion des &amp;.

        Nein, es ist keine Rekonstruktion sondern ein notwendiges Bearbeiten für einen neuen Kontext, HTML in deinem Fall. Es hätte aber auch jedes beliebige andere Medium mit völlig von XML/HTML verschiedenen Kodierungsregeln sein können. Ebenfalls ist es keineswegs prinzipiell so, dass die ursprünglich mit XML transprortierten Daten unverändert bleiben müssen. Du kannst sie kürzen oder ergänzen, auf alle Fälle brauchst du sie für die interne Verarbeitung idealerweise im Rohformat und wenn du sie an ein Medium ausgibst, kodierst du sie kontextgerecht.

        echo "$verabschiedung $name";

      3. Hi,

        Hm, ich hätte erwartet, dass im HTML-Quelltext auch ein &amp; auftaucht, aber da lag ich wohl falsch ...

        Grundlage der Software-Entwicklung: Wenn Du einen Wert in einen Kontext bringst, musst Du ihn kontextspezifisch kodieren.

        Gegenseite, mit der man sich nur sehr selten herumschlagen muss, weil sie fast immer automatisch passiert: Wenn Du einen Wert aus einem Kontext nimmst, musst Du ihn kontextspezifisch dekodieren. Genau dies passiert in den von Dir verwendeten DOM-Methoden. Und: Wenn Du die richtigen DOM-Methoden zur Ausgabe benutzt - echo zählt nicht dazu - dann passiert auch die Kodierung automatisch.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes