2010-02-01 3 views
19

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

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

Похоже, что для этого достаточно простой способ.

ответ

35

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

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

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

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

(с помощью: Common Xpath Cheats - SimpleXML Type Cheatsheet (Feb 2013; by hakre))

+0

Будет ли этот метод ** всегда ** возвращать одного родителя? Я замечаю, что возвращает массив. – mrClean

6

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

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

$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(); 
+0

Удивительный, Джош ... очень освещающий. Я уверен, что буду использовать это в будущем для всех видов вещей! – thisismyname

+0

Спасибо, Джош - очень полезно. – halfer

Смежные вопросы