2010-02-01 11 views
19

Estoy iterando a través de un conjunto de objetos SimpleXML, y no puedo averiguar cómo acceder al nodo principal de cada objeto. Esto es lo que quiero:¿Tiene acceso al elemento principal de un elemento con SimpleXML de PHP?

$divs = simplexml->xpath("//div"); 
foreach ($divs as $div) 
{ 
    $parent_div = $div->get_parent_node(); // Sadly, there's no such function. 
} 

Parece que debe haber una manera bastante fácil de hacer esto.

Respuesta

35

Se puede ejecutar una consulta XPath simple de conseguirlo:

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

Y como esto es simplexml y que sólo tiene elementos y atributos nodos y un nodo padre solamente puede ser un elemento y nunca un atributo, el sintaxis abreviada se puede utilizar:

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

(a través de: Common Xpath Cheats - SimpleXML Type Cheatsheet (Feb 2013; by hakre))

+0

Will este método ** siempre ** devuelve uno de los padres? Me estoy dando cuenta de que devuelve una matriz. – mrClean

6

Si la memoria sirve, una llamada xpath() devuelve uno o más SimpleXMLElements. Si ese es el caso, entonces es posible que pueda usar algo como:

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

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

Tenga en cuenta que se puede extender SimpleXML para que así sea. Por ejemplo:

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

Y ahora todo lo que tiene que hacer es modificar el código que se utiliza para crear su SimpleXMLElement en el primer lugar:

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

La mejor parte es que SimpleXML volverá automáticamente y de forma transparente my_xml objetos de este documento, por lo que no tiene que cambiar nada más, lo que hace que su método de conexión en cadena get_parent_node():

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

Impresionante, Josh ... muy esclarecedor. ¡Estoy seguro de que usaré esto en el futuro para todo tipo de cosas! – thisismyname

+0

Gracias Josh - muy útil de hecho. – halfer

Cuestiones relacionadas