XMLドキュメントを解析する場合、名前空間を使用すると、特にさまざまなXML仕様が混合使用で使用されるシナリオで、要素名と属性名の間の競合を効果的に回避できます。 PHPのXMLパーサー(Expatに基づく)を使用して、複数の名前空間でXMLファイルを処理する場合、名前空間の開始と終了を合理的に管理することが特に重要です。
この記事では、XML_SET_NAMESPACE_DECL_HANDLER関数を使用して、複数の名前空間が同時に終了する状況を処理し、XML構造を正しく解析およびトレースできるようにする方法に焦点を当てます。
XML_SET_END_NAMESPACE_DECL_HANDLERは、PHPによって提供される関数であり、名前空間宣言の終了時にパーサーによってトリガーされるプロセッサ(コールバック関数)を設定します。そのプロトタイプは次のとおりです。
bool xml_set_end_namespace_decl_handler(XMLParser $parser, callable $handler)
$パーサーはXML_PARSER_CREATE()によって作成されたパーサーリソースです。 $ハンドラーは、名前空間スコープが終了したときに呼び出されるコールバック関数です。
XML構造を次のように想像してください。
<root xmlns:h="http://gitbox.net/html" xmlns:f="http://gitbox.net/form">
<h:table>
<f:input type="text"/>
</h:table>
</root>
上記のXMLでは、 HとFは2つの異なる名前空間です。それらのスコープは<root>タグ全体にありますが、より複雑なドキュメントでは、ネストされた名前空間の構造が表示される場合があり、複数の名前空間が要素が閉じていると同時に終了します。
リソースの記録、チェック、リリースなど、これらの名前空間の最後にいくつかの操作を行いたいと考えています。
xml_set_end_namespace_decl_handlerを使用して名前空間の最後を処理する方法を示す完全な例を示します。
<?php
$xml = <<<XML
<root xmlns:h="http://gitbox.net/html" xmlns:f="http://gitbox.net/form">
<h:table>
<f:input type="text"/>
</h:table>
</root>
XML;
// 作成する XML パーサー
$parser = xml_parser_create_ns();
// 名前空間エンドプロセッサを設定します
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) {
echo "名前空間の終わり: プレフィックス = $prefix\n";
});
// デフォルトの要素プロセッサを設定します
xml_set_element_handler($parser,
function($parser, $name, $attrs) {
echo "要素を開始します: $name\n";
},
function($parser, $name) {
echo "終了要素: $name\n";
}
);
// 分析 XML データ
if (!xml_parse($parser, $xml, true)) {
die(sprintf(
"XML 間違い: %s で %d わかりました",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)
));
}
// 释放パーサー资源
xml_parser_free($parser);
?>
上記のコードを実行すると、次のような出力が表示されます。
要素を開始します: root
要素を開始します: h:table
要素を開始します: f:input
終了要素: f:input
終了要素: h:table
終了要素: root
名前空間の終わり: プレフィックス = h
名前空間の終わり: プレフィックス = f
ご覧のとおり、名前空間はドキュメントの先頭に宣言されていますが、 <root>要素が閉じているときにスコープが実際に終了し、 XML_SET_END_NAMESPACE_DECL_HANDLERがこの動作を正常にキャプチャします。
名前空間プロセッサは、xml_parser_create_ns()を使用してパーサーを作成する場合にのみ有効になります。
xml_set_end_namespace_decl_handlerのコールバック関数は、パーサーリソースと名前空間プレフィックスの2つのパラメーターのみを受信します。
複数の名前空間が同時に終了すると、各名前空間に対して1回、コールバックが順番に呼び出されます。
XML_SET_END_NAMESPACE_DECL_HANDLER関数を使用すると、PHP開発者は、特に複雑なXMLドキュメントを扱う場合、名前空間ライフサイクルを正確に制御できます。名前空間を起動および終了するプロセッサを組み合わせると、安定した保守可能なXML解析ロジックを構築して、Webサービスや構成ファイルの解析などのシナリオで正しいデータ処理機能を確保することができます。