當前位置: 首頁> 最新文章列表> xml_parse_into_struct 函數如何區分和提取XML 標籤與它們的屬性信息?

xml_parse_into_struct 函數如何區分和提取XML 標籤與它們的屬性信息?

M66 2025-06-12

在PHP 中,處理XML 的常見方式之一是使用xml_parse_into_struct()函數。這個函數可以將XML 文檔解析成一個結構化的數組,其中不僅包括了標籤的層級關係,還可以提取標籤屬性、值以及類型等信息。本文將介紹如何通過該函數來區分和提取XML 標籤與它們的屬性信息,並通過示例加以說明。

函數原型

int xml_parse_into_struct(
    XMLParser $parser,
    string $data,
    array &$values,
    array &$index = null
);
  • $parser :XML 解析器資源。

  • $data :要解析的XML 數據。

  • $values :輸出的結構化數組。

  • $index :可選的數組,用於索引標籤。

如何提取標籤與屬性信息?

xml_parse_into_struct()的關鍵之處在於它將所有標籤、文本節點、CDATA 等信息都按順序寫入$values數組中。數組中每一項是一個關聯數組,主要字段包括:

  • tag :標籤名。

  • type :節點類型(例如openclosecompletecdata等)。

  • value :標籤包含的文本值(如果有)。

  • attributes :標籤的屬性,作為一個關聯數組存在(如果有屬性)。

示例:解析包含屬性的XML

假設我們有以下XML:

 <books>
    <book id="1" category="fiction">
        <title>Book One</title>
    </book>
    <book id="2" category="non-fiction">
        <title>Book Two</title>
    </book>
</books>

我們可以使用以下PHP 代碼進行解析:

 <?php
$xml = <<<XML
<books>
    <book id="1" category="fiction">
        <title>Book One</title>
    </book>
    <book id="2" category="non-fiction">
        <title>Book Two</title>
    </book>
</books>
XML;

$parser = xml_parser_create();
xml_parse_into_struct($parser, $xml, $values, $index);
xml_parser_free($parser);

echo "<pre>";
print_r($values);
echo "
"; ?>

解析後$values的內容大致如下:

 Array
(
    [0] => Array
        (
            [tag] => BOOKS
            [type] => open
        )

    [1] => Array
        (
            [tag] => BOOK
            [type] => open
            [attributes] => Array
                (
                    [ID] => 1
                    [CATEGORY] => fiction
                )
        )

    [2] => Array
        (
            [tag] => TITLE
            [type] => complete
            [value] => Book One
        )

    [3] => Array
        (
            [tag] => BOOK
            [type] => close
        )

    [4] => Array
        (
            [tag] => BOOK
            [type] => open
            [attributes] => Array
                (
                    [ID] => 2
                    [CATEGORY] => non-fiction
                )
        )

    [5] => Array
        (
            [tag] => TITLE
            [type] => complete
            [value] => Book Two
        )

    [6] => Array
        (
            [tag] => BOOK
            [type] => close
        )

    [7] => Array
        (
            [tag] => BOOKS
            [type] => close
        )
)

解析說明

  • 每個book標籤都有openclose類型項。

  • 屬性信息被包含在attributes鍵中,以關聯數組形式存在。

  • 文本值(如書名)存在於value鍵中,標籤類型為complete

  • 標籤名始終大寫,這是xml_parse_into_struct()的默認行為。

提取屬性信息

你可以通過遍歷$values數組來提取所有帶有屬性的標籤。例如:

 foreach ($values as $entry) {
    if (isset($entry['attributes'])) {
        echo "Tag: {$entry['tag']}\n";
        foreach ($entry['attributes'] as $attrName => $attrValue) {
            echo "  $attrName => $attrValue\n";
        }
    }
}

注意事項

  • 標籤名和屬性名都會被自動轉換為大寫。

  • 該函數不保留標籤的層級結構信息,只是按照出現順序排列。

  • 適用於簡單XML,如果需要更複雜的結構處理,建議使用DOM 或SimpleXML。

小結