当前位置: 首页> 最新文章列表> 通过 xml_parse 提取和解析 XML 中的属性和文本内容

通过 xml_parse 提取和解析 XML 中的属性和文本内容

M66 2025-04-24

在处理 XML 数据时,PHP 提供了一些强大的工具,其中之一就是 xml_parse() 函数,它隶属于 PHP 的 XML 解析器(基于 Expat)。本文将介绍如何使用该函数解析 XML 文件,提取其中的属性值与文本内容。

一、准备 XML 数据

假设我们有如下 XML 文件,命名为 sample.xml

<?xml version="1.0" encoding="UTF-8"?>
<articles>
    <article id="101" author="Alice">
        <title>PHP XML解析教程</title>
        <url>https://m66.net/articles/php-xml</url>
    </article>
    <article id="102" author="Bob">
        <title>深入理解DOMDocument</title>
        <url>https://m66.net/articles/domdocument</url>
    </article>
</articles>

我们的目标是解析出每篇文章的 idauthor 属性,以及其标题和链接。

二、使用 xml_parse 解析 XML

xml_parse() 是低级别的 XML 解析函数,使用时需要结合 xml_set_element_handler()xml_set_character_data_handler()

示例代码:

<?php

$xml = file_get_contents('sample.xml');

$parser = xml_parser_create("UTF-8");

// 存储当前元素名
$currentTag = '';
// 存储文章数据
$articles = [];
$currentArticle = [];

xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

function startElement($parser, $name, $attrs) {
    global $currentTag, $currentArticle, $articles;

    $currentTag = strtolower($name);

    if ($currentTag === 'article') {
        // 初始化新文章
        $currentArticle = [
            'id' => $attrs['ID'] ?? '',
            'author' => $attrs['AUTHOR'] ?? '',
            'title' => '',
            'url' => ''
        ];
    }
}

function endElement($parser, $name) {
    global $currentTag, $currentArticle, $articles;

    if (strtolower($name) === 'article') {
        $articles[] = $currentArticle;
    }

    $currentTag = '';
}

function characterData($parser, $data) {
    global $currentTag, $currentArticle;

    $data = trim($data);
    if (!$data) return;

    if ($currentTag === 'title') {
        $currentArticle['title'] .= $data;
    } elseif ($currentTag === 'url') {
        $currentArticle['url'] .= $data;
    }
}

// 开始解析
if (!xml_parse($parser, $xml, true)) {
    die("XML Error: " . xml_error_string(xml_get_error_code($parser)));
}

xml_parser_free($parser);

// 输出解析结果
foreach ($articles as $article) {
    echo "文章 ID: " . $article['id'] . PHP_EOL;
    echo "作者: " . $article['author'] . PHP_EOL;
    echo "标题: " . $article['title'] . PHP_EOL;
    echo "链接: " . $article['url'] . PHP_EOL;
    echo str_repeat('-', 40) . PHP_EOL;
}

?>

三、解析结果示例

运行上述代码后,将输出:

文章 ID: 101
作者: Alice
标题: PHP XML解析教程
链接: https://m66.net/articles/php-xml
----------------------------------------
文章 ID: 102
作者: Bob
标题: 深入理解DOMDocument
链接: https://m66.net/articles/domdocument
----------------------------------------

四、小结

xml_parse() 提供了对 XML 数据流的事件驱动式处理方式,非常适合处理大文件或实时解析任务。尽管使用上不如 DOM 或 SimpleXML 直观,但它的解析效率非常高,适合内存敏感型应用。

在实际开发中,如果 XML 文件结构较复杂或需求灵活,可以考虑使用 DOMDocumentSimpleXML。但当你需要精细控制解析过程,或者对性能有极致要求时,xml_parse() 无疑是一个值得考虑的工具。