Dostęp do elementu macierzystego za pomocą PHP SimplexML?


Zapętlam zestaw obiektów SimpleXML i nie mogę dowiedzieć się, jak uzyskać dostęp do węzła nadrzędnego każdego obiektu. To jest to czego chcę:
$divs = simplexml->xpath("//div");
foreach ($divs as $div)
{
$parent_div = $div->get_parent_node();// Sadly, there's no such function.
}

Wydaje się, że powinno być dość prosty sposób.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby go uzyskać, możesz uruchomić proste zapytanie XPath:
$parent_div = $div->xpath("parent::*");

A ponieważ jest to Simplexml i ma tylko węzły elementów i atrybutów, a węzeł nadrzędny może być tylko elementem, a nigdy atrybutem, możesz użyć skróconej składni:
$parent_div = $div->xpath("..");

(przez:
popularne kody Xpath - typ arkusza cheatów SimpleXML (luty 2013; autor: hakre
http://hakre.wordpress.com/201 ... heet/ ) )
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

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

Zauważ, że możesz rozszerzyć SimpleXML, aby zrobić to w ten sposób. 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 zmienić kod, którego używasz, aby najpierw utworzyć swój simplexMLemelement:
$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 przejrzyście zwraca obiekty
my_xml
dla tego dokumentu, więc nie musisz niczego zmieniać, co sprawia, że ​​metoda
get_parent_node ()
jest połączona łańcuchowo:
// returns $grandchild's parent's parent
$grandchild->get_parent_node()->get_parent_node();
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli pamięć nie zmienia się, zadzwoń
XPath ()
Zwraca jeden lub więcej
SimplexMlelemLements
. Jeśli tak, możesz użyć czegoś takiego:
$div->xpath( '..' );
# or
$div->xpath( 'parent::*' );

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się