Access an element's parent with PHP's SimpleXML?

前端 未结 3 1573
半阙折子戏
半阙折子戏 2020-12-09 09:30

I\'m iterating through a set of SimpleXML objects, and I can\'t figure out how to access each object\'s parent node. Here\'s what I want:

$divs = simplexml-         


        
相关标签:
3条回答
  • 2020-12-09 10:07

    If memory serves, an xpath() call returns one or more SimpleXMLElements. If that's the case, then you may be able to use something like:

    $div->xpath( '..' );
    # or
    $div->xpath( 'parent::*' );
    
    0 讨论(0)
  • 2020-12-09 10:17

    You could run a simple XPath query to get it:

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

    And as this is Simplexml and it only has element and attribute nodes and a parent node can only be an element and never an attribute, the abbreviated syntax can be used:

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

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

    0 讨论(0)
  • 2020-12-09 10:24

    $div->get_parent_node(); // Sadly, there's no such function.

    Note that you can extend SimpleXML to make it so. For example:

    class my_xml extends SimpleXMLElement
    {
        public function get_parent_node()
        {
            return current($this->xpath('parent::*'));
        }
    }
    

    And now all you have to do is modify the code you use to create your SimpleXMLElement in the first place:

    $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');
    

    The best part is that SimpleXML will automatically and transparently return my_xml objects for this document, so you don't have to change anything else, which makes your get_parent_node() method chainable:

    // returns $grandchild's parent's parent
    $grandchild->get_parent_node()->get_parent_node();
    
    0 讨论(0)
提交回复
热议问题