使用PHP的SimpleXML访问元素的父级?
我正在迭代一组 SimpleXML 对象,但我无法弄清楚如何访问每个对象的父节点。这是我想要的:
$divs = simplexml->xpath("//div");
foreach ($divs as $div)
{
$parent_div = $div->get_parent_node(); // Sadly, there's no such function.
}
似乎必须有一个相当简单的方法来做到这一点。
我正在迭代一组 SimpleXML 对象,但我无法弄清楚如何访问每个对象的父节点。这是我想要的:
$divs = simplexml->xpath("//div");
foreach ($divs as $div)
{
$parent_div = $div->get_parent_node(); // Sadly, there's no such function.
}
似乎必须有一个相当简单的方法来做到这一点。
您可以运行一个简单的 XPath 查询来获取它:
$parent_div = $div->xpath("parent::*");
由于这是Simplexml,它只有元素和属性节点,而父节点只能是元素,而不能是属性,因此可以使用缩写语法:
$parent_div = $div->xpath("..");
(via: Common Xpath Cheats - SimpleXML Type Cheatsheet (Feb 2013; by hakre) )
$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();