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

PHP XML 解析類別:SimpleXML 載入檔案與字串轉陣列實作

     編輯:PHP 相關知識

XML 仍是系統整合、配置檔、API 回應常用格式。本文封裝 XMLParser 類別,基於 PHP 內建 SimpleXML 擴展,提供檔案與字串兩種來源載入,自動轉換為關聯陣列,並包含格式驗證與錯誤處理。

類別功能

  • loadXmlFile($file):從檔案路徑載入 XML 並轉陣列。
  • loadXmlString($string):從字串載入 XML 並轉陣列。
  • 內建 xml_parser_create 格式驗證,避免 SimpleXML 載入失敗拋出警告。
  • 遞迴將 SimpleXMLElement 物件轉為純陣列,支援 CDATA 內容提取(`LIBXML_NOCDATA`)。

類別程式碼

<?php
class XMLParser {
    public function loadXmlFile($xmlfile) {
        $xmlstring = file_exists($xmlfile) ? file_get_contents($xmlfile) : '';
        list($flag, $data) = $this->parser($xmlstring);
        return $this->response($flag, $data);
    }

    public function loadXmlString($xmlstring) {
        list($flag, $data) = $this->parser($xmlstring);
        return $this->response($flag, $data);
    }

    private function parser($xmlstring) {
        $flag = false;
        $data = [];
        if ($this->checkXmlFormat($xmlstring)) {
            $flag = true;
            // SimpleXML 載入,LIBXML_NOCDATA 將 CDATA 節點當作文字節點處理
            $data = simplexml_load_string($xmlstring, 'SimpleXMLElement', LIBXML_NOCDATA);
            $this->objectToArray($data);
        }
        return [$flag, $data];
    }

    private function checkXmlFormat($xmlstring) {
        if ($xmlstring === '') return false;
        $parser = xml_parser_create();
        $result = xml_parse_into_struct($parser, $xmlstring, $vals, $indexs);
        xml_parser_free($parser);
        return $result === 1; // 1=成功, 0=失敗
    }

    private function objectToArray(&$object) {
        $object = (array)$object;
        foreach ($object as $key => &$value) {
            if ($value === '') {
                $value = '';
            } elseif (is_object($value) || is_array($value)) {
                $this->objectToArray($value);
                $object[$key] = $value;
            }
        }
    }

    private function response($flag = false, $data = []) {
        return [$flag, $data];
    }
}
?>

使用範例

<?php
require 'XMLParser.class.php';

$xmlfile = 'file.xml';
$xmlstring = '

    1000
    
    
        100
        fdipzone
        1
        28
    
';

$parser = new XMLParser();

echo "=== 載入檔案 ===\n";
list($flag, $data) = $parser->loadXmlFile($xmlfile);
if ($flag) print_r($data);

echo "\n=== 載入字串 ===\n";
list($flag, $data) = $parser->loadXmlString($xmlstring);
if ($flag) print_r($data);

輸出結果

Array
(
    [status] => 1000
    [info] => 
    [result] => Array
        (
            [id] => 100
            [name] => fdipzone
            [gender] => 1
            [age] => 28
        )
)

進階應用與注意事項

1. 同名節點處理(數值索引)

若 XML 含多個同名子節點:


    Apple
    Banana

SimpleXML 會轉為陣列,但需注意:simplexml_load_string 回傳的物件屬性存取 `$xml->item` 僅取第一個,需用 `$xml->item[0]`、`$xml->item[1]` 或 `foreach` 遍歷。轉陣列後自動變為數值索引陣列。

2. 屬性存取

PHP Guide

屬性需透過 `$xml->book['id']` 存取,轉陣列時會併入 `@attributes` 鍵(視 PHP 版本而定),建議手動處理屬性提取。

3. 命名空間

...

SimpleXML 需註冊命名空間:$xml->registerXPathNamespace('ns', 'https://example.com'),再用 XPath 查詢。

4. 大型 XML 檔案

SimpleXML 將整份文件載入記憶體,>50MB 可能導致記憶體耗盡。大檔案建議使用 XMLReader (Pull Parser) 流式解析。

5. 錯誤處理增強

private function checkXmlFormat($xmlstring) {
    if ($xmlstring === '') return false;
    libxml_use_internal_errors(true);
    $parser = xml_parser_create();
    $result = xml_parse_into_struct($parser, $xmlstring, $vals, $indexs);
    xml_parser_free($parser);
    if ($result !== 1) {
        $errors = libxml_get_errors();
        libxml_clear_errors();
        error_log('XML 格式錯誤: ' . print_r($errors, true));
    }
    return $result === 1;
}

替代方案比較

XMLParser 類別以 SimpleXML 為核心,封裝了格式驗證、物件轉陣列、統一回傳格式,適合快速整合 XML 介面;涉及大檔案、命名空間、寫入操作時請選用 DOMDocument 或 XMLReader。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案特性適用場景
SimpleXML (本類別)簡單、記憶體載入、自動物件/陣列轉換中小型 XML、配置檔、API 回應
DOMDocument完整 DOM 樹、XPath、命名空間支援佳複雜 XML 操作、需修改寫回
XMLReader流式、低記憶體、單向讀取大型 XML 匯入、日誌分析
XMLParser (SAX)事件驅動、低記憶體、回調複雜高效能串流處理