在 PHP 開發中,處理 XML 資料是常見需求。simplexml_load_file() 函數提供了一種直觀且高效的方式,將 XML 文件直接轉換為物件,讓開發者能像操作陣列或物件一樣存取節點資料。本文將透過實際範例,詳細說明該函數的用法、巢狀結構處理以及屬性存取技巧。
假設我們有一個名為 test.xml 的檔案,內容如下:
<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
使用 simplexml_load_file() 載入並輸出:
<?php
if (file_exists('test.xml')) {
$xml = simplexml_load_file('test.xml');
var_dump($xml);
} else {
exit('Error: 檔案不存在');
}
?>
輸出結果將顯示一個 SimpleXMLElement 物件,包含四個屬性:to、from、heading、body,對應各節點的文字內容。
實際專案中,XML 往往包含巢狀元素與屬性。以下以一個字典資料 iciba.xml 為例:
<?xml version="1.0" encoding="UTF-8"?>
<dict num="219" id="219" name="219">
<key>天空</key>
<pos></pos>
<acceptation>Array;Array;</acceptation>
<sent>
<orig>The church tower stood against the sky like a finger pointing towards heaven.</orig>
<trans>教堂的尖塔在天空的映襯下宛如指向天空的手指。</trans>
</sent>
<sent>
<orig>A balloon floated across the sky.</orig>
<trans>氣球飄過天空。</trans>
</sent>
<sent>
<orig>A bolt of lightning lit up the sky.</orig>
<trans>(一道)閃電照亮了天空。</trans>
</sent>
<sent>
<orig>A bright moving object appeared in the sky at sunset.</orig>
<trans>日落西山時,天空出現了一個移動的發亮物體。</trans>
</sent>
<sent>
<orig>A bright rainbow arched above.</orig>
<trans>一彎明亮的彩虹懸掛在天空。</trans>
</sent>
</dict>
<?php
header("Content-Type: text/html; charset=UTF-8");
$xmldata = simplexml_load_file("iciba.xml");
// 第一部分:查看完整結構
print_r($xmldata);
// 第二部分:遍歷例句
$listcount = count($xmldata->sent);
for ($i = 0; $i < $listcount; $i++) {
$dictlist = $xmldata->sent[$i];
echo "<br />例句:" . $dictlist->orig;
echo "<br />翻譯:" . $dictlist->trans;
}
?>
<dict> 的屬性(num、id、name)可透過 $xmldata['num'] 方式取得,print_r 輸出中會顯示在 [@attributes] 陣列裡。<sent> 節點有多個,轉換後成為 SimpleXMLElement 物件陣列,可用 count() 取得數量,再用索引迴圈逐一讀取子節點 orig 與 trans。header("Content-Type: text/html; charset=UTF-8"),避免中文亂碼。若 XML 結構包含多個同層節點(如 <user>、<town>),可結合 foreach 迴圈輸出 HTML 表格:
<?php
header("content-type:text/html; charset=utf-8");
$xml = simplexml_load_file('a.xml'); // 假設根節點包含 company、town、user 等
echo $xml->company . "<br>";
echo $xml->town . "<br>id: " . $xml->town['id'] . "<br>parent: " . $xml->town['parent'] . "<br><br>";
echo "<br>循環讀取 user:<br>";
foreach ($xml->user as $users) {
echo "-------------------<br>";
echo "姓名:" . $users->name . "<br>";
echo "編號:" . $users->age . "<br>";
echo "性別:" . $users->age['sex'] . "<br>";
echo "序號:" . $users->height . "<br>";
}
echo "<br>循環讀取 town:<br>";
foreach ($xml->town as $towns) {
echo "-------------------<br>";
echo "id:" . $towns['id'] . "<br>";
echo "歸屬:" . $towns['parent'] . "<br>";
echo "地區:" . $towns . "<br>";
}
?>
此範例展示如何同時處理節點文字內容(如 $towns 直接輸出文字)與屬性(如 $towns['id']),並針對重複節點使用 foreach 逐筆處理。
file_exists() 檢查,避免產生警告。false 並拋出錯誤,建議搭配 libxml_use_internal_errors(true) 捕獲錯誤細節。simplexml_load_file() 會一次將整份文件載入記憶體,處理超大檔案時可能耗盡記憶體,此時建議改用 XMLReader 串流式解析。->children('namespace', true) 或 ->attributes('namespace', true) 存取。simplexml_load_file() 是 PHP 解析 XML 最便利的工具之一,適合中小型、結構清晰的 XML 檔案。掌握物件屬性存取、陣列遍歷、屬性讀取與編碼設定,即可應付大多數實務需求。若遇到效能瓶頸或複雜命名空間,再考慮進階解析器。