XMLデータをPHPで処理する場合、 XML_PARSE関数を使用してXML文字列を解析できます。ただし、XMLファイルには、閉鎖されていないタグや文字エンコードエラーなど、フォーマットの問題が発生していることが多く、解析障害につながる可能性があります。これらのエラーを優雅にキャッチして処理するために、 XML_PARSE 、 XML_GET_ERROR_CODE 、 XML_ERROR_STRING 、 XML_GET_CURRENT_LINE_NUMBERなどの関数を使用できます。
これらの関数を使用してXML解析エラーを検出および報告する方法の完全な例を見てみましょう。
<?php
// エラーをシミュレートします XML 弦(閉じたタグがありません)
$xmlData = <<<XML
<note>
<to>ユーザー</to>
<from>管理者</from>
<heading>思い出させる</heading>
<body>これはテストメッセージです
</note>
XML;
// 作成する 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 データ
if (!xml_parse($parser, $xmlData, true)) {
$errorCode = xml_get_error_code($parser);
$errorMessage = xml_error_string($errorCode);
$lineNumber = xml_get_current_line_number($parser);
echo "? 分析 XML その間にエラーが発生しました:\n";
echo "エラーメッセージ:$errorMessage\n";
echo "エラーコード:$errorCode\n";
echo "エラーわかりました数:$lineNumber\n";
// エラーロギング,或者引导ユーザー查看帮助页面
// 例:ログファイルへのログエラー
error_log("XML 分析错误:$errorMessage で $lineNumber わかりました", 3, "/var/log/xml_errors.log");
// または、ヘルプリンクを表示します
echo "ヘルプ文書を参照してください:https://m66.net/xml/help\n";
} else {
echo "? XML 分析成功!\n";
}
// 释放パーサー资源
xml_parser_free($parser);
?>
xml_parser_create()
XML文字列を解析するために後で使用されるXMLパーサーリソースを作成します。
xml_parse()
提供されたXML文字列を解析します。解析が失敗した場合、 falseが返されます。
XML_GET_ERROR_CODE() / XML_ERROR_STRING()
エラーコードを取得し、読み取り可能なエラー情報に変換します。
xml_get_current_line_number()
エラーが発生したときに行番号を取得します。これにより、問題の迅速な位置決めが容易になります。
xml_parser_free()
メモリの漏れを避けるために、解析後のリリースが完了しました。
この方法は、次のシナリオに非常に適しています。
ユーザーがXMLファイルをアップロードしたときのフォーマット検証。
サードパーティインターフェイスがXMLデータを返す場合のフォールトトレラント処理。
自動化されたデータインポートシステムにおけるロジックを事前チェックします。
オンラインエディターのXML形式のインスタントチェック。
DOMまたはSimplexMLを使用してLIBXML拡張機能を使用すると、より高度なXML操作方法が提供されますが、 XML_PARSEなどの基礎となる元のパーサーは、大規模なデータストリームを処理する際のより効率的です。
外部XMLデータを直接信頼しないでください。フォーマットエラーに加えて、悪意のあるエンティティ(XXE攻撃)に注入することもできます。エンティティの解析機能をオフにすることを忘れないでください。