首页 / PHP 入门教程 / PHP XML 解析

PHP 入门教程

PHP XML 解析

本教程共 65 篇 · 第 38 篇 · 更新于 2026-07-24 · 约 5 分钟阅读

PHPPHP8XMLSimpleXMLDOMDocumentXPathRSS

38. PHP XML 解析

本节目标:掌握 SimpleXMLDOMDocument 解析 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
Note

XPath 也适用于 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」等,改写后所得。