createDocumentFragment
gast
- xml
0 Thomas J.S.0 gast
0 Thomas Meinike0 molily0 molily
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
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
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:
Viele Grüße,
gast
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
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
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
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