• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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 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;
      }
    }