justinpatrin at php dot net:> To get a proper DOM document (which you need to do most things) you need...No you don't. Just do: <?php$dom = dom_import_simplexml($xml)->ownerDocument;?>
(PHP 5, PHP 7, PHP 8)
dom_import_simplexml — Obtiene un objeto DOMElement desde un objeto SimpleXMLElement
Esta función toma el nodo node
de la clase
SimpleXML y lo convierte en un
nodod DOMElement. Este nuevo objeto se puede usar
como un nodo DOMElement nativo.
El nodo DOMElement añdido.
Versión | Descripción |
---|---|
8.0.0 |
Esta función ya no devuelve null en caso de fallo.
|
Ejemplo #1 Importar SimpleXML a DOM con dom_import_simplexml()
<?php
$sxe = simplexml_load_string('<books><book><title>blah</title></book></books>');
if ($sxe === false) {
echo 'Error al analizar el documento';
exit;
}
$dom_sxe = dom_import_simplexml($sxe);
if (!$dom_sxe) {
echo 'Error al convertir a XML';
exit;
}
$dom = new DOMDocument('1.0');
$dom_sxe = $dom->importNode($dom_sxe, true);
$dom_sxe = $dom->appendChild($dom_sxe);
echo $dom->saveXML();
?>
justinpatrin at php dot net:> To get a proper DOM document (which you need to do most things) you need...No you don't. Just do: <?php$dom = dom_import_simplexml($xml)->ownerDocument;?>
SimpleXML is an 'Object Mapping XML API'. It is not DOM, per se. SimpleXML converts the XML elements into PHP's native data types.The dom_import_simplexml and simplexml_import_dom functions do *not* create separate copies of the original object. You are free to use the methods of either or both interchangeably, since the underlying instance is the same.<?php // initialize a simplexml object $sxe = simplexml_load_string('<root/>'); // get a dom interface on the simplexml object $dom = dom_import_simplexml($sxe); // dom adds a new element under the root $element = $dom->appendChild(new DOMElement('dom_element')); // dom adds an attribute on the new element $element->setAttribute('creator', 'dom'); // simplexml adds an attribute on the dom element $sxe->dom_element['sxe_attribute'] = 'added by simplexml'; // simplexml adds a new element under the root $element = $sxe->addChild('sxe_element'); // simplexml adds an attribute on the new element $element['creator'] = 'simplexml'; // dom finds the simplexml element (via DOMNodeList->index) $element = $dom->getElementsByTagName('sxe_element')->item(0); // dom adds an attribute on the simplexml element $element->setAttribute('dom_attribute', 'added by dom'); echo ('<pre>'); print_r($sxe); echo ('</pre>');?>Outputs:SimpleXMLElement Object( [dom_element] => SimpleXMLElement Object ( [@attributes] => Array ( [creator] => dom [sxe_attribute] => added by simplexml ) ) [sxe_element] => SimpleXMLElement Object ( [@attributes] => Array ( [creator] => simplexml [dom_attribute] => added by dom ) ))What this illustrates is that both interfaces are operating on the same underlying object instance. Also, when you dom_import_simplexml, you can create and add new elements without reference to an ownerDocument (or documentElement).So passing a SimpleXMLElement to another method does not mean the recipient is limited to using SimpleXML methods. Hey Presto! Your telescope has become a pair of binoculars!
I've found that newer versions of PHP5 require some special syntax in order to properly convert between SimpleXML and DOM. It's not as easy as calling dom_import_simplexml() with a SimpleXML node. To get a proper DOM document (which you need to do most things) you need:<?php//$xml is a SimpleXML instance$domnode = dom_import_simplexml($xml);$dom = new DOMDocument();$domnode = $dom->importNode($domnode, true);$dom->appendChild($domnode);?>Switching back, though, is, well...simple.<?php//$dom is a DOMDocument instance$xml = simplexml_import_dom($dom);?>
//No need to initiate, import and append on example#1(...)$dom_sxe = dom_import_simplexml($sxe);if (!$dom_sxe) { echo 'Erreur lors de la conversion du XML'; exit;}//$dom = new DOMDocument('1.0');//$dom_sxe = $dom->importNode($dom_sxe, true);//$dom_sxe = $dom->appendChild($dom_sxe);//use ownerDocument propertie echo $dom->ownerDocument->saveXML();?>
Very useful to add a CDATA node with SimpleXMLElement (use it like addChild) :<?phpclass My_SimpleXMLElement extends SimpleXMLElement { public function addChildWithCData($name, $value = NULL) { $new_child = $this->addChild($name); $node = dom_import_simplexml($new_child); $no = $node->ownerDocument; $node->appendChild($no->createCDATASection($value)); return $new_child; }}