PHP 處理 XML 數據交換是常見需求。本文匯總四種 XML↔Array 轉換方案:基於 XMLParser 的 SAX 封裝、SimpleXML 簡易轉換、自定義 SAX 類支持索引配置、DOMDocument 生成 XML,涵蓋編碼處理、CDATA、屬性映射、同級節點索引等實戰細節。
function xml2array($xml, $isnormal = false) {
$parser = new XMLParse($isnormal);
return $parser->parse($xml);
}
function array2xml($arr, $htmlon = true, $isnormal = false, $level = 1) {
$s = ($level == 1) ? '\n\n' : '';
$space = str_repeat("\t", $level);
foreach ($arr as $k => $v) {
if (!is_array($v)) {
$s .= "$space- " . ($htmlon ? '' : '') . "
\n";
} else {
$s .= "$space- \n" . array2xml($v, $htmlon, $isnormal, $level+1) . "$space
\n";
}
}
return ($level == 1) ? $s . " " : $s;
}
class XMLParse {
// ... 完整 SAX 回調實現:open/data/close 管理棧、屬性 id 映射、isnormal 模式切換
}
特點:事件驅動、內存效率高、支持屬性 id 作為數組鍵、isnormal 模式兼容無屬性 XML。
class xml_to_array {
public function __construct($xml) {
$this->arr = empty($xml) ? [] : (array)simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOBLANKS);
foreach ($this->arr as $k => $v) $this->arr[$k] = $this->struct_to_array((array)$v);
}
private function struct_to_array($item) {
if (!is_string($item)) {
$item = (array)$item;
foreach ($item as $k => $v) $item[$k] = $this->struct_to_array($v);
}
return $item;
}
}
優點:代碼極簡、自動處理 CDATA、屬性、命名空間。缺點:大文件內存佔用高、同級同名節點自動變數組下標從 0 開始。
class xmlRead {
// 配置節點索引來源:屬性值、子節點值、自定義函數
public function xmlRead_node_config($nodeConfig) { ... }
// 解析文件/字符串
public function xmlRead_parser_file($file, $isCode = 0) { ... }
// 獲取結果數組
public function xmlRead_get_ret() { return $this->var_data[0]; }
// 內部:startElement/endElement/characterData 管理深度棧、索引棧、數據組裝
// 支持 iconv 編碼轉換 (UTF-8 ↔ GBK)
}
核心優勢:可為同級同名節點指定業務主鍵作為數組索引(如 <user id="1001"> → $arr['user'][1001]),極大方便後續查找合併。
function array_to_xml($arr, $encoding = 'ISO-8859-1') {
$dom = new DOMDocument("1.0", $encoding);
$root = $dom->createElement($arr[0]); // 第一個元素作為根標籤名
$dom->appendChild($root);
foreach ($arr as $k => $v) {
if ($k != '0') {
$item = $dom->createElement($k, $v);
$root->appendChild($item);
}
}
return $dom->saveXML();
}
// 使用
$req = ['request', 'msgType'=>'SvtGet3GUserInfReq', 'uid'=>'123456789', 'pageSize'=>1, 'pageNo'=>0];
echo array_to_xml($req, 'UTF-8');
輸出標準 XML,自動處理實體轉義、編碼聲明。
| 場景 | 推薦方案 |
|---|---|
| 小文件、快速開發 | SimpleXML (方案二) |
| 大文件、流式處理 | XMLParser/自定義 SAX (方案一/三) |
| 需業務主鍵索引同級節點 | 自定義 SAX (方案三) |
| 生成標準 XML 輸出 | DOMDocument (方案四) |
| 雙向轉換、CDATA、編碼轉換 | 方案一/三 |
PHP XML 處理工具鏈豐富:SimpleXML 簡單、SAX 節省內存、DOM 生成標準、自定義索引解決業務查找痛點。根據文件大小、性能要求、數據結構複雜度選型,注意編碼一致性(統一 UTF-8)與錯誤處理。