XML (eXtensible Markup Language) 是資料交換與配置儲存的標準格式。PHP 提供 DOM、SimpleXML、XMLReader 等多種解析方式。本文從 XML 文件結構基礎入手,詳細解析 XML 宣告、根元素、元素/標籤/節點概念、空白字元處理、標籤命名五大規範,為後續 PHP 操作 XML 打下堅實基礎。
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<class>
<student>
<name>小喬</name>
<sex>女</sex>
<age>23</age>
</student>
<student>
<name>周瑜</name>
<sex>男</sex>
<age>27</age>
</student>
</class>
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
| 屬性 | 說明 | 必要性 |
|---|---|---|
version | XML 版本,固定 "1.0" | 必填 |
encoding | 字元編碼:utf-8、gb2312、big5 等 | 建議填 |
standalone | yes/no,是否獨立 (無外部 DTD 參考) | 選填,預設 no |
規則:宣告必須在文件第一行第一列,前面不能有任何字元 (含 BOM、空白、換行)。
<class>...</class> 為根元素。每個 XML 文件有且僅能有一個根元素,所有其他元素必須巢狀包含在根元素內。
<name>小喬</name><name /> 等同 <name></name> (無內容時)重要:XML 解析器會將標籤間的空格、換行、縮排視為原始文字節點保留。
<student>
<name>小喬</name> ← 前面有換行+兩空格,會被解析為文字節點
</student>
程式設計影響:
DOMDocument::load() 載入時會保留格式化空白$node->childNodes 遍歷時會包含空白文字節點$dom->preserveWhiteSpace = false; 或遍歷時過濾 nodeType === XML_TEXT_NODE && trim($node->nodeValue) === ''| 規則 | 說明 | 錯誤範例 | 正確範例 |
|---|---|---|---|
| 1. 區分大小寫 | <Name> ≠ <name> | <NAME> vs <name> | 統一風格 (如小寫) |
| 2. 不能以數字或底線開頭 | 首字元必須為字母或中文 | <1student>, <_student> | <student>, <學生> |
| 3. 不能以 xml/Xml/XML 開頭 | 保留關鍵字 | <xmlData>, <XmlConfig> | <dataXml>, <configXml> |
| 4. 不能包含空格 | 標籤名不可含空白字元 | <student name> | <student_name> |
| 5. 不能包含冒號 | 冒號保留給命名空間使用 | <ns:student> (需宣告命名空間) | <student> |
$dom = new DOMDocument();
$dom->load("class.xml"); // 自動偵測 XML 宣告中的 encoding
// 若 XML 無宣告或編碼不符,可強制指定
$dom->loadXML($xmlString, LIBXML_NOERROR | LIBXML_NOWARNING);
// 或預先轉碼
$xmlString = mb_convert_encoding($xmlString, 'UTF-8', 'GBK');
XML 文件結構嚴謹,宣告在首行、單一根元素、標籤命名規範、空白節點保留 是五大核心特徵。PHP 操作 XML 前必須理解這些基礎,特別是空白節點處理與編碼轉換,否則解析結果常出現「多出莫名文字節點」或「中文亂碼」問題。