2015-07-10 34 views
7

Potrzebuję uzyskać nadrzędnego określonego węzła w php. Używam DomDocument i Xpath. Moje xml jest taka:Pobierz węzeł nadrzędny Xpath z DomDocument PHP?

<ProdCategories> 
<ProdCategory> 

    <Id>138</Id> 

    <Name>Parent Category</Name> 

    <SubCategories> 

     <ProdCategory> 

      <Id>141</Id> 

      <Name>Category child</Name> 

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

Kod 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); 

Wydruk jest:

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) 

[parentNode] jest (object value omitted), dlaczego? Chciałbym dostać

<Id>138</Id> 

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

Czy ostatni węzeł określony w pytaniu oznacza pożądany wynik? Twoje wyrażenie Xpath można przepisać jako '// ProdCategory [Id [. =" 141 "]]", czy to działa? – collapsar

+0

@collapsar dziękuję za odpowiedź. Nie, nie działa. Ostatni węzeł w moim pytaniu jest tym, czego chcę. – Eliana

+2

@collapsar - lub nawet '// ProdCategory [Id =" 141 "]' –

Odpowiedz

0

Wystarczy leczyć węzły kwerendę XPath jako ścieżki systemu plików, jak wspomniano here

Move Up 2 węzły i uzyskać rodzica i dostać to, czego potrzebujemy od niego, takie jak ID lub nazwy.

Przykład:

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

[parentNode] jest (object value omitted), dlaczego?

To dlatego, że używasz print_r function i tworzy takie wyjście (via an internal helper function of the dom extension). Linia w kodzie, który jest tworzenie to:

print_r($nodes); 

Ciąg „(object value omitted)” jest podana przez DOMNode gdy albo print_r lub var_dump służą na nim. Informuje on, że wartość obiektu o wartości tego pola (o nazwie parentNode) nie jest wyświetlana, ale jest pomijana.

Z tej wiadomości można wywnioskować, że pole ma wartość będącą obiektem. Prosta kontrola za nazwa-klasy mógłby to sprawdzić:

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

Porównaj to z dziedzin, które są liczbą całkowitą lub (pusty) ciąg:

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

Więc mam nadzieję, że to czyści go dla Ciebie . Wystarczy uzyskać dostęp do pola, aby uzyskać obiekt węzła nadrzędnego:

$parent = $nodes->parentNode; 

i gotowe.

Jeśli zastanawiasz się nad jakimś łańcuchem, który daje ci PHP i masz przeczucie, że może to być coś wewnętrznego, możesz szybko przeszukać cały kod PHP na http://lxr.php.net/, here is an example query for the string in your question.