首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 操作 XML 完整指南:SimpleXML、XPath 與 DOMDocument 實戰

     編輯:PHP 綜合知識

前言

XML 雖不如 JSON 輕量,但在企業整合、金融報文、電子發票、SOAP API 等場景仍屬標準格式。PHP 內建三大 XML 處理擴展:SimpleXML(易用)、DOMDocument(功能完整)、XMLReader/Writer(串流/低記憶體)。本文以實戰範例帶您掌握核心操作。

範例 XML 結構

<?xml version="1.0" encoding="UTF-8"?>
<departs>
  <depart id="d1">
    <name>研發部</name>
    <employees>
      <employee id="e1"><name>張三</name><role>工程師</role></employee>
      <employee id="e2"><name>李四</name><role>主管</role></employee>
    </employees>
  </depart>
  <depart id="d2">
    <name>行銷部</name>
    <employees>
      <employee id="e3"><name>王五</name><role>專員</role></employee>
    </employees>
  </depart>
</departs>

SimpleXML:輕量讀取與修改

載入與基本存取

$xml = simplexml_load_file('example.xml');
// 或從字串
$xml = simplexml_load_string($xmlString);

// 存取屬性
echo $xml->depart[0]['id']; // d1

// 存取子元素
echo $xml->depart[0]->name; // 研發部

迭代與 XPath 查詢

// 遍歷所有部門名稱
foreach ($xml->depart as $dept) {
    echo $dept->name . PHP_EOL;
}

// XPath 精準定位:取得所有員工姓名
$names = $xml->xpath('//employee/name');
foreach ($names as $name) {
    echo (string)$name . PHP_EOL;
}

// 依條件篩選:id 為 e2 的員工
$emp = $xml->xpath('//employee[@id="e2"]')[0] ?? null;

修改與儲存

// 修改節點內容
$xml->depart[0]->name = '研發中心';

// 新增節點
$newDept = $xml->addChild('depart', '');
$newDept->addAttribute('id', 'd3');
$newDept->addChild('name', '資安部');

// 輸出為字串或寫入檔案
$xml->asXML('updated.xml'); // 直接寫檔
echo $xml->asXML();         // 回傳字串

DOMDocument:完整 DOM 操作與命名空間支援

適合需求:大型 XML、需寫入 CDATA、處理命名空間、XSLT 轉換。

建立與寫入

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true; // 美化縮排

$root = $dom->createElement('response');
$dom->appendChild($root);

$books = $dom->createElement('books');
$root->appendChild($books);

$book = $dom->createElement('book');
$books->appendChild($book);

$title = $dom->createElement('title', 'PHP 與 AJAX');
$book->appendChild($title);

$isbn = $dom->createElement('isbn', '1-21258986');
$book->appendChild($isbn);

echo $dom->saveXML();
// 或存檔
$dom->save('books.xml');

讀取與 XPath

$dom = new DOMDocument();
$dom->load('example.xml');

$xpath = new DOMXPath($dom);
// 註冊命名空間(若 XML 有預設 ns)
// $xpath->registerNamespace('ns', 'https://example.com/ns');

$nodes = $xpath->query('//depart/name');
foreach ($nodes as $node) {
    echo $node->textContent . PHP_EOL;
}

XMLReader/Writer:大檔案串流處理

避免一次載入整份 XML 到記憶體,適合超過百 MB 的檔案。

讀取範例

$reader = new XMLReader();
$reader->open('large.xml');

while ($reader->read()) {
    if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'employee') {
        // 展開當前節點為 SimpleXML 物件方便處理
        $simple = simplexml_import_dom($reader->expand());
        echo $simple->name . ' - ' . $simple->role . PHP_EOL;
    }
}
$reader->close();

寫入範例

$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('users');

foreach ($users as $u) {
    $writer->startElement('user');
    $writer->writeAttribute('id', $u['id']);
    $writer->writeElement('name', $u['name']);
    $writer->writeElement('email', $u['email']);
    $writer->endElement(); // user
}

$writer->endElement(); // users
$writer->endDocument();

file_put_contents('users.xml', $writer->outputMemory());

常見編碼與實體問題

  • UTF-8 必須宣告:XML 頭 `< ?xml version="1.0" encoding="UTF-8"? >` 與 PHP 內部編碼一致。
  • 特殊字元逸出:`< > & " '` 需自動轉換,SimpleXML/DOMDocument 寫入時會自動處理。
  • CDATA 區段:包含 HTML 片段時使用 `$dom->createCDATASection($html)`。

效能與選型建議

擴展適用場景記憶體學習曲線
SimpleXML中小型 XML、快速開發、僅讀/少量寫入整份載入低
DOMDocument複雜操作、命名空間、XSLT、需精確控制整份載入中
XMLReader/Writer大型 XML(>50MB)、串流轉換、低記憶體限制串流/極低中高

結語

PHP 的 XML 生態相當成熟,關鍵在於根據檔案大小、操作複雜度與效能需求選擇適當工具。日常開發以 SimpleXML 為主,大檔案改用 XMLReader,需求複雜時再引入 DOMDocument,即能兼顧開發效率與執行效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved