【问题标题】:Access an element's parent with PHP's SimpleXML?使用 PHP 的 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.
}

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

【问题讨论】:

    标签: php xml xpath simplexml


    【解决方案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::*' );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多