dom_import_simplexml()
(PHP 5, PHP 7)
Gets a DOMElement object from a SimpleXMLElement object
说明
dom_import_simplexml(SimpleXMLElement$node): DOMElement
This function takes the node$nodeof class SimpleXML and makes it into a DOMElement node. This new object can then be used as a native DOMElement node.
参数
- $node
The SimpleXMLElement node.
返回值
The DOMElement node added or FALSE if any errors occur.
范例
Example #1 Import SimpleXML into DOM with dom_import_simplexml()
<?php
$sxe = simplexml_load_string('<books><book><title>blah</title></book></books>');
if ($sxe === false) {
echo 'Error while parsing the document';
exit;
}
$dom_sxe = dom_import_simplexml($sxe);
if (!$dom_sxe) {
echo 'Error while converting XML';
exit;
}
$dom = new DOMDocument('1.0');
$dom_sxe = $dom->importNode($dom_sxe, true);
$dom_sxe = $dom->appendChild($dom_sxe);
echo $dom->saveXML();
?>
参见
simplexml_import_dom()Get a SimpleXMLElement object from a DOM node
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!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; ?>
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); ?>
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;
}
}