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

2022-08-30 18:47:16

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

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

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


答案 1

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

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

由于这是Simplexml,它只有元素和属性节点,而父节点只能是元素,而不能是属性,因此可以使用缩写语法:

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

(via: Common Xpath Cheats - SimpleXML Type Cheatsheet (Feb 2013; by hakre) )


答案 2

$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_xmlget_parent_node()

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

推荐