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

PHP 讀取 XML 完整指南:DOMDocument 與 SimpleXML 實戰範例

     編輯:PHP 綜合知識

準備工作:範例 XML 檔案

<?xml version="1.0" encoding="utf-8"?>
<data>
  <category id="1">
    <item>Item A</item>
    <item>Item B</item>
  </category>
  <category id="2">
    <item>Item C</item>
  </category>
  <meta>
    <author>John</author>
    <date>2024-01-15</date>
  </meta>
</data>

方法一:DOMDocument(標準、功能完整)

基本讀取所有 <item>

<?php
$xml = new DOMDocument();
$xml->load('data.xml');

$items = $xml->getElementsByTagName('item');
foreach ($items as $item) {
    echo $item->nodeValue . "<br>";
}
// 輸出:Item A, Item B, Item C

階層式讀取:依 category 分組

$categories = $xml->getElementsByTagName('category');
foreach ($categories as $cat) {
    echo "Category ID: " . $cat->getAttribute('id') . "<br>";
    $items = $cat->getElementsByTagName('item');
    foreach ($items as $item) {
        echo " - " . $item->nodeValue . "<br>";
    }
}

讀取屬性與巢狀結構

$meta = $xml->getElementsByTagName('meta')->item(0);
$author = $meta->getElementsByTagName('author')->item(0)->nodeValue;
$date = $meta->getElementsByTagName('date')->item(0)->nodeValue;
echo "Author: $author, Date: $date";

方法二:SimpleXML(語法簡潔、適合單純讀取)

<?php
$xml = simplexml_load_file('data.xml');

// 直接以物件屬性存取
foreach ($xml->category as $cat) {
    echo "Category ID: " . $cat['id'] . "<br>";
    foreach ($cat->item as $item) {
        echo " - " . (string)$item . "<br>";
    }
}

echo "Author: " . (string)$xml->meta->author . "<br>";
echo "Date: " . (string)$xml->meta->date . "<br>";

進階技巧:XPath 查詢(DOMDocument 專屬)

$xpath = new DOMXPath($xml);
// 找出 id=2 的 category 下所有 item
$items = $xpath->query('//category[@id="2"]/item');
foreach ($items as $item) { echo $item->nodeValue; }

// 找出所有包含 "B" 的 item
$items = $xpath->query('//item[contains(text(), "B")]');

編碼處理關鍵點

  • XML 宣告 encoding="utf-8" 需與實際檔案編碼一致
  • PHP 內部處理為 UTF-8,輸出時注意 header('Content-Type: text/html; charset=utf-8')
  • 若 XML 為 Big5/GBK,載入前先 iconv 轉碼或用 DOMDocument::loadHTML() 配合 mb_convert_encoding

錯誤處理與效能

libxml_use_internal_errors(true);
$xml = new DOMDocument();
if (!$xml->load('data.xml')) {
    $errors = libxml_get_errors();
    foreach ($errors as $e) { error_log($e->message); }
    libxml_clear_errors();
    die('XML 載入失敗');
}
// 大檔案建議用 XMLReader (SAX 模式) 串流讀取,避免記憶體爆增

選擇建議

場景推薦理由
簡單結構、單純讀取SimpleXML程式碼最少、可讀性最高
需 XPath、修改 XML、命名空間DOMDocument功能完整、W3C 標準
超大檔案 (>50MB)XMLReader串流式、低記憶體
需寫入/產生 XMLDOMDocument支援 createElement/appendChild 等
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved