當前位置: 首頁> 最新文章列表> 通過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()無疑是一個值得考慮的工具。