2015-07-10 23 views
7

Ho bisogno di ottenere il genitore di un nodo particolare in php. Sto usando DomDocument e Xpath. mio xml è questo:Ottieni il nodo genitore Xpath con DomDocument PHP?

<ProdCategories> 
<ProdCategory> 

    <Id>138</Id> 

    <Name>Parent Category</Name> 

    <SubCategories> 

     <ProdCategory> 

      <Id>141</Id> 

      <Name>Category child</Name> 

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

il codice PHP:

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

La stampa è:

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) 

Il [parentNode] è (object value omitted), perché? Vorrei avere

<Id>138</Id> 

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

L'ultimo nodo impostato nella domanda denota l'output desiderato? L'espressione Xpath può essere riscritta come '// ProdCategory [Id [. =" 141 "]]', funziona? – collapsar

+0

@collapsar grazie per la risposta. No, non funziona. L'ultimo nodo nella mia domanda è quello che voglio. – Eliana

+2

@collapsar - o anche '// ProdCategory [Id =" 141 "]' –

risposta

0

Tratti appena i nodi query XPath come percorsi di file system, come detto here

Sposta su 2 nodi e ottenere il genitore e ottenere quello che ti serve da esso, come l'ID o il nome.

Esempio:

<?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

Il [parentNode] è (object value omitted), perché?

Questo perché si utilizza il print_r function e crea una tale uscita (via an internal helper function of the dom extension). La riga in codice che sta creando questo è:

print_r($nodes); 

la stringa "(object value omitted)" è dato dal DOMNode quando una print_r o var_dump sono utilizzati su di esso. Ti informa che l'oggetto del valore di tale campo (denominato parentNode) non viene visualizzato ma omesso.

Da quel messaggio si può concludere che il campo ha un valore che è un oggetto. Un semplice controllo per il nome della classe potrebbe verificare questo:

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

Confronti che, con i campi che sono un numero intero o una stringa (vuoto):

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

Quindi spero che questo libera per voi . Basta accedere al campo per ottenere l'oggetto nodo genitore:

$parent = $nodes->parentNode; 

e fatto.

Se ti chiedi di una determinata stringa che PHP ti dà e hai la sensazione che potrebbe essere qualcosa di interno, puoi cercare rapidamente tutto il codice di PHP su http://lxr.php.net/, here is an example query for the string in your question.

Problemi correlati