为什么不直接
simplexml_import_dom(dom_import_simplexml($SimpleXmlNode))
(PHP 5、PHP 7、PHP 8)
simplexml_import_dom — 从 XML 或 HTML 节点获取 SimpleXMLElement
对象
此函数获取 DOM 文档的节点并将其转换为 SimpleXML 节点。此新对象随后可用作本机 SimpleXML 元素。
node
一个 DOM 元素节点
class_name
您可以使用此可选参数,以便 simplexml_import_dom() 将返回指定类的对象。该类应扩展 SimpleXMLElement 类。
返回一个 SimpleXMLElement 或在失败时返回 null
。
当传递非 XML 或非 HTML node
时,会抛出 TypeError。
版本 | 描述 |
---|---|
8.4.0 | 此函数现在抛出 TypeError 而不是 ValueError,当传递非 XML 或非 HTML node 时。 |
示例 #1 导入 DOM
<?php
$dom = new DOMDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!$dom) {
echo '解析文档时出错';
exit;
}
$s = simplexml_import_dom($dom);
echo $s->book[0]->title;
?>
以上示例将输出
blah
为什么不直接
simplexml_import_dom(dom_import_simplexml($SimpleXmlNode))
/*如果 DOM 中的标签包含文本,并且该文本的一部分被其他标签包围,则 simple_import_dom 对象不包含子标签的位置,因此将其渲染回 html/xml 可能存在问题。打印此类节点也很奇怪。例如。*/
//////////////////////
$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;
//////////////////////
//打印
//Some text before and after text.
print_r($result->p);
//打印
//SimpleXMLElement Object ( [em] => italic )
print_r($result->p->em)
//或多或少做同样的事情
//SimpleXMLElement Object ( [0] => italic )
var_dump($result->p);
//打印
//object(SimpleXMLElement)#8 (1) { ["em"]=> string(7) "italic " }
var_dump($result->p->em)
//object(SimpleXMLElement)#9 (1) { [0]=> string(7) "italic " }
//但是
echo $result->p->em;
//打印
//italic
simplexml_import_dom() 将接受 DOMNodes 或其他 SimpleXMLElements。如果您正在扩展 SimpleXMLElement 类,并且希望 xpath() 方法返回您的类扩展而不是基本 SimpleXMLElements,则此功能很有用。例如
class MySimpleXML extends SimpleXMLElement{
public function xpath($xpath){
$return = array();
$simpleXmls = parent::xpath($xpath); // 运行 SimpleXMLElement xpath,返回一个 SimpleXMLElements 数组
foreach($simpleXmls as $xml){
$return[] = simplexml_import_dom($xml,'MySimpleXML'); // 复制 SimpleXMLElement,作为 MySimpleXML 实例返回
}
return $return;
}
}
现在我可以创建一个 MySimpleXML 实例,运行 xpath 并将结果作为 MySimpleXML 元素数组而不是本机 SimpleXMLElement 返回
$mySimpleXml = new mySimpleXml('<root><node/></root>');
$array = $mySimpleXml->xpath('/root/node'); // 返回包含单个 MySimpleXml 对象的数组