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

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

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

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

21
задан thisismyname 1 February 2010 в 01:57
поделиться

3 ответа

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

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

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

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

(через: общие читы XPath - Cheatsheet типа Simplexml (Feb 2013; Hakre) )

37
ответ дан 29 November 2019 в 06:34
поделиться

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

$div->xpath( '..' );
# or
$div->xpath( 'parent::*' );
6
ответ дан 29 November 2019 в 06:34
поделиться

$ div-> get_parent_node (); // К сожалению, такой функции нет.

Обратите внимание, что для этого можно расширить 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();
20
ответ дан 29 November 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: