產生結構良好的 XML 文件是系統整合、API 介面、資料交換的常見需求。PHP DOMDocument 提供完整的 DOM API,能程式化建立元素、屬性、文字節點、CDATA 區段,並確保輸出符合 XML 規範。本文詳細示範建立含屬性、巢狀元素、CDATA 的 XML 文件全流程。
<?xml version="1.0" encoding="UTF-8"?>
<booklist>
<book id="1">
<title>天龍八部</title>
<author>金庸</author>
<content><![CDATA[ 天龍八部是金庸寫的一本武俠小說,非常好看! ]]></content>
</book>
<book id="2">
<title>射鵰英雄傳</title>
<author>金庸</author>
<content><![CDATA[ 射鵰英雄傳講述郭靖成長歷程... ]]></content>
</book>
</booklist>
createElement('booklist')book 元素createAttribute('id')、設定值、appendChildtitle、author、contentcreateTextNode)或 CDATA 區段(createCDATASection)appendChild 到 booksaveXML() 字串、save('file.xml') 檔案<?php
header('Content-Type: application/xml; charset=UTF-8');
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true; // 美化縮排
// 1. 根節點
$booklist = $dom->createElement('booklist');
$dom->appendChild($booklist);
// 2. 書籍資料陣列(模擬資料庫查詢結果)
$booksData = [
[
'id' => '1',
'title' => '天龍八部',
'author' => '金庸',
'content' => '天龍八部是金庸寫的一本武俠小說,非常好看!',
],
[
'id' => '2',
'title' => '射鵰英雄傳',
'author' => '金庸',
'content' => '射鵰英雄傳講述郭靖成長歷程,是金庸代表作之一。',
],
];
// 3. 迴圈建立每本書
foreach ($booksData as $bookData) {
$book = $dom->createElement('book');
$booklist->appendChild($book);
// 屬性 id
$attrId = $dom->createAttribute('id');
$attrId->value = $bookData['id'];
$book->appendChild($attrId);
// title
$title = $dom->createElement('title');
$title->appendChild($dom->createTextNode($bookData['title']));
$book->appendChild($title);
// author
$author = $dom->createElement('author');
$author->appendChild($dom->createTextNode($bookData['author']));
$book->appendChild($author);
// content (使用 CDATA 保留 HTML/特殊字元)
$content = $dom->createElement('content');
$cdata = $dom->createCDATASection($bookData['content']);
$content->appendChild($cdata);
$book->appendChild($content);
}
// 4. 輸出
echo $dom->saveXML();
// 5. 或儲存檔案
// $dom->save('booklist.xml');
| 任務 | 方法 | 說明 |
|---|---|---|
| 建立元素節點 | createElement($name) | 回傳 DOMElement |
| 建立文字節點 | createTextNode($text) | 自動轉義 < & 等特殊字元 |
| 建立 CDATA 區段 | createCDATASection($data) | 不轉義,適合含 HTML/腳本的內容 |
| 建立屬性節點 | createAttribute($name) | 回傳 DOMAttr,再設定 value |
| 設定屬性(捷徑) | $element->setAttribute($name, $value) | 直接在元素上設定,無需建立 DOMAttr |
| 加入子節點 | $parent->appendChild($child) | 回傳加入的子節點 |
| 輸出字串 | saveXML($node?) | 不給參數輸出整份文件 |
| 儲存檔案 | save($filename) | 回傳寫入位元組數或 false |
確保:
new DOMDocument('1.0', 'UTF-8') 指定編碼Content-Type: application/xml; charset=UTF-8]]> 導致 XML 無效CDATA 區段不得包含 ]]>。解決:將資料中 ]]> 替換為 ]]> 或拆分多個 CDATA 區段。
$dom->formatOutput = true 需在載入/建立文件前設定,且文件不可包含混合內容(文字節點夾雜元素節點)時才會完美縮排。
// 加入命名空間
$root = $dom->createElementNS('https://example.com/ns/book', 'book:booklist');
$dom->appendChild($root);
// 設定 schemaLocation
$root->setAttributeNS('https://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation', 'https://example.com/ns/book book.xsd');
DOMDocument 建立 XML 雖然語法較繁瑣,但提供完整控制權:屬性、CDATA、命名空間、Schema 驗證、美化輸出皆可精確掌握。將建立邏輯封裝為 XmlBuilder 類別,配合資料陣列迴圈,即可輕鬆產生符合標準的 XML 交換文件,滿足 ERP 對接、金融報文、開放平台 API 等嚴格格式需求。