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

Posted

技术标签:

【中文标题】使用 PHP 的 SimpleXML 访问元素的父级?【英文标题】:Access an element's parent with PHP's SimpleXML? 【发布时间】:2011-01-11 13:39:09 【问题描述】:

我正在遍历一组 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("..");

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

【讨论】:

这个方法总是会返回一个父节点吗?我注意到它返回一个数组。 是的,xpath 返回一个数组,所以您需要在末尾添加后缀[0]??null 才能获取实际节点,如果不存在则为 null。【参考方案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_xml 对象,因此您无需更改任何其他内容,这使您的 get_parent_node() 方法可链接:

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

【讨论】:

太棒了,乔希……非常有启发性。我相信我将来会在各种事情上使用它! 感谢 Josh - 确实非常有用。【参考方案3】:

如果没记错的话,xpath() 调用会返回一个或多个 SimpleXMLElements。如果是这种情况,那么您可以使用类似的东西:

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

【讨论】:

以上是关于使用 PHP 的 SimpleXML 访问元素的父级?的主要内容,如果未能解决你的问题,请参考以下文章

PHP SimpleXML解析具有多个属性的元素

使用来自子元素的数据在 php 中使用 simplexml 选择其他元素中的数据

在 SimpleXML for PHP 中删除具有特定属性的子项

PHP 的 SimpleXML 不保持不同元素类型之间的顺序

PHP 5 SimpleXML 函数

雷林鹏分享:PHP SimpleXML