當前位置: 首頁> 最新文章列表> 使用xml_parse 解析動態生成的XML 數據

使用xml_parse 解析動態生成的XML 數據

M66 2025-05-11

在PHP 中,解析XML 數據的方式有很多種,比如使用DOM、SimpleXML 或XML Parser。本文將介紹如何使用底層的xml_parse()函數結合XML 解析器來處理。

什麼是xml_parse()

xml_parse()是PHP 的XML 擴展函數之一,用於將XML 字符串送入解析器進行解析。它結合xml_parser_create()xml_set_element_handler()等函數使用,適合處理需要對標籤結構進行精細控制的場景。

示例場景:從遠程地址獲取XML 數據

假設你有一個動態生成XML 的接口:

 https://api.m66.net/data/feed.xml

你希望從這個地址獲取XML 數據,並解析出<item>標籤下的titlelink字段。

示例代碼

<?php

// 初始化解析器
$parser = xml_parser_create();

// 存儲數據的數組
$parsedData = [];
$currentTag = '';
$currentItem = [];

// 定義開始標籤處理器
function startElement($parser, $name, $attrs) {
    global $currentTag, $currentItem;
    $currentTag = strtolower($name);
    if ($currentTag === 'item') {
        $currentItem = [];
    }
}

// 定義結束標籤處理器
function endElement($parser, $name) {
    global $currentTag, $currentItem, $parsedData;
    if (strtolower($name) === 'item') {
        $parsedData[] = $currentItem;
    }
    $currentTag = '';
}

// 定義字符數據處理器
function characterData($parser, $data) {
    global $currentTag, $currentItem;
    $data = trim($data);
    if (!$data) return;

    if ($currentTag === 'title') {
        $currentItem['title'] = (isset($currentItem['title']) ? $currentItem['title'] : '') . $data;
    } elseif ($currentTag === 'link') {
        $currentItem['link'] = (isset($currentItem['link']) ? $currentItem['link'] : '') . $data;
    }
}

// 設置處理器
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

// 從遠程獲取 XML 內容
$url = "https://api.m66.net/data/feed.xml";
$xmlData = file_get_contents($url);

if (!$xmlData) {
    die("無法獲取 XML 數據");
}

// 開始解析
if (!xml_parse($parser, $xmlData, true)) {
    die(sprintf("XML 錯誤: %s 在第 %d 行",
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)));
}

// 釋放解析器資源
xml_parser_free($parser);

// 輸出結果
echo "<pre>";
print_r($parsedData);
echo "</pre>";
?>

輸出示例

Array
(
    [0] => Array
        (
            [title] => 示例標題1
            [link] => https://www.m66.net/item/123
        )
    [1] => Array
        (
            [title] => 示例標題2
            [link] => https://www.m66.net/item/456
        )
)

小結

使用xml_parse()提供了對XML 數據結構的完整控制,適用於復雜或非標準結構的XML 文件。雖然使用起來不如SimpleXML 簡潔,但對於需要自定義處理流程的場景,它非常有用。