在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 :節點類型(例如open 、 close 、 complete 、 cdata等)。
value :標籤包含的文本值(如果有)。
attributes :標籤的屬性,作為一個關聯數組存在(如果有屬性)。
假設我們有以下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標籤都有open和close類型項。
屬性信息被包含在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。