PHPでは、XMLを処理する一般的な方法の1つは、XML_PARSE_INTO_STRUCT()関数を使用することです。この関数は、XMLドキュメントを構造化された配列に解析することができます。これには、タグの階層的関係が含まれるだけでなく、タグ属性、値、およびタイプも抽出できます。この記事では、この関数を通じてXMLタグを属性情報と区別および抽出する方法を説明し、例で説明します。
int xml_parse_into_struct(
XMLParser $parser,
string $data,
array &$values,
array &$index = null
);
$パーサー:XMLパーサーリソース。
$データ:解析するXMLデータ。
$値:出力の構造化された配列。
$ index :インデックス作成ラベルのオプション配列。
XML_PARSE_INTO_STRUCT()のキーは、すべてのタグ、テキストノード、CDATA、その他の情報を$値配列に順番に書き込むことです。配列内の各アイテムは連想配列であり、メインフィールドには以下が含まれます。
タグ:タグ名。
タイプ:ノードタイプ(オープン、クローズ、完全、 CDATAなど)。
値:タグに含まれるテキスト値(ある場合)。
属性:タグの属性は、連想配列として存在します(属性がある場合)。
次の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 "
";
?>
解析後の$値のコンテンツは、ほぼ次のとおりです。
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タグには、オープンおよびクローズタイプのアイテムがあります。
属性情報は属性キーに含まれ、連想配列の形で存在します。
テキスト値(本のタイトルなど)は値キーに存在し、タグタイプが完了します。
タグ名は常に大文字であり、これは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が推奨されます。