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

PHP 讀取 XML 四大主流方法對比與實戰

     編輯:PHP 相關知識

示例 XML 數據

<?xml version="1.0" encoding="UTF-8"?>
<humans>
  <person id="1">
    <name>張映</name>
    <sex>男</sex>
    <age>28</age>
  </person>
  <person id="2">
    <name>Tank</name>
    <sex>男</sex>
    <age>28</age>
  </person>
</humans>

方法一:DOMDocument(W3C 標準,功能最全)

$dom = new DOMDocument();
$dom->load('person.xml'); // 或 loadXML($string)

$persons = $dom->getElementsByTagName('person');
foreach ($persons as $person) {
    $name = $person->getElementsByTagName('name')->item(0)->textContent;
    $sex  = $person->getElementsByTagName('sex')->item(0)->textContent;
    $age  = $person->getElementsByTagName('age')->item(0)->textContent;
    $id   = $person->getAttribute('id');
    echo "$id: $name - $sex - $age\n";
}
// 輸出:
// 1: 張映 - 男 - 28
// 2: Tank - 男 - 28
  • 支援 XPath、Schema 驗證、寫入/修改 XML
  • 內存佔用較大(整棵樹載入內存),不適合超大文件

方法二:SimpleXML(語法最簡潔,適合只讀)

$xml = simplexml_load_file('person.xml'); // 或 simplexml_load_string()
foreach ($xml->person as $p) {
    echo "{$p['id']}: {$p->name} - {$p->sex} - {$p->age}\n";
}
// 訪問屬性:$p['id'] 或 $p->attributes()->id
// 訪問同名子節點:$p->name[0], $p->name[1]...
  • 自動將 XML 映射為對象/數組,極易上手
  • 不支援 XPath 1.0 完整語法(需配合 `dom_import_simplexml`)
  • 大文件同樣全量載入內存

方法三:XMLReader(流式拉取解析,內存極低)

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

while ($reader->read()) {
    if ($reader->nodeType === XMLReader::ELEMENT && $reader->localName === 'person') {
        // 讀取整個  子樹為 SimpleXML 對象
        $person = simplexml_import_dom($reader->expand());
        echo "{$person['id']}: {$person->name} - {$person->sex} - {$person->age}\n";
    }
}
$reader->close();
  • **游標式前進**,不載入整棵樹,適合 **GB 級大文件**
  • 只能前進不能後退,邏輯稍複雜
  • 常配合 `expand()` 將當前節點轉為 DOM/SimpleXML 處理

方法四:正則表達式(不推薦用於生產)

$content = file_get_contents('person.xml');
preg_match_all('/<person id="(\d+)">\s*<name>(.*?)<\/name>\s*<sex>(.*?)<\/sex>\s*<age>(.*?)<\/age>\s*<\/person>/s', $content, $m);
foreach ($m[1] as $i => $id) {
    echo "$id: {$m[2][$i]} - {$m[3][$i]} - {$m[4][$i]}\n";
}
  • 極其脆弱:屬性順序變化、換行、註釋、CDATA、命名空間均會導致失效
  • 僅適合**極其固定格式、一次性腳本**,嚴禁用於通用解析

性能與適用場景對比

方法內存佔用速度功能豐富度推薦場景
DOMDocument高中最高需修改 XML、Schema 驗證、XPath 複雜查詢、中小文件
SimpleXML高快中純讀取、結構固定、中小文件、快速開發
XMLReader極低中中大文件(>100MB)、流式處理、內存受限環境
正則低快極低一次性臨時腳本、格式絕對固定

進階技巧

命名空間處理

$xml = simplexml_load_file('ns.xml');
$xml->registerXPathNamespace('ns', 'https://example.com/ns');
$items = $xml->xpath('//ns:item');

錯誤容忍(HTML 片段)

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($htmlString); // 不報錯
libxml_clear_errors();

生成 XML

$dom = new DOMDocument('1.0', 'UTF-8');
$root = $dom->createElement('humans');
$dom->appendChild($root);

$person = $dom->createElement('person');
$person->setAttribute('id', '3');
$name = $dom->createElement('name', 'New User');
$person->appendChild($name);
$root->appendChild($person);

echo $dom->saveXML();

總結

日常開發首選 **SimpleXML**;需寫入/驗證/複雜查詢用 **DOMDocument**;處理大文件必用 **XMLReader**;**杜絕正則解析 XML**。

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