在php开发中,XML作为一种通用的数据交换格式,经常出现在接口返回、配置文件等场景中,掌握多种XML读取方法能帮助开发者应对不同的业务需求。接下来将详细介绍四种常用的php读取XML的方法,每种方法都附带可运行的实例代码。

方法一:使用SimpleXML扩展
SimpleXML是php内置的XML处理扩展,使用起来非常简单,适合处理结构规范的XML文件,能够快速将XML转换为对象或数组进行操作。
首先准备一个测试用的XML文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<id>1</id>
<name>张三</name>
<age>25</age>
</user>
<user>
<id>2</id>
<name>李四</name>
<age>28</age>
</user>
</users>
使用SimpleXML读取该XML的实例代码:
<?php
// 加载XML文件,也可以使用simplexml_load_string加载XML字符串
$xml = simplexml_load_file('test.xml');
// 遍历所有user节点
foreach ($xml->user as $user) {
echo "用户ID:" . $user->id . "<br/>";
echo "用户姓名:" . $user->name . "<br/>";
echo "用户年龄:" . $user->age . "<br/>";
echo "----------<br/>";
}
?>
这种方法的优点是代码简洁,上手难度低,缺点是对于复杂的XML命名空间或者不规则结构的XML处理能力较弱。
方法二:使用DOMDocument类
DOMDocument是php提供的基于DOM标准的XML处理类,能够完整解析XML的节点结构,支持对XML的增删改查操作,适合处理结构复杂或者需要修改XML内容的场景。
同样使用上面的测试XML文件,使用DOMDocument读取的实例代码:
<?php
// 创建DOMDocument对象
$dom = new DOMDocument();
// 加载XML文件
$dom->load('test.xml');
// 获取所有user节点
$users = $dom->getElementsByTagName('user');
// 遍历user节点
foreach ($users as $user) {
// 获取id子节点的值
$id = $user->getElementsByTagName('id')->item(0)->nodeValue;
$name = $user->getElementsByTagName('name')->item(0)->nodeValue;
$age = $user->getElementsByTagName('age')->item(0)->nodeValue;
echo "用户ID:" . $id . "<br/>";
echo "用户姓名:" . $name . "<br/>";
echo "用户年龄:" . $age . "<br/>";
echo "----------<br/>";
}
?>
DOMDocument的优势是功能全面,能够处理各种复杂的XML结构,支持XML的修改和生成,缺点是代码相对繁琐,内存占用比SimpleXML高一些。
方法三:使用XMLReader扩展
XMLReader是一种基于流的XML解析器,采用边读边解析的方式,不需要将整个XML文件加载到内存中,适合处理非常大的XML文件,能够有效节省内存资源。
使用XMLReader读取测试XML的实例代码:
<?php
// 创建XMLReader对象
$reader = new XMLReader();
// 打开XML文件
$reader->open('test.xml');
// 循环读取XML节点
while ($reader->read()) {
// 判断当前节点是否为user元素的开始标签
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'user') {
$userData = [];
// 读取user节点内部的子节点
while ($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT) {
$nodeName = $reader->name;
$reader->read();
$userData[$nodeName] = $reader->value;
}
// 遇到user结束标签则退出内部循环
if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == 'user') {
break;
}
}
echo "用户ID:" . $userData['id'] . "<br/>";
echo "用户姓名:" . $userData['name'] . "<br/>";
echo "用户年龄:" . $userData['age'] . "<br/>";
echo "----------<br/>";
}
}
// 关闭XMLReader
$reader->close();
?>
XMLReader的核心优势是内存占用低,适合大文件解析,缺点是代码逻辑相对复杂,不适合处理需要随机访问XML节点的场景。
方法四:使用正则表达式匹配
这种方法不依赖任何XML扩展,通过正则表达式直接匹配XML中的内容,适合处理结构非常简单、格式固定的XML片段,但是不推荐用于规范的XML解析,因为正则表达式无法处理XML的嵌套结构、命名空间等复杂情况。
使用正则匹配测试XML中用户信息的实例代码:
<?php
// 读取XML文件内容
$xmlContent = file_get_contents('test.xml');
// 正则匹配所有user节点的内容
preg_match_all('/<user>(.*?)</user>/s', $xmlContent, $userMatches);
if (!empty($userMatches[1])) {
foreach ($userMatches[1] as $userContent) {
// 匹配id
preg_match('/<id>(.*?)</id>/', $userContent, $idMatch);
// 匹配name
preg_match('/<name>(.*?)</name>/', $userContent, $nameMatch);
// 匹配age
preg_match('/<age>(.*?)</age>/', $userContent, $ageMatch);
echo "用户ID:" . $idMatch[1] . "<br/>";
echo "用户姓名:" . $nameMatch[1] . "<br/>";
echo "用户年龄:" . $ageMatch[1] . "<br/>";
echo "----------<br/>";
}
}
?>
这种方法的优点是无需依赖扩展,适合临时处理简单XML片段,缺点是健壮性差,一旦XML结构发生变化就可能出现匹配错误,无法处理复杂的XML规范。
四种方法的选择建议
不同的场景可以选择不同的XML读取方法:
- 如果XML结构简单,只需要读取数据,优先选择SimpleXML,代码最简洁
- 如果需要处理复杂XML结构,或者需要对XML进行修改、生成操作,选择DOMDocument
- 如果XML文件体积非常大,需要节省内存,选择XMLReader
- 如果是处理格式固定、简单的XML片段,临时使用可以选择正则表达式,但不推荐用于正式项目
在实际开发中,还可以根据需求组合使用不同的方法,比如先用XMLReader读取大文件,提取需要的部分后再用SimpleXML处理,提升整体效率。
phpXMLSimpleXMLDOMDocumentXMLReader修改时间:2026-07-14 03:18:33