DOMDocument 採用樹狀結構,逐節點構建,適合複雜 XML 生成。
<?php
function generateXML() {
// 1. 建立 DOM 文檔
$dom = new DOMDocument("1.0", "UTF-8");
// 2. 創建根節點
$root = $dom->createElement("recommend");
$dom->appendChild($root);
// 3. 迴圈添加子節點
foreach ($data as $item) {
$entry = $dom->createElement("entry");
$root->appendChild($entry);
// 子節點
$simgurl = $dom->createElement("simgurl");
$imgurl = $dom->createElement("imgurl");
$fileurl = $dom->createElement("fileurl");
$entry->appendChild($simgurl);
$entry->appendChild($imgurl);
$entry->appendChild($fileurl);
// 文本節點
$simgurl->appendChild($dom->createTextNode($item[0]));
$imgurl->appendChild($dom->createTextNode($item[1]));
$fileurl->appendChild($dom->createTextNode($item[2]));
}
// 4. 輸出
header("Content-Type: text/xml; charset=UTF-8");
echo $dom->saveXML();
}
?>
<?php
$xmlString = <<<XML
<?xml version="1.0"?>
<document>
<title>Forty What?</title>
<from>Joe</from>
<to>Jane</to>
<body>I know the answer -- but what's the question?</body>
</document>
XML;
$xml = simplexml_load_string($xmlString);
var_dump($xml);
/* 輸出:
object(SimpleXMLElement)#1 (4) {
["title"]=> string(10) "Forty What?"
["from"]=> string(3) "Joe"
["to"]=> string(4) "Jane"
["body"]=> string(46) "I know the answer -- but what's the question?"
}
*/
?>
$xml = simplexml_load_file('data.xml');
echo $xml->title; // 直接屬性存取
<?php
function xmlToArray($xmlString) {
$array = (array) simplexml_load_string($xmlString, 'SimpleXMLElement', LIBXML_NOCDATA);
foreach ($array as $key => $item) {
$array[$key] = structToArray($item);
}
return $array;
}
function structToArray($item) {
if (!is_string($item)) {
$item = (array) $item;
foreach ($item as $key => $val) {
$item[$key] = structToArray($val);
}
}
return $item;
}
?>
| 場景 | 推薦 | 理由 |
|---|---|---|
| 大型 XML 生成 | DOMDocument | 記憶體效率高,支援複雜結構 |
| 簡單 XML 讀取 | SimpleXML | 語法直觀,屬性存取如物件 |
| XPath 查詢 | DOMDocument | 支援 DOMXPath |
| 大檔案串流處理 | XMLReader | 拉式解析,低記憶體 |
| 需修改現有 XML | DOMDocument | 完整的節點操作 API |
new DOMDocument("1.0", "UTF-8")header("Content-Type: application/xml; charset=UTF-8")iconv 轉換