Why not just:simplexml_import_dom(dom_import_simplexml($SimpleXmlNode))
(PHP 5, PHP 7, PHP 8)
simplexml_import_dom —
Получает объект класса SimpleXMLElement
из узла XML или HTML
$node
, ?string $class_name
= SimpleXMLElement::class): ?SimpleXMLElementФункция берет узел документа DOM и превращает его в узел SimpleXML. Затем этот новый объект может быть использован как первичный элемент SimpleXML.
node
Узел-элемент DOM
class_name
Разрешается использовать этот дополнительный параметр, чтобы функция simplexml_import_dom() возвращала объект заданного класса. Этот класс должен расширять класс SimpleXMLElement.
Функция возвращает объект класса SimpleXMLElement или null
, если возникла ошибка.
Выбрасывает ошибку TypeError, если переданный
узел node
не XML и не HTML.
Версия | Описание |
---|---|
8.4.0 | Добавлена поддержка Dom\Document. |
8.4.0 |
Функция теперь выбрасывает ошибку TypeError
вместо ValueError,
если переданный узел node не XML и не HTML.
|
Пример #1 Импорт DOMDocument
<?php
$dom = new DOMDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!$dom) {
echo 'Error while parsing the document';
exit;
}
$s = simplexml_import_dom($dom);
echo $s->book[0]->title;
?>
Результат выполнения приведённого примера:
blah
Пример #2 Импорт Dom\Document
<?php
$dom = Dom\XMLDocument::createFromString('<books><book><title>blah</title></book></books>');
$s = simplexml_import_dom($dom);
echo $s->book[0]->title;
?>
Результат выполнения приведённого примера:
blah
Why not just:simplexml_import_dom(dom_import_simplexml($SimpleXmlNode))
/*If tags in DOM have text and some part of this text is surrounded by other tag, simple_import_dom object doesn't contain position of child tag, so rendering it back to html/xml can be a problem. Printing such a node is also peculiar. Eg.*///////////////////////$text = "<body><p>Some text before <em>italic </em>and after text.</p></body>";$dom = new DOMDocument;$dom->loadHTML($text);$result = simplexml_import_dom($dom);echo $result->p;////////////////////////Prints ://Some text before and after text.print_r($result->p);//Prints://SimpleXMLElement Object ( [em] => italic )print_r($result->p->em)//does more or less the same://SimpleXMLElement Object ( [0] => italic )var_dump($result->p);//Prints://object(SimpleXMLElement)#8 (1) { ["em"]=> string(7) "italic " }var_dump($result->p->em)//object(SimpleXMLElement)#9 (1) { [0]=> string(7) "italic " }//butecho $result->p->em;//prints://italic
simplexml_import_dom() will accept DOMNodes or other SimpleXMLElements. This has a useful purpose if you are extending the SimpleXMLElement class and would prefer the xpath() method to return your class extension instead of basic SimpleXMLElements. For example:class MySimpleXML extends SimpleXMLElement{ public function xpath($xpath){ $return = array(); $simpleXmls = parent::xpath($xpath); // run SimpleXMLElement xpath, returning an array of SimpleXMLElements foreach($simpleXmls as $xml){ $return[] = simplexml_import_dom($xml,'MySimpleXML'); // copy SimpleXMLElement, returning as MySimpleXML instance } return $return; }}Now I can create an instance of MySimpleXML, run an xpath, and get my results back as an array of MySimpleXML elements instead of the native SimpleXMLElement:$mySimpleXml = new mySimpleXml('<root><node/></root>');$array = $mySimpleXml->xpath('/root/node'); // returns array with a single MySimpleXml object