gast: createDocumentFragment

HI,

folgendes Problem ergibt sich, wenn ich ein mit Hilfe von createDocumentFragment erstelltes DomNode in einen vorhandenen DOM-Tree einbinde (appendChild):

DocumentFragment: <newelement>inhalt</newelement>
XML-Tree vorher: <document><text>foo</text></document>
XML-Tree nachher: <document><text>foo</text><><newelement>inhalt</newelement></></document>

Wie man erkennen kann, wurden leere Tags mit eingefügt: <></> . Woher kommen die? Wie kann man verhindern, dass sie mit eingefügt werden?

Vielen Dank für jeglichen Hinweis,
gast

  1. Hallo,

    folgendes Problem ergibt sich, wenn ich ein mit Hilfe von createDocumentFragment erstelltes DomNode in einen vorhandenen DOM-Tree einbinde (appendChild):

    Womit machst du das? Java, PHP, JSP, ... ?
    (Code?)

    Grüße
    Thomas

    1. Womit machst du das? Java, PHP, JSP, ... ?

      Entschuldigung, das hatte ich ja ganz vergessen. Ich verwende dafür die neue DOM extension in PHP5.

      Codeausschnitt:

      $newDocFragment = $this->createDocumentFragment();
      $element = new domElement("newelement", "Hallo Welt!");
      $newDocFragment->appendChild($element);
      $foo->replaceChild($newDocFragment, $foo->firstChild);

      Anmerkungen:

      • $foo entspricht im genannten Beispiel dem RootElement.
      • 'replaceChild' bindet hier das DocumentFragment ein und ersetzt ein vorhandenes TextNode.

      Viele Grüße,
      gast

      1. Hallo,

        Womit machst du das? Java, PHP, JSP, ... ?

        Entschuldigung, das hatte ich ja ganz vergessen. Ich verwende dafür die neue DOM extension in PHP5.

        Codeausschnitt:

        Versuche es mal so wie im Bsp. unter: http://www.php.net/manual/en/function.dom-domdocument-createelement.php steht

        Grüße
        Thomas

  2. Hallo,

    Wie man erkennen kann, wurden leere Tags mit eingefügt: <></> . Woher kommen die? Wie kann man verhindern, dass sie mit eingefügt werden?

    Ohne konkrete Angaben zum Code und zur verwendeten Plattform/Sprache kann man da nur raten.

    Hier mal ein SVG-Testbeispiel und es werden (unter Verwendung des ASV 3.01) keine "leeren Tags" erzeugt:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
      "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">

    <svg onload="Test(evt)">

    <defs>

    <script type="text/javascript">
    <![CDATA[

    function Test(evt)
    {
      var doc,df,el,tx;

    doc=evt.target.ownerDocument;

    df=doc.createDocumentFragment();
      el=doc.createElement("text");
      el.setAttribute("x","20");
      el.setAttribute("y","50");
      el.setAttribute("fill","#F00");
      tx=doc.createTextNode("Hallo Welt!");
      el.appendChild(tx);
      df.appendChild(el);
      alert(printNode(df)); // Ergebnis: <text x="20" y="50" fill="#F00">Hallo Welt!</text>
      doc.rootElement.appendChild(df);
    }

    ]]>
    </script>

    </defs>

    </svg>

    MfG, Thomas

  3. Hallo,

    folgendes Problem ergibt sich, wenn ich ein mit Hilfe von createDocumentFragment erstelltes DomNode in einen vorhandenen DOM-Tree einbinde (appendChild):

    XML-Tree nachher: <document><text>foo</text><><newelement>inhalt</newelement></></document>

    Kann es sein, dass du saveHTML() statt saveXML() einsetzt? Mit saveHTML() kann ich den Fehler reproduzieren, mit saveXML() nicht (PHP 5.0.1). Dein Beispiel lässt darauf schließen, dass du saveXML() suchst.

    Wie man erkennen kann, wurden leere Tags mit eingefügt: <></> . Woher kommen die? Wie kann man verhindern, dass sie mit eingefügt werden?

    <?php

    $doc = new DOMDocument();
    $root_element = new domElement('murks', 'x');
    $doc->appendChild($root_element);

    $docfragment = $doc->createDocumentFragment();
    $docfragment->appendChild(new domElement('bla', 'test'));

    $root_element->replaceChild($docfragment, $root_element->firstChild);

    echo($doc->saveXML()."\n"); // ergibt <murks><bla>test</bla></murks> -> Richtig
    echo($doc->saveHTML()."\n"); // ergibt <murks><><bla>test</bla></></murks> -> Fehler

    $node = $root_element->firstChild;
    // Was ist das für ein Knoten, der da in der HTML-Ausgabe ein Tagpaar ohne tagName erzeugt?
    var_dump($node);
    // Es ist das eingehängte DOMDocumentFragment-Objekt, das von der Methode falsch behandelt wird. Dies ist wohl ein PHP-Fehler.

    ?>

    Falls es dir um HTML-Code geht:
    Ein DocumentFragment-Knoten ist freilich komfortabler zum Gruppieren als ein Elementknoten, aber vielleicht reichen für diese Zwecke div-Elemente.

    <?php

    $doc = new DOMDocument();
    $doc->loadXML('<html><body></body></html>');
    $body = $doc->documentElement->firstChild;

    $div = $doc->createElement('div');
    $div->appendChild(new domElement('p', '1'));
    $div->appendChild(new domElement('p', '2'));
    $div->appendChild(new domElement('p', '3'));
    // ...
    $body->appendChild($div);

    echo($doc->saveHTML()."\n");

    ?>

    So funktioniert die Ausgabe als HTML. Die Elementgruppe ist über das div-Element ansprechbar, du kannst damit vieles machen, was du mit dem DocumentFragment vermutlich vorhattest.

    Mathias

    1. Hallo,

      // Es ist das eingehängte DOMDocumentFragment-Objekt, das von der Methode falsch behandelt wird. Dies ist wohl ein PHP-Fehler.

      Beziehungsweise ein Fehler in libxml (wahrscheinlich http://xmlsoft.org/html/libxml-HTMLtree.html#htmlDocDumpMemory). Ich habe mit Version 2.6.7 getestet.
      Ich nehme an, dass ein PHP-Bugreport abgewiesen werden würde.

      Mathias