dom_import_simplexml

(PHP 5, PHP 7, PHP 8)

dom_import_simplexml β€” ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса DOMAttr ΠΈΠ»ΠΈ DOMElement ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса SimpleXMLElement

ОписаниС

function dom_import_simplexml(object $node): DOMAttr|DOMElement

Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈΠ»ΠΈ элСмСнт node (экзСмпляр класса SimpleXMLElement) ΠΈ создаёт ΡƒΠ·Π΅Π» DOMAttr ΠΈΠ»ΠΈ DOMElement, соотвСтствСнно. Новый DOMNode ссылаСтся Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ XML-ΡƒΠ·Π΅Π», Ρ‡Ρ‚ΠΎ ΠΈ SimpleXMLElement.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

node

Π£Π·Π΅Π» Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΈΠ»ΠΈ элСмСнта для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° (экзСмпляр SimpleXMLElement).

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ DOMAttr ΠΈΠ»ΠΈ DOMElement.

Бписок измСнСний

ВСрсия ОписаниС
8.0.0 Ѐункция большС Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ null Π² случаС возникновСния ошибки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 Π˜ΠΌΠΏΠΎΡ€Ρ‚ SimpleXML Π² DOM с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dom_import_simplexml()

<?php

$sxe
= simplexml_load_string('<books><book><title>Ρ‡Π΅ΠΏΡƒΡ…Π°</title></book></books>');

if (
$sxe === false) {
echo
'Ошибка ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°';
exit;
}

$dom_sxe = dom_import_simplexml($sxe);
if (!
$dom_sxe) {
echo
'Ошибка ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ XML';
exit;
}

$dom = new DOMDocument('1.0');
$dom_sxe = $dom->importNode($dom_sxe, true);
$dom_sxe = $dom->appendChild($dom_sxe);

echo
$dom->saveXML();

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

<?xml version="1.0"?>
<books><book><title>blah</title></book></books>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 Π˜ΠΌΠΏΠΎΡ€Ρ‚ SimpleXML Π² DOM ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ SimpleXML Ρ‡Π΅Ρ€Π΅Π· DOM

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΎΠΏΡƒΡ‰Π΅Π½Π° для краткости.

<?php

$sxe
= simplexml_load_string('<books><book><title>blah</title></book></books>');
$elt = dom_import_simplexml($sxe);
$elt->setAttribute("foo", "bar");
echo
$sxe->asXML();

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

<?xml version="1.0"?>
<books foo="bar"><book><title>blah</title></book></books>

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

  • simplexml_import_dom() - ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса SimpleXMLElement ΠΈΠ· ΡƒΠ·Π»Π° XML ΠΈΠ»ΠΈ HTML
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 5 notes

up
13
crescentfreshpot at yahoo dot com ΒΆ
18 years ago
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;
?>
up
3
h4ss4n3 at hyj4z1 dot me ΒΆ
5 years ago
//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();

?>
up
9
Jeff M ΒΆ
17 years ago
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!
up
0
justinpatrin at php dot net ΒΆ
20 years ago
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);
?>
up
-1
biniou at yopmail dot com ΒΆ
10 years ago
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;
    }
}