2009-07-30 10 views
11

Ich habe ein PHP5 DOMDocument und ich versuche, den Wurzelknoten (nicht das Wurzelelement) zu finden.PHP5: Wurzelknoten in DOMDocument finden

Beispiel:

<test> 
    <element> 
     <bla1>x</bla1> 
     <bla2>x</bla2> 
    </element> 
    <element> 
     <bla1>y</bla1> 
     <bla2>y</bla2> 
    </element> 
    <element> 
     <bla1>z</bla1> 
     <bla2>z</bla2> 
    </element> 
</test> 

Ich mag die DOMNode von "test" bekommen, so dass ich anrufen kann - zum Beispiel - hasChildNodes. Ich kann das "documentElement" bekommen, aber das ist ein DOMElement. Vielleicht kann ich von dort aus gehen?

$d = DOMDocument::loadXML($xml); 
// [... do some stuff here to find document's root node ...] 
if ($rootnode->hasChildNodes()) echo 'yayy!' 

Wer kann die Lücke füllen? Ich bin blind.

(Offensichtlich ist es nicht nur hasChildNodes, die ich aufrufen möchte - also NEIN, es hilft nicht, eine andere Methode zu finden, herauszufinden, ob das Dokument Zeug enthält. Das ist nur für mein einfaches Beispiel. Ich brauche einen DOMNode am Ende .)

+0

Okay, das Problem scheint die totale Verwirrung zwischen "DOMDocument" und "DomDocument" zwischen PHP5 und PHP4 und der komischen Dokumentation davon zu sein. Ich denke, ich habe es jetzt behoben. Danke an alle. – BlaM

Antwort

5

Nach den PHP-Dokumente DOMElement is a subclass of DOMNode, so sollte es die hasChildNodes() -Methode erben.

+0

Hmmm, okay, das ist eigentlich wahr ... Und wenn ich mein -> documentElement nicht an eine Funktion sende, scheint alles richtig zu funktionieren ... Der Funktionsaufruf verliert etwas auf seinem Weg ... Nun, das zu finden ... – BlaM

12

DOM-Modell - Das W3C hat das DOM in eine Baumstruktur von Knoten unterschiedlicher Typen unterteilt. Die Knotenschnittstelle ist die Basisschnittstelle für alle Elemente. Alle Objekte, die diese Schnittstelle implementieren, stellen Methoden für den Umgang mit Kindern bereit.

$dom=new DomDocument; 
$dom->Load("file.xml"); 
$root=$dom->documentElement; // Root node 
+0

Sollte als Lösung markiert sein. – kaiser

55

DOMelement erweitert DOMNode.

Sie erhalten die WurzelDOMElement von $ d-> document.

+12

Das sollte eigentlich die angekreuzte Antwort sein! –

+2

hier ist die Dokumentation für diese Eigenschaft http://www.php.net/manual/en/class.domdocument.php#domdocument.props.documentelement – gawpertron

+0

Ich werde jemanden einen Klick speichern. Die obige Dokumentation besagt: 'Dies ist ein Convenience-Attribut, das direkten Zugriff auf den untergeordneten Knoten ermöglicht, der das Dokumentelement des Dokuments ist – Ben

0

Vor PHP 5.1.3 dieser Typ hat leckte es

https://macfoo.wordpress.com/2009/06/03/getting-the-root-node-from-an-xml-string

/** 
* function getXMLRootNode 
* @param string An xml string 
* @return string Return XML root node name 
*/ 

function getXMLRootNode($xmlstr) 
{ 
// Create DOM model 
$doc = new DOMDocument(); 

// Load the XML string 
if(!$doc->loadXML($xmlstr)) 
{ 
throw new Exception('Unable to parse XML string'); 
} 

// Find the root tag name 
$root = $doc->documentElement; 

if(!isset($root)) 
{ 
throw new Exception('Unable to find XML root node'); 
} 

if(!isset($root->nodeName)) 
{ 
throw new Exception('Unable to find XML root node name'); 
} 

return $root->nodeName; 
} 

Kreuz Posted SO Fragen, die ich traf bei dem Versuch, zu finden, wie dies bereits zu tun 5.1.3