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 — Transforme un objet SimpleXMLElement en un objet DOMElement
Cette fonction prend l'attribut ou l'élément donné node
(une
instance de SimpleXMLElement) et crée respectivement un nœud
DOMAttr ou DOMElement.
Le nouveau DOMNode fait référence au même nœud XML sous-jacent
que le SimpleXMLElement.
node
L'attribut ou l'élément nœud à importer (une instance de SimpleXMLElement).
Le DOMAttr ou DOMElement.
Version | Description |
---|---|
8.0.0 |
Cette fonction ne retourne désormais plus null en cas d'échec.
|
Exemple #1 Importation d'un objet SimpleXML dans DOM avec dom_import_simplexml()
<?php
$sxe = simplexml_load_string('<books><book><title>blah</title></book></books>');
if ($sxe === false) {
echo 'Erreur lors de l\'analyse du document';
exit;
}
$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);
echo $dom->saveXML();
?>
L'exemple ci-dessus va afficher :
<?xml version="1.0"?> <books><book><title>blah</title></book></books>
Exemple #2 Importer SimpleXML dans DOM et modifier SimpleXML via DOM
La gestion des erreurs est omise pour des raisons de concision.
<?php
$sxe = simplexml_load_string('<books><book><title>blah</title></book></books>');
$elt = dom_import_simplexml($sxe);
$elt->setAttribute("foo", "bar");
echo $sxe->asXML();
?>
L'exemple ci-dessus va afficher :
<?xml version="1.0"?> <books foo="bar"><book><title>blah</title></book></books>
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) :
<?php
class 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;
}
}