dom_import_simplexml

(PHP 5, PHP 7, PHP 8)

dom_import_simplexmlSimpleXMLElement 对象获取 DOMElement 对象

描述

dom_import_simplexml(object $node): DOMElement

此函数获取类为 SimpleXML 的节点 node 并将其转换为 DOMElement 节点。 然后可以将这个新对象用作本地的 DOMElement 节点。

参数

node

The SimpleXMLElement 节点。

返回值

添加的 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();

?>

参见

添加笔记

用户贡献的笔记 5 notes

13
crescentfreshpot at yahoo dot com
16 年前
justinpatrin at php dot net
> 为了获得一个完整的 DOM 文档(大多数情况下都需要),你需要...

不需要。只需执行
<?php
$dom
= dom_import_simplexml($xml)->ownerDocument;
?>
3
h4ss4n3 at hyj4z1 dot me
3 年前
// 无需在示例 #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();

?>
9
Jeff M
15 年前
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 方法。

瞧!您的望远镜变成了双筒望远镜!
0
justinpatrin at php dot net
18 年前
我发现,较新版本的 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);
?>
-1
biniou at yopmail dot com
8 年前
使用 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;
}
}
To Top