当前位置: 首页> 最新文章列表> 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。

小结