2010-01-19 13 views

Respuesta

20

Como se ha mencionado, SimpleXML no admite que lo que tendría que utilizar DOM. Esto es lo que recomiendo: extender SimpleXMLElement con lo que necesite para usar en sus programas. De esta forma, puedes mantener toda la manipulación DOM y otra magia XML fuera de tu programa real. Al mantener los dos asuntos separados, mejora la legibilidad y la capacidad de mantenimiento.

Aquí es cómo extender SimpleXMLElement con un nuevo método de prependChild():

class my_node extends SimpleXMLElement 
{ 
    public function prependChild($name, $value) 
    { 
     $dom = dom_import_simplexml($this); 

     $new = $dom->insertBefore(
      $dom->ownerDocument->createElement($name, $value), 
      $dom->firstChild 
     ); 

     return simplexml_import_dom($new, get_class($this)); 
    } 
} 

$actors = simplexml_load_string(
    '<actors> 
     <actor>Al Pacino</actor> 
     <actor>Zsa Zsa Gabor</actor> 
    </actors>', 
    'my_node' 
); 

$actors->addChild('actor', 'John Doe - last'); 
$actors->prependChild('actor', 'John Doe - first'); 

die($actors->asXML()); 
+0

excelente respuesta. – understack

+0

Exactamente lo que estaba buscando - gracias –

+0

Llamada al método indefinido SimpleXMLElement :: prependChild() – user254153

5

No se ve como SimpleXML soporta hacer eso, por lo que tiene dos opciones:

  1. utilizar el módulo DOM en lugar (o uno de los otros módulos XML, probablemente), y el uso de la DOMNode::insertBefore method, o

  2. Cree un nuevo elemento SimpleXMLElement, copie los atributos, luego agregue su nuevo nodo, luego agregue todos los elementos secundarios de su nodo original y luego reemplace el original con el nuevo.

actualización: Después de un poco más mirando a través de los documentos, me gustaría sugerir algo como lo siguiente (suponiendo que todavía quiere seguir con SimpleXML en su mayor parte, de lo contrario, sólo tiene que utilizar directamente para DOM todo):

$dom_elem = dom_import_simplexml($simple_xml_element); 
$dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild); 
+0

ya utilizo segundo enfoque. Pero parecía feo, así que pensé en pedir mejores alternativas. – understack

2

Suponiendo que usted puede utilizar la función insert_before podría utilizar la siguiente función:

función prependChild (padre, nodo) { parent.insertBefore (node, parent.firstChild); referencia }

Fuente: XML Matters: Beyond the DOM

+0

+1 para la definición de función – understack

Cuestiones relacionadas