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

PHP XML 與 Array 互轉完整指南:四種解析方案與 DOM 生成

     編輯:關於C語言

PHP 處理 XML 數據交換是常見需求。本文匯總四種 XML↔Array 轉換方案:基於 XMLParser 的 SAX 封裝、SimpleXML 簡易轉換、自定義 SAX 類支持索引配置、DOMDocument 生成 XML,涵蓋編碼處理、CDATA、屬性映射、同級節點索引等實戰細節。

1. 方案一:XMLParser 封裝類(經典 SAX)


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。

2. 方案二:SimpleXML 一鍵轉換(PHP5+)


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 開始。

3. 方案三:自定義 SAX 類(支持節點索引配置)


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]),極大方便後續查找合併。

4. 方案四:DOMDocument 生成標準 XML


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,自動處理實體轉義、編碼聲明。

5. 選擇建議

場景推薦方案
小文件、快速開發SimpleXML (方案二)
大文件、流式處理XMLParser/自定義 SAX (方案一/三)
需業務主鍵索引同級節點自定義 SAX (方案三)
生成標準 XML 輸出DOMDocument (方案四)
雙向轉換、CDATA、編碼轉換方案一/三

總結

PHP XML 處理工具鏈豐富:SimpleXML 簡單、SAX 節省內存、DOM 生成標準、自定義索引解決業務查找痛點。根據文件大小、性能要求、數據結構複雜度選型,注意編碼一致性(統一 UTF-8)與錯誤處理。

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