2010-02-01 11 views
19

Jestem Iterowanie przez zestaw obiektów SimpleXML i nie mogę dowiedzieć się, jak uzyskać dostęp do węzła nadrzędnego obiektu każdego. Oto, czego chcę:Dostęp do elementu nadrzędnego elementu za pomocą PHP SimpleXML?

$divs = simplexml->xpath("//div"); 
foreach ($divs as $div) 
{ 
    $parent_div = $div->get_parent_node(); // Sadly, there's no such function. 
} 

Wydaje się, że musi być dość łatwy sposób to zrobić.

Odpowiedz

35

Można uruchomić prostą kwerendę XPath je zdobyć:

$parent_div = $div->xpath("parent::*"); 

I jak to SimpleXML i ma tylko element i węzły atrybutów oraz węzeł nadrzędny może być tylko elementem i nigdy atrybutem The Składnia skrócie można stosować:

$parent_div = $div->xpath(".."); 

(poprzez: Common Xpath Cheats - SimpleXML Type Cheatsheet (Feb 2013; by hakre))

+0

będzie to metoda ** zawsze ** zwraca jednego rodzica? Zauważam, że zwraca tablicę. – mrClean

6

Jeżeli pamięć służy xpath() połączenia zwraca jeden lub więcej SimpleXMLElements. Jeśli o to chodzi, to może być w stanie używać coś takiego:

$div->xpath('..'); 
# or 
$div->xpath('parent::*'); 
20

$div->get_parent_node(); // Sadly, there's no such function.

pamiętać, że można przedłużyć SimpleXML, aby tak było. Na przykład:

class my_xml extends SimpleXMLElement 
{ 
    public function get_parent_node() 
    { 
     return current($this->xpath('parent::*')); 
    } 
} 

A teraz wszystko co musisz zrobić, to zmodyfikować kod używany do tworzenia SimpleXMLElement w pierwszej kolejności:

$foo = new SimpleXMLElement('<foo/>'); 
// becomes 
$foo = new my_xml('<foo/>'); 

$foo = simplexml_load_string('<foo/>'); 
// becomes 
$foo = simplexml_load_string('<foo/>', 'my_xml'); 

$foo = simplexml_load_file('foo.xml'); 
// becomes 
$foo = simplexml_load_file('foo.xml', 'my_xml'); 

Najlepsze jest to, że SimpleXML automatycznie i przejrzysty powrotu my_xml obiekty dla tego dokumentu, więc nie trzeba zmieniać niczego innego, co sprawia, że ​​get_parent_node() metody chainable:

// returns $grandchild's parent's parent 
$grandchild->get_parent_node()->get_parent_node(); 
+0

Awesome, Josh ... bardzo pouczające. Jestem pewien, że będę używał tego w przyszłości do różnych rzeczy! – thisismyname

+0

Dzięki Josh - bardzo przydatne. – halfer

Powiązane problemy