XMLをPHPで解析する場合、 XML_SET_CHARACTER_DATA_HANDLERおよびXML_SET_NAMESPACE_DECL_HANDLERは、異なる解析イベントを処理するために一般的に使用される2つのコールバック関数です。それらがどのように機能し、どのように一緒に使用されるかを理解することは、複雑なXMLドキュメントパーサーを構築するために重要です。
XML_SET_CHARACTER_DATA_HANDLER() :パーサーが文字データ(つまり、ラベル間のテキスト)が遭遇するときに呼び出されるコールバック関数を指定するために使用されます。
xml_set_end_namespace_decl_handler() :名前空間が宣言を終了するときに呼び出されるコールバック関数を指定するために使用されます。これは、名前空間でXMLドキュメントを処理するために特に重要です。
これらの2つのプロセッサは、それぞれテキストコンテンツと名前空間の構造境界を処理できます。それを組み合わせて使用することにより、XMLコンテンツを名前空間で解析するときに、明確な構造と正確なデータ解析ロジックを実現できます。
パーサーを作成し、両方のプロセッサを同時にセットアップする方法を示す具体的な例を以下に示します。
<?php
// シミュレーション XML コンテンツ
$xmlData = <<<XML
<root xmlns:ns="http://gitbox.net/ns">
<ns:item>これは、名前空間を備えたプロジェクトです</ns:item>
</root>
XML;
// パーサーを作成します
$parser = xml_parser_create_ns("UTF-8", ":");
// 文字データプロセッサのセットアップ
xml_set_character_data_handler($parser, function($parser, $data) {
// Whitespace文字を削除します
$data = trim($data);
if (!empty($data)) {
echo "文字データ: " . $data . PHP_EOL;
}
});
// 名前空間エンドプロセッサを設定します
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) {
echo "名前空間の終わり: " . ($prefix ?: "[デフォルト]") . PHP_EOL;
});
// 设置デフォルト处理器,警告は避けてください
xml_set_element_handler($parser, function(){}, function(){});
// 解析を開始します
if (!xml_parse($parser, $xmlData, true)) {
die(sprintf("XML 間違い: %s で %d わかりました",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
// 無料のリソース
xml_parser_free($parser);
?>
文字データ: これは、名前空間を備えたプロジェクトです
名前空間の終わり: ns
上記のコードで:
xml_parser_create_nsを使用して、名前空間対応パーサーを作成します。
2つのプロセッサが登録されています。
キャラクターデータプロセッサは、<ns:item>の「これは名前空間のあるプロジェクトです」というテキストに遭遇すると発射されます。
パーサーが</ns:item>を読み取り、 NSネームスペースの終了を認識すると、名前空間エンドプロセッサが発射されます。
XML_PARSEを使用して、XML文字列を解析します。
xml_parser_freeを使用して、最後にパーサーリソースをリリースします。
これら2つのプロセッサを組み合わせて使用すると、次のことができます。
名前空間のライフサイクルをより適切に追跡および処理します。
ネストされた名前空間を含むXMLドキュメントを使用するときは、明確なコンテキスト構造を維持します。
有効な情報を抽出し、XML構造と一致させる柔軟性を高めます。
これは、XMLネームスペースを使用して、SOAP、RSS、またはその他のプロトコルや形式を処理するために特に重要です。
大規模なプロジェクトでは、各プロセッサをクラスメソッドにカプセル化し、コードの保守性と読みやすさを高めるために、閉鎖を通じてコンテキスト状態をバインドできます。同時に、プロセッサ内の状態レコード(現在のノード、名前空間スタックなど)を使用して、複雑なXMLの解析能力を向上させることができます。
xml_set_character_data_handlerとxml_set_end_namespace_decl_handlerを合理的に組み合わせることで、より堅牢なXML解析ロジックを構築して、XMLデータの解析ニーズに名前を簡単に対応できるようになります。