PHP Conference Japan 2024

dom_import_simplexml

(PHP 5, PHP 7, PHP 8)

dom_import_simplexmlSimpleXMLElement 物件取得 DOMElement 物件

說明

dom_import_simplexml(物件 $node): DOMAttr|DOMElement

這個函數會取得給定的屬性或元素 node(一個 SimpleXMLElement 實例),並分別建立一個 DOMAttrDOMElement 節點。新的 DOMNode 會參照與 SimpleXMLElement 相同的底層 XML 節點。

參數

node

要導入的屬性或元素節點(一個 SimpleXMLElement 實例)。

返回值

DOMAttrDOMElement

更新日誌

版本 說明
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();

?>

上述範例將輸出

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

範例 #2 將 SimpleXML 導入 DOM 並透過 DOM 修改 SimpleXML

為簡潔起見,省略錯誤處理。

<?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>

另請參閱

新增註釋

使用者貢獻的註釋 5 則註釋

crescentfreshpot at yahoo dot com
16 年前
justinpatrin at php dot net
> 要取得一個正確的 DOM 文件(你需要做大部分的事情)你需要...

不,你不需要。只需這樣做
<?php
$dom
= dom_import_simplexml($xml)->ownerDocument;
?>
h4ss4n3 at hyj4z1 dot me
4 年前
//範例#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();

?>
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 方法。

嘿!您的望遠鏡變成了一副雙筒望遠鏡!
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);
?>
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