在 Zend Framework 等 MVC 框架中,常需將數據庫查詢結果輸出為標準 XML 供前端或第三方接口消費。DOMDocument 提供了結構化、編碼安全的構建方式。
<?xml version="1.0" encoding="UTF-8"?>
<data>
<project id="1"><![CDATA[Docker JCP1]]></project>
<project id="2"><![CDATA[Docker JCP2]]></project>
...
</data>
<?php
class TestController extends Zend_Controller_Action
{
public function projectAction()
{
// 1. 初始化 DOMDocument,指定版本與編碼
$dom = new DOMDocument('1.0', 'utf-8');
// 2. 創建根節點 <data>
$root = $dom->createElement('data');
$dom->appendChild($root);
// 3. 模擬從數據庫獲取的數據集
$list = [
['project_id' => 1, 'name' => 'Docker JCP1'],
['project_id' => 2, 'name' => 'Docker JCP2'],
// ... 更多記錄
];
// 4. 遍歷數據構建子節點
foreach ($list as $project_item) {
// 4.1 創建 <project> 元素
$projectNode = $dom->createElement('project');
$root->appendChild($projectNode);
// 4.2 添加 CDATA 區段(保護特殊字符)
$cdata = $dom->createCDATASection($project_item['name']);
$projectNode->appendChild($cdata);
// 4.3 創建並設置 id 屬性
$idAttr = $dom->createAttribute('id');
$projectNode->appendChild($idAttr);
// 4.4 為屬性節點創建文本值
$idValue = $dom->createTextNode($project_item['project_id']);
$idAttr->appendChild($idValue);
}
// 5. 輸出 XML
$output = $dom->saveXML();
// 6. 設置響應頭並禁用佈局(Zend Framework 特有)
$this->_response->setHeader('Content-Type', 'text/xml; charset=utf-8')
->setBody($output);
$this->_helper->layout->disableLayout();
}
}
?>
createElement,純文本用 createTextNode,CDATA 用 createCDATASection。createAttribute('name') → appendChild 到元素 → createTextNode('value') → appendChild 到屬性節點。'utf-8',配合 saveXML() 自動處理實體轉義,CDATA 區段內容不轉義。$dom->save('projects.xml'); // 直接寫入文件系統
$dom->formatOutput = true;
$output = $dom->saveXML();
$pi = $dom->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="style.xsl"');
$dom->insertBefore($pi, $root);
XMLWriter (流式寫入) 降低內存峰值。$dom->schemaValidate('schema.xsd')。Cache-Control、ETag 減少重複生成。