在 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。