justinpatrin at php dot net
> 为了获得一个完整的 DOM 文档(大多数情况下都需要),你需要...
不需要。只需执行
<?php
$dom = dom_import_simplexml($xml)->ownerDocument;
?>
(PHP 5, PHP 7, PHP 8)
dom_import_simplexml — 从 SimpleXMLElement 对象获取 DOMElement 对象
此函数获取类为 SimpleXML 的节点 node
并将其转换为 DOMElement 节点。 然后可以将这个新对象用作本地的 DOMElement 节点。
添加的 DOMElement 节点。
版本 | 描述 |
---|---|
8.0.0 | 此函数在失败时不再返回 null 。 |
示例 #1 使用 dom_import_simplexml() 将 SimpleXML 导入 DOM
<?php
$sxe = simplexml_load_string('<books><book><title>blah</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();
?>
justinpatrin at php dot net
> 为了获得一个完整的 DOM 文档(大多数情况下都需要),你需要...
不需要。只需执行
<?php
$dom = dom_import_simplexml($xml)->ownerDocument;
?>
// 无需在示例 #1 中进行初始化、导入和追加
(...)
$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);
// 使用 ownerDocument 属性
echo $dom->ownerDocument->saveXML();
?>
SimpleXML 是一个“对象映射 XML API”。它本身不是 DOM。 SimpleXML 将 XML 元素转换为 PHP 的原生数据类型。
dom_import_simplexml 和 simplexml_import_dom 函数 *不会* 创建原始对象的单独副本。您可以自由地交替使用任一或两个接口的方法,因为底层实例是相同的。
<?php
// 初始化 SimpleXML 对象
$sxe = simplexml_load_string('<root/>');
// 获取 SimpleXML 对象上的 DOM 接口
$dom = dom_import_simplexml($sxe);
// DOM 在根元素下添加一个新元素
$element = $dom->appendChild(new DOMElement('dom_element'));
// DOM 在新元素上添加一个属性
$element->setAttribute('creator', 'dom');
// SimpleXML 在 DOM 元素上添加一个属性
$sxe->dom_element['sxe_attribute'] = 'added by simplexml';
// SimpleXML 在根元素下添加一个新元素
$element = $sxe->addChild('sxe_element');
// SimpleXML 在新元素上添加一个属性
$element['creator'] = 'simplexml';
// DOM 查找 SimpleXML 元素(通过 DOMNodeList->index)
$element = $dom->getElementsByTagName('sxe_element')->item(0);
// DOM 在 SimpleXML 元素上添加一个属性
$element->setAttribute('dom_attribute', 'added by dom');
echo ('<pre>');
print_r($sxe);
echo ('</pre>');
?>
输出
SimpleXMLElement 对象
(
[dom_element] => SimpleXMLElement 对象
(
[@attributes] => 数组
(
[creator] => dom
[sxe_attribute] => added by simplexml
)
)
[sxe_element] => SimpleXMLElement 对象
(
[@attributes] => 数组
(
[creator] => simplexml
[dom_attribute] => added by dom
)
)
)
这说明两个接口都在操作同一个底层对象实例。 此外,当您使用 dom_import_simplexml 时,您可以在没有 ownerDocument(或 documentElement)引用情况下创建和添加新元素。
因此,将 SimpleXMLElement 传递给其他方法并不意味着接收者只能使用 SimpleXML 方法。
瞧!您的望远镜变成了双筒望远镜!
我发现,较新版本的 PHP5 需要一些特殊的语法才能在 SimpleXML 和 DOM 之间正确转换。 这不像使用 SimpleXML 节点调用 dom_import_simplexml() 那样简单。 为了获得一个完整的 DOM 文档(大多数情况下都需要),你需要
<?php
//$xml 是一个 SimpleXML 实例
$domnode = dom_import_simplexml($xml);
$dom = new DOMDocument();
$domnode = $dom->importNode($domnode, true);
$dom->appendChild($domnode);
?>
然而,切换回来很简单。
<?php
//$dom 是一个 DOMDocument 实例
$xml = simplexml_import_dom($dom);
?>
使用 SimpleXMLElement 添加 CDATA 节点非常有用(像 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;
}
}