為什麼不直接
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 | 當傳入非 XML 或非 HTML 的 node 時,此函式現在會拋出 TypeError,而不是 ValueError。 |
範例 #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>一些文字在 <em>斜體 </em>之前和之後。</p></body>";
$dom = new DOMDocument;
$dom->loadHTML($text);
$result = simplexml_import_dom($dom);
echo $result->p;
//////////////////////
//印出
//一些文字在之前和之後。
print_r($result->p);
//印出
//SimpleXMLElement 物件 ( [em] => 斜體 )
print_r($result->p->em)
//作用大致相同
//SimpleXMLElement 物件 ( [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 物件的陣列