2015-07-10 18 views
7

Ich muss die Eltern eines bestimmten Knotens in PHP bekommen. Ich benutze DomDocument und Xpath. Mein xml ist dies:Holen Xpath Parent-Knoten mit DomDocument PHP?

<ProdCategories> 
<ProdCategory> 

    <Id>138</Id> 

    <Name>Parent Category</Name> 

    <SubCategories> 

     <ProdCategory> 

      <Id>141</Id> 

      <Name>Category child</Name> 

     </ProdCategory> 
    </SubCategories> 
</ProdCategory> 
</ProdCategories> 

Der PHP-Code:

$dom = new DOMDocument(); 
$dom->load("ProdCategories_small.xml"); 
$xpath = new DOMXPath($dom); 
$nodes = $xpath->query('//ProdCategory/Id[.="141"]/parent::*')->item(0); 
print_r($nodes); 

Der Druck ist:

DOMElement Object ( 
[tagName] => ProdCategory [schemaTypeInfo] => [nodeName] => ProdCategory [nodeValue] => 141 Category child [nodeType] => 1 [parentNode] => (object value omitted) [childNodes] => (object value omitted) [firstChild] => (object value omitted) [lastChild] => (object value omitted) [previousSibling] => (object value omitted) 

Die [parentNode] ist (object value omitted), warum? Ich würde

<Id>138</Id> 

    <Name>Parent Category</Name>` 
+0

Gibt der letzte in Ihrer Frage angegebene Knoten die gewünschte Ausgabe an? Ihr Xpath-Ausdruck kann als '// ProdCategory [Id [. =" 141 "]]' umgeschrieben werden, funktioniert das? – collapsar

+0

@collapsar danke für Ihre Antwort. Nein, funktioniert nicht. Der letzte Knoten in meiner Frage ist es was ich will. – Eliana

+2

@collapsar - oder sogar '// ProdCategory [Id =" 141 "]' –

Antwort

0

behandeln erhalten Sie den XPath-Abfrage-Knoten als Dateisystem Pfade, wie erwähnt here

Nach oben, 2 Knoten und die Eltern erhalten und bekommen, was Sie von ihm benötigen, wie zum Beispiel der ID oder den Namen.

Beispiel:

<?php 

$dom = new DOMDocument(); 
$dom->load("ProdCategories_small.xml"); 
$xpath = new DOMXPath($dom); 

$parentNode = $xpath->query('//ProdCategory[Id="141"]/../..')->item(0); 

$id = $xpath->query('./Id', $parentNode)->item(0); 
$name = $xpath->query('./Name',$parentNode)->item(0); 

print "Id: " . $id->nodeValue . PHP_EOL; 
print "Name: " . $name->nodeValue . PHP_EOL; 
2

Die [parentNode] ist (object value omitted), warum?

Dies ist, weil Sie die print_r function und schafft so einen Ausgang (via an internal helper function of the dom extension) verwenden. Die Linie in Code, der dies schafft ist:

print_r($nodes); 

Die Zeichenfolge „(object value omitted)“ durch die DOMNode gegeben wird, wenn entweder print_rvar_dump oder auf sie verwendet werden. Es teilt Ihnen mit, dass das Objekt Wert dieses Felds (mit dem Namen ParentNode) nicht angezeigt, aber weggelassen wird.

Aus dieser Nachricht können Sie schließen, dass das Feld einen Wert hat, der ein Objekt ist. Eine einfache Prüfung für die Klasse-Name könnte dies überprüfen:

echo get_class($nodes->parentNode), "\n"; # outputs "DOMElement" 

Vergleichen Sie das mit Feldern, die eine ganze Zahl oder eine (leere) Zeichenfolge sind:

[nodeType] => 1 
... 
[prefix] => 
[localName] => ProdCategory 

So hoffe ich das es für Sie aufräumt . Greifen Sie einfach auf das Feld zu, um das übergeordnete Knotenobjekt zu erhalten:

$parent = $nodes->parentNode; 

und fertig.

Wenn Sie sich über eine bestimmte Zeichenfolge wundern, die PHP Ihnen gibt, und Sie das Gefühl haben, es könnte etwas internes sein, können Sie schnell alle Codebasis von PHP auf http://lxr.php.net/, here is an example query for the string in your question suchen.