在處理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()無疑是一個值得考慮的工具。