Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

(через: Общие коды XTP - SimpleXML Type Cheatsheet (февраль 2013 г. by hakre))

Ответ 2

$div->get_parent_node(); // Sadly, there 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 parent parent
$grandchild->get_parent_node()->get_parent_node();

Ответ 3

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

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