PHPのXML解析機能を使用する場合、 XML_SET_DEFAULT_HANDLERは、デフォルトのコールバックプロセッサを設定して、比較中に発生する一致しないXML要素またはテキストコンテンツを処理する非常に便利な関数です。コールバック関数がトリガーされていない場合、複数の理由が原因である可能性があります。この記事では、いくつかの一般的な理由を詳細に分析し、対応するソリューションを提供します。
xml_set_default_handlerを使用する場合、コールバック関数の定義は、コールバック関数のPHP要件に準拠する必要があります。コールバック関数が誤って定義されている場合、PHPは関数を無視し、コールバックが起動されません。コールバック関数は、3つのパラメーターを受け入れる必要があります。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">defaultHandler</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$parser</span></span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Default handler triggered: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>
で:
$パーサーはXMLパーサーリソースです。
$データは、他のコールバックによって処理されていないテキストデータです。
コールバック関数に2つのパラメーターがあり、最初のパラメーターが無視できることを確認してください。
XML_SET_DEFAULT_HANDLERは、他のコールバック関数によって処理されないXMLデータにコンテンツがある場合にのみトリガーされます。たとえば、 xml_set_element_handlerまたはxml_set_character_data_handlerを使用してより具体的なコールバック関数を設定すると、 xml_set_default_handlerは、これらのコールバックが現在の要素またはテキストを処理しない場合にのみトリガーされます。すべての要素とデータが明示的なコールバック関数で処理されている場合、デフォルトのコールバックはトリガーされません。
回避策:特定のコールバック関数によって処理されないものがあることを確認するか、他のコールバック関数を誤用するかどうかを確認してください。
XMLデータ自体に問題がある場合、パーサーは、 XML_SET_DEFAULT_HANDLERをトリガーする必要がある場所に到達せずに早期に終了する場合があります。たとえば、XMLまたは非準拠のタグの特定の違法な文字は、解析が失敗する可能性があります。現時点では、 XML_SET_DEFAULT_HANDLERを実行できません。
回避策:XMLデータが標準に準拠しているかどうかを確認します。LIBXML_USE_INTERNAL_ERRORS (TRUE)を使用して、XML解析エラーをキャプチャし、キャプチャして出力します。
<span><span><span class="hljs-title function_ invoke__">libxml_use_internal_errors</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_set_default_handler</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-string">'defaultHandler'</span></span><span>);
</span></span>
xml_set_default_handlerを登録する場合、パーサーがまだ開始されていない場合、またはコールバックの登録順序が正しくない場合、コールバック関数もトリガーされません。 XML_PARSEコールの前に、コールバック関数が登録されていることを確認してください。
<span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_set_default_handler</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-string">'defaultHandler'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">xml_parse</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-variable">$xmlData</span></span><span>);
</span></span>
パーサーがXML_PARSEへの呼び出しの前または呼び出し中にパーサーが非アクティブまたは閉じている場合、 XML_SET_DEFAULT_HANDLERが発射されない場合があります。この場合、パーサーのステータスを確認し、 xml_parseを呼び出す前にすべてのコールバック関数が設定されていることを確認します。
最後に、特に異なる解析ライブラリまたはバージョンが構成されている場合、PHPのさまざまなバージョンのXML解析のサポートに違いがある可能性があります。 PHPのXML拡張機能が有効になっていない場合、またはバージョンが低すぎる場合、 XML_SET_DEFAULT_HANDLERは適切に機能しない場合があります。
回避策:PHPバージョンのインストールステータスとXML拡張機能を確認してください。 phpinfo()を介して関連する構成情報を表示できます。
XML_SET_DEFAULT_HANDLERのコールバック関数がトリガーされていない場合、誤ったコールバック関数定義、コールバック関数登録順序、XMLデータの問題、PHP構成などの複数の側面が含まれる場合があります。この問題は、これらの一般的な原因を慎重に確認することで効果的に解決できます。コールバック関数が要件に準拠して定義されていることを確認すると、XMLデータ形式が正しく、適切なタイミングでコールバック関数を登録すると、そのような問題を回避できます。