PHP XML解析类XMLParser实现与使用指南

沈亦白
沈亦白
发布时间:2026-10-14| 6人浏览过
原创

本文将详细介绍一个基于PHP SimpleXML扩展构建的XML解析类,演示如何编写一个通用的XML Parser来处理XML文件和XML字符串,并将其转换为易于操作的数组结构,同时解决属性与文本混合时的数据丢失问题。

核心功能与目标

在处理Web服务接口或配置文件时,XML是一种常见的数据交换格式。PHP原生提供了 SimpleXML 扩展,但它返回的是对象结构,且默认情况下会忽略XML节点的属性(attributes),只保留子节点的值。本实例提供的 XMLParser 类主要解决以下问题:

  • 统一入口:提供加载本地XML文件(loadXmlFile)和直接解析XML字符串(loadXmlString)两种便捷方法。
  • 格式校验:在解析前验证XML语法是否合法,避免无效数据导致的错误输出。
  • 对象转数组:将 SimpleXMLElement 对象递归转换为标准的PHP关联数组,便于后续业务逻辑处理。
  • 完整性保护:通过特定的参数设置,保留XML中的CDATA内容。

准备工作

确保你的PHP环境启用了 simplexml 和 libxml 扩展。通常这些扩展在标准PHP安装中是默认开启的。不需要安装第三方库,仅依赖PHP内置函数即可运行以下代码。

操作顺序

第1步:创建XML解析类文件

首先,创建一个名为 XMLParser.class.php 的文件,并将以下类定义复制到其中。该类包含了核心的解析逻辑、格式检查以及对象到数组的递归转换方法。

<?php 
/** 
 * XML 文件分析类 
 * Date: 2013-02-01 
 * Author: fdipzone 
 * Ver: 1.0 
 * 
 * 功能说明:
 * loadXmlFile($xmlfile)   - 读取XML文件并输出Array
 * loadXmlString($xmlstring) - 读取XML字符串并输出Array
 */ 
class XMLParser {

  /**
   * 读取xml文件
   * @param String $xmlfile
   * @return Array
   */
  public function loadXmlFile($xmlfile) {
    // 获取xml文件内容,若文件不存在则返回空字符串
    $xmlstring = file_exists($xmlfile) ? file_get_contents($xmlfile) : '';
    // 执行解析流程
    list($flag, $data) = $this->parser($xmlstring);
    return $this->response($flag, $data);
  }

  /**
   * 读取xmlstring
   * @param String $xmlstring
   * @return Array
   */
  public function loadXmlString($xmlstring) {
    // 执行解析流程
    list($flag, $data) = $this->parser($xmlstring);
    return $this->response($flag, $data);
  }

  /**
   * 解释xml内容 (内部私有方法)
   * @param  String $xmlstring
   * @return Array [flag, data]
   */
  private function parser($xmlstring) {
    $flag = false;
    $data = array();
    // 第一步:检查xml格式是否正确
    if($this->checkXmlFormat($xmlstring)) {
      $flag = true;
      // 第二步:xml string to object
      // 注意:LIBXML_NOCDATA 用于保留 CDATA 部分作为文本而非合并
      $data = simplexml_load_string($xmlstring, 'SimpleXMLElement', LIBXML_NOCDATA);
      // 第三步:object to array
      $this->objectToArray($data);
    }
    return array($flag, $data);
  }

  /**
   * 检查xml格式是否正确
   * @param String $xmlstring
   * @return boolean
   */
  private function checkXmlFormat($xmlstring) {
    if($xmlstring=='') {
      return false;
    }
    // 创建XML解析器
    $xml_parser_obj = xml_parser_create();
    // 尝试解析并填充数组
    // xml_parse_into_struct 返回值 1 表示成功,0 或 -1 表示失败
    if(xml_parse_into_struct($xml_parser_obj, $xmlstring, $vals, $indexs)===1) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * object 转 Array (递归处理)
   * @param object $object
   * @return Array
   */
  private function objectToArray(&$object) {
     
    // 强制转换为数组
    $object = (array)$object;
     
    foreach($object as $key => $value){
      // 如果值为空字符串,保持原样
      if($value=='') {
        $object[$key] = "";
      } else {
        // 如果值仍是对象或数组,递归转换
        if(is_object($value) || is_array($value)){
          $this->objectToArray($value);
          $object[$key] = $value;
        }
      }
    }
  }

  /**
   * 输出返回结果封装
   * @param boolean $flag true为解析成功,false为失败
   * @param Array  $data 转换后的数据
   * @return Array
   */
  private function response($flag=false, $data=array()){
    return array($flag, $data);
  }
}
?>

第2步:编写调用示例Demo

接下来,创建另一个PHP脚本(例如 demo.php)来测试上述类的功能。该示例展示了如何加载外部文件以及如何直接解析硬编码的XML字符串。

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

// 准备测试数据:一个有效的XML字符串
$xmlstring = '<?xml version="1.0" encoding="utf-8"?> 
<xmlroot> 
  <status>1000</status> 
  <info></info> 
  <result>
    <id>100</id> 
    <name>fdipzone</name> 
    <gender>1</gender> 
    <age>28</age> 
  </result> 
</xmlroot>';

$xml_parser = new XMLParser();

echo '<pre>';

// 场景1:加载XML文件(需确保存在 file.xml 且内容有效)
// 注意:如果 file.xml 不存在或内容无效,$flag 将为 false
$xmlfile = 'file.xml'; 
echo "Response from XML File:\r\n";
list($flag, $xmldata) = $xml_parser->loadXmlFile($xmlfile);
if($flag){ 
  print_r($xmldata); 
} else {
  echo "Failed to load or parse XML file.\n";
}

echo "-------------------------\r\n";

// 场景2:直接解析XML字符串
echo "Response from XML String:\r\n";
list($flag, $xmldata) = $xml_parser->loadXmlString($xmlstring);
if($flag){ 
  print_r($xmldata); 
} else {
  echo "Failed to parse XML string.\n";
}

echo '</pre>';
?> 

第3步:验证输出结果

运行 demo.php。对于有效的XML字符串,你将得到一个嵌套的数组结构,键名对应XML标签名,值对应标签内的文本或子数组。如果XML格式错误(如缺少闭合标签),$flag 将为 false,从而防止程序崩溃。

完成判断

当控制台正确打印出解析后的数组结构,且对于错误XML输入没有报错而是安全返回时,说明XML解析类工作正常。此时你可以将其集成到你的项目中,用于配置读取或API响应处理。

简要总结

以上关于PHP XMLParser解析XML文件及字符串转为数组的详细内容,更多关于PHP XML数据处理技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。