在处理 XML 数据时,PHP 提供了一些强大的工具,其中之一就是 xml_parse() 函数,它隶属于 PHP 的 XML 解析器(基于 Expat)。本文将介绍如何使用该函数解析 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>
我们的目标是解析出每篇文章的 id、author 属性,以及其标题和链接。
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 文件结构较复杂或需求灵活,可以考虑使用 DOMDocument 或 SimpleXML。但当你需要精细控制解析过程,或者对性能有极致要求时,xml_parse() 无疑是一个值得考虑的工具。