萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 使用 DOMDocument 建立 XML 文件:從節點建立到 CDATA 寫入完整教學

前言

產生結構良好的 XML 文件是系統整合、API 介面、資料交換的常見需求。PHP DOMDocument 提供完整的 DOM API,能程式化建立元素、屬性、文字節點、CDATA 區段,並確保輸出符合 XML 規範。本文詳細示範建立含屬性、巢狀元素、CDATA 的 XML 文件全流程。

一、目標 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>

二、分步驟建立流程

  1. 建立 DOMDocument:指定版本與編碼
  2. 建立根節點:createElement('booklist')
  3. 迴圈建立 book 節點:
    1. 建立 book 元素
    2. 建立屬性節點 createAttribute('id')、設定值、appendChild
    3. 建立子元素 title、author、content
    4. 子元素加入文字節點(createTextNode)或 CDATA 區段(createCDATASection)
    5. 將子元素 appendChild 到 book
  4. 將 book 節點加入根節點
  5. 將根節點加入 DOMDocument
  6. 輸出/儲存:saveXML() 字串、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');

四、關鍵 API 對照表

任務方法說明
建立元素節點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

五、常見坑點與解決

1. 中文亂碼

確保:

  • PHP 檔案儲存為 UTF-8 無 BOM
  • new DOMDocument('1.0', 'UTF-8') 指定編碼
  • HTTP Header Content-Type: application/xml; charset=UTF-8
  • 資料庫連線字符集為 utf8mb4

2. CDATA 內含 ]]> 導致 XML 無效

CDATA 區段不得包含 ]]>。解決:將資料中 ]]> 替換為 ]]> 或拆分多個 CDATA 區段。

3. 格式化輸出不生效

$dom->formatOutput = true 需在載入/建立文件前設定,且文件不可包含混合內容(文字節點夾雜元素節點)時才會完美縮排。

六、進階:命名空間與 Schema 驗證

// 加入命名空間
$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 等嚴格格式需求。

copyright © 萬盛學電腦網 all rights reserved