使用PHP的SimpleXML访问元素的父元素?

thi*_*ame 21 php xml xpath simplexml

我正在迭代一组SimpleXML对象,我无法弄清楚如何访问每个对象的父节点.这就是我想要的:

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

似乎必须有一个相当简单的方法来做到这一点.

nic*_*ckf 37

您可以运行一个简单的XPath查询来获取它:

$parent_div = $div->xpath("parent::*");
Run Code Online (Sandbox Code Playgroud)

因为这是Simplexml并且它只有元素和属性节点,而父节点只能是一个元素而不是一个属性,所以可以使用缩写语法:

$parent_div = $div->xpath("..");
Run Code Online (Sandbox Code Playgroud)

(来自:Common Xpath Cheats - SimpleXML Type Cheatsheet(2013年2月; by hakre))


Jos*_*vis 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::*'));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您所要做的就是首先修改用于创建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');
Run Code Online (Sandbox Code Playgroud)

最好的部分是SimpleXML将自动且透明地返回my_xml此文档的对象,因此您不必更改任何其他内容,这使您的get_parent_node()方法可链接:

// returns $grandchild's parent's parent
$grandchild->get_parent_node()->get_parent_node();
Run Code Online (Sandbox Code Playgroud)


Rob*_*son 6

如果内存服务,则xpath()呼叫返回一个或多个SimpleXMLElements.如果是这种情况,那么您可以使用以下内容:

$div->xpath( '..' );
# or
$div->xpath( 'parent::*' );
Run Code Online (Sandbox Code Playgroud)