使用 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 选择其他元素中的数据
在 SimpleXML for PHP 中删除具有特定属性的子项