| 

.NET C# Java Javascript Exception

3
Hi Leute,

ich erstelle mit ein DOMDocument in PHP per:

$dom = new DOMDocument();
$dom->strictErrorChecking = FALSE;
$dom->loadHTMLFile($filename);

und suche in diesem eine bestimmte node mit dem Attribute "class == char_info":

$allDivs = $dom->getElementsByTagName("div");

$div_char_info = null;
foreach($allDivs as $node) {
$className = $node->getAttribute('class');
if($node->nodeType == 1 && $className == "char_info") {
$div_char_info = $node;
}
}

Soweit funktioniert auch alles, nun möchte ich aber aus dem gefundenen node namens $div_char_info ein neues DOMDocument Objekt erstellen, welches nebst der $div_char_info Node auch alle Children mitnimmt (kopiert). Das neue DOMDocument benötige ich um mit DOMXPath einen Query innerhalb dieses abzusetzen.

Nur wie kann ich mithilfe des gefundenen Nodes "$div_char_info" ein neues DOMDocument erstellen?
News:
23.10.2009
The_Holy_One 393 1 6
3 Antworten
4
Du legst ein neues DomDocument an und integrierst mit der Methode importNode() den gefundenen Knoten.
...
$newDOM = new DOMDocument();
$newDOM->importNode( $div_char_info, true );
...

Der zweite Parameter, der hier auf True steht, bewirkt das rekursiv der gesamte Subtree importiert wird.
23.10.2009
FalkP 3,3k 3 8
0
Ich habe per

print $div_char_info->textContent;

Nach dem durchlaufen der foreach Schleife die gefundene Node und alle Kinder ausgegeben. Es ist also garantiert das einerseits die richtige Node gefunden wurde, als auch das an dieser ein Haufen an Informationen angehängt sind.

Wenn ich jedoch nun

...
$newDOM = new DOMDocument();
$newDOM->importNode( $div_char_info, true );
...

durchführe, und dann per:

print $newDOM->saveHTML();

das neue DOMDocument versuche auszugeben, ist die Ausgabe leer. Beim Import wird also die angegeben Node, die wie bereits oben erwähnt, definitiv Content besitzt, nicht übertragen.

Was könnte die Ursache für das Problem sein?
29.10.2009
The_Holy_One 393 1 6
0
Ich habe inzwischen die Lösung selbst gefunden, der 'Fehler' lag daran das zwar die Node in das DOMDocument kopiert wurden, jedoch - wenn man mal darüber nachdenkt - logischerweise nicht automatisch im DOMDocument Tree angehängt wird. Deshalb muss man mit 'appendChild' angeben wohin die neue Node samt all ihrer Child's angehängt werden soll.

Hier also die Lösung:

//Neues DOMDocument erstellen
$newDOM = new DOMDocument();

//Ein root Element erstellen
$newDOM->loadXML("<root></root>");

//Die Node 'div_char_info' in das neue DOMDocument 'newDom' kopieren,
//Das Ergebnis ist eine Node 'node' welche sich nun im 'newDom' befindet.
$node = $newDOM->importNode( $div_char_info, true );

//Die neue Node 'node' im DOMDocument 'newDOM' an das Root-Element anhängen!
$newDOM->documentElement->appendChild($node);

//Testausgabe
print $newDOM->saveHTML();
29.10.2009
The_Holy_One 393 1 6
Lösung stammt von:
http://de2.php.net/manual/de/domdocument.importnode.php
The_Holy_One 29.10.2009

Stelle deine Php-Frage jetzt!