XMLデータ、特に名前空間のあるドキュメントを処理する場合、PHPのXMLパーサー(Expatに基づく)を使用することは、柔軟で効率的な方法です。この記事では、 XML_SET_END_NAMESPACE_DECL_HANDLER関数の使用を説明することに焦点を当て、それを完全な例と組み合わせて、機能を正しく利用し、解析プロセス中の名前空間宣言の終わりを処理する方法を説明します。
PHPは、 XML_PARSER_CREATE 、 XML_PARSE 、 XML_SET_ELEMENT_HANDLERなど、 XML_PARSER_CREATEなどの一連のイベント駆動型XML解析機能を提供します。 それぞれ。
名前空間の開始の処理はより一般的に使用されますが、特にネストが複雑である場合、またはスコープスタックを維持する必要がある場合、エンディング処理も同様に重要です。 xml_set_end_namespace_decl_handlerを使用すると、名前空間の最後にクリーンアップ操作を実行したり、名前空間スタックを維持したり、デバッグのログログを維持したりできます。
bool xml_set_end_namespace_decl_handler ( resource $parser , callable $handler )
$パーサー: XML_PARSER_CREATEによって作成されたパーサーリソース。
$ハンドラー:関数ハンドラー(リソース$パーサー、string $ prefix)の形式のコールバック関数は、名前空間宣言の最後に呼び出されます。
xml_set_end_namespace_decl_handlerを使用した完全な例を次に示します。
<?php
$xml = <<<XML
<?xml version="1.0"?>
<root xmlns:h="http://gitbox.net/hello" xmlns:f="http://gitbox.net/foo">
<h:child>Content</h:child>
<f:child>Another</f:child>
</root>
XML;
$parser = xml_parser_create();
// 名前空間処理を設定します
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
// 名前空間は、プロセッサの宣言を開始します
xml_set_start_namespace_decl_handler($parser, function($parser, $prefix, $uri) {
echo "Namespace Start: prefix = {$prefix}, uri = {$uri}\n";
});
// 名前空間終了宣言プロセッサ
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) {
echo "Namespace End: prefix = {$prefix}\n";
});
// 要素プロセッサ
xml_set_element_handler($parser,
function($parser, $name, $attrs) {
echo "Start Element: {$name}\n";
},
function($parser, $name) {
echo "End Element: {$name}\n";
}
);
// 解析を実行します
if (!xml_parse($parser, $xml, true)) {
$error = xml_error_string(xml_get_error_code($parser));
$line = xml_get_current_line_number($parser);
die("XML Error: {$error} at line {$line}\n");
}
xml_parser_free($parser);
上記のスクリプトを実行し、次のように出力します。
Namespace Start: prefix = h, uri = http://gitbox.net/hello
Namespace Start: prefix = f, uri = http://gitbox.net/foo
Start Element: root
Start Element: h:child
End Element: h:child
Start Element: f:child
End Element: f:child
End Element: root
Namespace End: prefix = f
Namespace End: prefix = h
出力から、次のようになります。
名前空間宣言の順序は、ドキュメント内の定義と一致しています。
要素解析が完了した後、 XML_SET_END_NAMESPACE_DECL_HANDLERは、名前空間の終わりを正しくキャプチャします。
解析中に名前空間スコープスタックを維持している場合、これはスタックをリリースする良い機会です。
スコープコントロール:XML解析(パーサーの構成やツリー構造の構成など)で名前空間スコープを使用する場合、名前空間宣言プロセッサの開始と終了の両方の両方を使用してください。
デバッグツール: XML_SET_NAMESPACE_DECL_HANDLERを使用して、名前空間の競合、ネスト、ミキシングなどの複雑な状況をデバッグする場合、XMLドキュメントの構造をよりよく理解するのに役立ちます。
名前空間スタック設計:PHPアレイを使用してスタック構造をシミュレートし、開始時に配置し、終了時にスタックを配置して、現在の名前空間コンテキストをより正確に追跡することができます。
XML_SET_END_NAMESPACE_DECL_HANDLERは一般的に要素プロセッサとして使用されていませんが、複雑なXMLを扱うとき、特に複数の名前空間を混合するときに非常に重要な補助的役割を提供できます。その使用をマスターすると、XMLパーサーがより強く、より堅牢になります。この記事が、PHPを使用してXMLを解析するときに、この強力なツール機能を最大限に活用するのに役立つことを願っています。