PHP 入门教程
PHP XML 解析
本教程共 65 篇 · 第 38 篇 · 更新于 2026-07-24 · 约 5 分钟阅读
PHPPHP8XMLSimpleXMLDOMDocumentXPathRSS
38. PHP XML 解析
本节目标:掌握
SimpleXML和DOMDocument解析 XML 的方法,学会用 XPath 提取数据,能把 XML 转为 PHP 数组。
XML 是一种可扩展标记语言,常用于配置文件、数据交换和 RSS 订阅。PHP 提供了多种解析 XML 的方式。
38.1 SimpleXML(最简单)
SimpleXML 把 XML 转为对象,访问属性就像操作对象属性一样直观。
解析 XML 字符串
<?php
$xml = '<?xml version="1.0"?>
<library>
<book id="1">
<title>PHP 入门</title>
<author>张三</author>
<price>59.00</price>
</book>
<book id="2">
<title>Web 开发实战</title>
<author>李四</author>
<price>89.00</price>
</book>
</library>';
$library = simplexml_load_string($xml);
// 访问第一个书的标题
echo $library->book[0]->title; // PHP 入门
echo $library->book[0]["id"]; // 1(访问属性)
// 遍历所有书
foreach ($library->book as $book) {
echo "书名:{$book->title},作者:{$book->author},价格:{$book->price}\n";
}
解析 XML 文件
<?php
$library = simplexml_load_file("books.xml");
echo "图书馆共有 " . count($library->book) . " 本书";
Tip
simplexml_load_string()和simplexml_load_file()是最常用的两个入口函数。
38.2 SimpleXML 转数组
有时需要把 XML 转为数组处理:
<?php
function xmlToArray(SimpleXMLElement $xml): array {
$array = (array) $xml;
foreach ($array as $key => $value) {
if ($value instanceof SimpleXMLElement) {
$array[$key] = xmlToArray($value);
}
}
return $array;
}
$library = simplexml_load_string($xml);
$arr = xmlToArray($library);
print_r($arr);
38.3 DOMDocument(功能最全)
DOMDocument 提供了 W3C DOM 标准的完整实现,适合需要修改 XML 的场景。
读取 XML
<?php
$dom = new DOMDocument();
$dom->load("books.xml");
// 获取所有 book 节点
$books = $dom->getElementsByTagName("book");
foreach ($books as $book) {
$title = $book->getElementsByTagName("title")->item(0)->nodeValue;
$author = $book->getElementsByTagName("author")->item(0)->nodeValue;
echo "{$title} - {$author}\n";
}
创建 XML
<?php
$dom = new DOMDocument("1.0", "UTF-8");
$dom->formatOutput = true;
// 创建根节点
$root = $dom->createElement("users");
$dom->appendChild($root);
// 添加用户
$user = $dom->createElement("user");
$user->setAttribute("id", "1");
$name = $dom->createElement("name", "张三");
$email = $dom->createElement("email", "zhangsan@example.com");
$user->appendChild($name);
$user->appendChild($email);
$root->appendChild($user);
// 保存到文件
$dom->save("users.xml");
// 或输出字符串
echo $dom->saveXML();
38.4 XPath 精准定位
XPath 是一种在 XML 中查找信息的语言,比遍历节点高效得多。
<?php
$xml = '<?xml version="1.0"?>
<catalog>
<book category="PHP">
<title>Learning PHP</title>
<price>45.00</price>
</book>
<book category="JS">
<title>Learning JS</title>
<price>39.00</price>
</book>
<book category="PHP">
<title>Advanced PHP</title>
<price>68.00</price>
</book>
</catalog>';
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
// 查询所有 PHP 类别的书
$phpBooks = $xpath->query("//book[@category='PHP']");
foreach ($phpBooks as $book) {
echo $book->getElementsByTagName("title")->item(0)->nodeValue . "\n";
}
// 查询价格大于 50 的书
$expensive = $xpath->query("//book[price > 50]/title");
foreach ($expensive as $title) {
echo $title->nodeValue . "\n";
}
常用 XPath 表达式
| 表达式 | 含义 |
|---|---|
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点 |
@ | 选取属性 |
//book[price>50] | 价格大于 50 的 book |
//title | //author | 所有 title 和 author |
//book[1] | 第一个 book |
//book[last()] | 最后一个 book |
NoteXPath 也适用于 HTML 解析。配合
libxml_use_internal_errors(true)可以处理不规范的 HTML。
38.5 解析 RSS 订阅
RSS 是 XML 的典型应用场景:
<?php
$rss = simplexml_load_file("https://example.com/feed.xml");
$channel = $rss->channel;
echo "站点:{$channel->title}\n";
echo "描述:{$channel->description}\n\n";
foreach ($channel->item as $item) {
echo "标题:{$item->title}\n";
echo "链接:{$item->link}\n";
echo "发布日期:{$item->pubDate}\n\n";
}
38.6 处理命名空间
很多 XML(如 Office 文档)使用命名空间:
<?php
$xml = '<?xml version="1.0"?>
<root xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:title>文档标题</dc:title>
<dc:creator>作者名</dc:creator>
</root>';
$sx = simplexml_load_string($xml);
// 注册命名空间前缀
$sx->registerXPathNamespace("dc", "http://purl.org/dc/elements/1.1/");
$title = $sx->xpath("//dc:title");
echo $title[0]; // 文档标题
来源:参考了 runoob「PHP XML」「PHP SimpleXML」、w3cschool「PHP XML DOM」「PHP XML SimpleXML」等,改写后所得。