上一节我们简单介绍了什么是SimpleXML解析器,本节我们将深入学习SimpleXML解析器的核心内置函数。
我们先通过一张表格来总览SimpleXML解析器的核心内置函数。
| 类别 | 函数/方法 | 描述 |
|---|---|---|
| 核心加载函数 | simplexml_load_string(string $data) | 将 XML 字符串 解析为 SimpleXMLElement 对象。 |
simplexml_load_file(string $filename) | 将 XML 文件 解析为 SimpleXMLElement 对象。 | |
simplexml_import_dom(DOMNode $node) | 将 DOM 节点 转换为 SimpleXMLElement 对象。 | |
| 对象方法 | attributes([string $ns, bool $is_prefix]) | 获取当前元素的属性。返回 SimpleXMLElement 对象。 |
children([string $ns, bool $is_prefix]) | 获取当前元素的子元素。 | |
getName() | 获取当前元素的名称。 | |
addChild(string $name [, string $value [, string $ns]]) | 为当前元素添加子元素。返回新添加的子元素对象。 | |
addAttribute(string $name, string $value [, string $ns]) | 为当前元素添加属性。 | |
asXML([string $filename]) | 将 SimpleXML 元素转换回 XML 字符串,或保存到文件。 | |
__toString() | 获取当前元素的文本内容(字符串)。 | |
xpath(string $path) | 使用 XPath 表达式 查询元素。返回匹配元素的数组。 | |
registerXPathNamespace(string $prefix, string $ns) | 为 XPath 查询注册命名空间前缀。 | |
| 辅助函数 | simplexml_load_string 的第二个参数 | 指定要使用的节点类名 (默认是 SimpleXMLElement)。 |
simplexml_load_file 的第二个参数 | 同上,指定节点类名。 | |
libxml_use_internal_errors(bool $use_errors) | 启用/禁用 libxml 内部错误捕获,用于调试解析错误。 | |
libxml_get_errors() | 获取 libxml 解析过程中产生的错误数组。 | |
| 数据访问 (特性) | 对象属性访问 | 通过 -> 访问元素节点。 |
| 数组下标访问 | 通过 ['属性名'] 访问属性。 | |
| 数组迭代 | 对多个同名兄弟节点可直接使用 foreach。 | |
| 数字下标访问 | 通过 [索引] 访问特定位置的兄弟节点。 | |
| 字符串转换 | 将 SimpleXMLElement 对象强制转换为 string 获取其文本值。 |
SimpleXML解析器的核心内置函数很多,这里我们通过一个案例让您认识其最实用的方法(包括查询xml数据和修改xml数据)。
1. 先准备一个dotcpp.xml文件。
<?xml version="1.0" encoding="UTF-8"?> <dotcpp> <brand>Dotcpp编程</brand> <website>dotcpp.com</website> <course>PHP教程</course> <courses> <course id="1">PHP基础</course> <course id="2">PHP高级</course> <course id="3">PHP框架</course> </courses> </dotcpp>
2. 实操SimpleXML内置函数。
<?php
// 1. 加载与基本访问
$xml = simplexml_load_file('dotcpp.xml');
if ($xml === false) {
die('无法加载XML文件');
}
echo "1. 基本访问示例:<br>";
echo "品牌:" . $xml->brand . "<br>"; // 访问元素
echo "网站:" . $xml->website . "<br>";
echo "课程:" . $xml->course . "<br><br>";
// 2. 遍历与查询
echo "2. 遍历课程列表:<br>";
foreach ($xml->courses->course as $course) {
echo "课程" . $course['id'] . ":" . $course . "<br>";
}
echo "<br>";
// 3. 使用 XPath 查询
echo "3. 使用XPath查询(id为2的课程):<br>";
$results = $xml->xpath('//course[@id="2"]');
foreach ($results as $course) {
echo "查询结果:" . $course . " (ID: " . $course['id'] . ")<br>";
}
echo "<br>";
// 4. 处理属性
echo "4. 处理属性示例:<br>";
// 方法1:直接访问
$firstCourse = $xml->courses->course[0];
echo "第一个课程的ID:" . $firstCourse['id'] . "<br>";
// 方法2:使用attributes()方法
$attrs = $firstCourse->attributes();
echo "属性方法获取ID:" . $attrs['id'] . "<br><br>";
// 5. 遍历所有属性
echo "5. 所有课程的属性遍历:<br>";
foreach ($xml->courses->course as $course) {
echo "课程:" . $course . ",";
foreach ($course->attributes() as $name => $value) {
echo "{$name}:{$value} ";
}
echo "<br>";
}
echo "<br>";
// 6. 修改并保存
echo "6. 修改并保存XML:<br>";
// 添加新课程
$newCourse = $xml->courses->addChild('course', 'PHP实战项目');
$newCourse->addAttribute('id', '4');
$newCourse->addAttribute('level', '高级');
// 添加新元素到根节点
$xml->addChild('description', '提供专业的编程教程');
// 保存到新文件
$xml->asXML('dotcpp_updated.xml');
echo "XML已更新并保存到 dotcpp_updated.xml<br>";
// 显示更新后的结构
echo "<br>7. 更新后的课程列表:<br>";
foreach ($xml->courses->course as $course) {
$id = isset($course['id']) ? $course['id'] : '未知';
$level = isset($course['level']) ? " (级别:" . $course['level'] . ")" : "";
echo "课程{$id}:" . $course . $level . "<br>";
}
?>3. 查看访问效果:
3.1 test.php页面展示:

3.2 查看dotcppupdate.xml文件:

总结:SimpleXML以最直观的对象属性语法,将复杂的XML数据变成了PHP中可以直接“点”出来的数据结构,让XML解析从繁琐的DOM操作变成了近乎透明的数据访问,极大降低了PHP处理XML的门槛和代码复杂度。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程