DOMDocument 載入 XML 時默認按 UTF-8 解析,若 XML 聲明編碼為 UTF-8 但 PHP 內部處理或輸出編碼不一致,中文會出現亂碼。
<?php
// 1. 創建 DOMDocument
$xmlDoc = new DOMDocument();
// 2. 載入 XML 文件 (支持 URL)
$xmlDoc->load('https://127.0.0.1/holiday.xml');
// 或本地文件
// $xmlDoc->load(__DIR__ . '/holiday.xml');
// 3. 獲取所有年份節點
$years = $xmlDoc->getElementsByTagName('year');
foreach ($years as $year) {
// 獲取年份值
$yearNames = $year->getElementsByTagName('yearName');
$yearName = $yearNames->item(0)->nodeValue;
// 關鍵:輸出時轉碼 (若頁面非 UTF-8)
echo iconv('UTF-8', 'GBK//IGNORE', $yearName) . '年
';
// 獲取假日列表
$holidays = $year->getElementsByTagName('holiday');
foreach ($holidays as $holiday) {
// 假日名稱
$holidayNames = $holiday->getElementsByTagName('holidayName');
$holidayName = $holidayNames->item(0)->nodeValue;
echo iconv('UTF-8', 'GBK//IGNORE', $holidayName) . ':
';
// 放假日期
$daysOffs = $holiday->getElementsByTagName('daysOff');
$daysOff = $daysOffs->item(0);
$from = $daysOff->getElementsByTagName('from')->item(0)->nodeValue;
$to = $daysOff->getElementsByTagName('to')->item(0)->nodeValue;
echo "假期:$from 至 $to
";
// 調休日期
$overTimes = $holiday->getElementsByTagName('overTime');
$overTime = $overTimes->item(0);
$days = $overTime->getElementsByTagName('day');
if ($days->length > 0) {
echo '調休日:';
foreach ($days as $day) {
echo $day->nodeValue . ' ';
}
echo '
';
}
echo '
';
}
}
?>
<?xml version="1.0" encoding="UTF-8"?>
<daysOff-overTime>
<year>
<yearName>2012</yearName>
<holiday>
<holidayName>元旦</holidayName>
<daysOff>
<from>2012-1-1</from>
<to>2012-1-3</to>
</daysOff>
<overTime>
<day>2011-12-31</day>
</overTime>
</holiday>
<holiday>
<holidayName>春節</holidayName>
<daysOff>
<from>2012-1-22</from>
<to>2012-1-28</to>
</daysOff>
<overTime>
<day>2012-1-21</day>
<day>2012-1-29</day>
</overTime>
</holiday>
</year>
</daysOff-overTime>
<?php
// XML 內容為 UTF-8,頁面輸出為 GBK
$value = $node->nodeValue; // 獲取的是 UTF-8 字符串
echo iconv('UTF-8', 'GBK//IGNORE', $value); // 轉碼輸出
// 若頁面也是 UTF-8,無需轉碼
// 但建議統一:header('Content-Type: text/html; charset=UTF-8');
?>
<?php
$dom = new DOMDocument('1.0', 'UTF-8');
// 構建文檔...
$dom->save('output.xml'); // 會寫入
// 或
$dom->saveXML(); // 返回字符串
?>
<?php
// XML 聲明 encoding="GB2312"
$dom = new DOMDocument();
$dom->load('gbk.xml'); // 自動按聲明編碼解析,內部轉為 UTF-8
$value = $dom->getElementsByTagName('name')->item(0)->nodeValue;
// $value 現在是 UTF-8 編碼
?>
<?php
libxml_use_internal_errors(true); // 禁用默認錯誤輸出
$dom = new DOMDocument();
$loaded = @$dom->load('data.xml');
if (!$loaded) {
$errors = libxml_get_errors();
foreach ($errors as $error) {
error_log("XML Error: {$error->message} at line {$error->line}");
}
libxml_clear_errors();
die('XML 解析失敗');
}
// 成功解析...
?>
| 特性 | DOMDocument | SimpleXML | XMLReader |
|---|---|---|---|
| 記憶體佔用 | 高 (全樹載入) | 中 | 極低 (流式) |
| 寫入/修改 | 完整支持 | 有限支持 | 不支持 |
| XPath 支持 | 完整 | 基本 | 無 |
| 大文件處理 | 不適合 | 不適合 | 最適合 |
| 命名空間 | 完整 | 麻煩 | 手動處理 |
libxml_use_internal_errors(true)XMLReaderDOMDocumentSimpleXML (語法更簡潔)