Доступ к родительскому элементу элемента с помощью SimpleXML PHP?

Я выполняю итерацию через набор объектов SimpleXML, и я не могу понять, как получить доступ к родительскому узлу каждого объекта. Вот что я хочу:

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

Похоже, должен быть довольно простой способ сделать это.

Вы можете запустить простой запрос XPath, чтобы получить его:

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

И поскольку это Simplexml, и он имеет только узлы элементов и атрибутов, а родительский узел может быть только элементом и никогда не является атрибутом, может использоваться сокращенный синтаксис:

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

(через: Common Xpath Cheats – SimpleXML Type Cheatsheet (февраль 2013 г. by hakre) )

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

Обратите внимание, что вы можете расширить SimpleXML, чтобы сделать это. Например:

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

И теперь все, что вам нужно сделать, это изменить код, который вы используете для создания вашего SimpleXMLElement, в первую очередь:

 $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'); 

Самое приятное то, что SimpleXML автоматически и прозрачно возвращает объекты my_xml для этого документа, поэтому вам не нужно ничего менять, что делает ваш метод get_parent_node() целым:

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

Если используется память, вызов xpath() возвращает один или несколько SimpleXMLElements . Если это так, то вы можете использовать что-то вроде:

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