現在の位置: ホーム> 最新記事一覧> XML_PARSEおよびXML_GET_ERRORSを使用して、解析エラーをキャプチャします

XML_PARSEおよびXML_GET_ERRORSを使用して、解析エラーをキャプチャします

M66 2025-04-28

XMLデータをPHPで処理する場合、 XML_PARSE関数を使用してXML文字列を解析できます。ただし、XMLファイルには、閉鎖されていないタグや文字エンコードエラーなど、フォーマットの問題が発生していることが多く、解析障害につながる可能性があります。これらのエラーを優雅にキャッチして処理するために、 XML_PARSEXML_GET_ERROR_CODEXML_ERROR_STRINGXML_GET_CURRENT_LINE_NUMBERなどの関数を使用できます。

これらの関数を使用してXML解析エラーを検出および報告する方法の完全な例を見てみましょう。

例: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);
?>

分析します

  1. xml_parser_create()
    XML文字列を解析するために後で使用されるXMLパーサーリソースを作成します。

  2. xml_parse()
    提供されたXML文字列を解析します。解析が失敗した場合、 falseが返されます。

  3. XML_GET_ERROR_CODE() / XML_ERROR_STRING()
    エラーコードを取得し、読み取り可能なエラー情報に変換します。

  4. xml_get_current_line_number()
    エラーが発生したときに行番号を取得します。これにより、問題の迅速な位置決めが容易になります。

  5. xml_parser_free()
    メモリの漏れを避けるために、解析後のリリースが完了しました。

アプリケーションシナリオ

この方法は、次のシナリオに非常に適しています。

  • ユーザーがXMLファイルをアップロードしたときのフォーマット検証。

  • サードパーティインターフェイスがXMLデータを返す場合のフォールトトレラント処理。

  • 自動化されたデータインポートシステムにおけるロジックを事前チェックします。

  • オンラインエディターのXML形式のインスタントチェック。

ヒント

  • DOMまたはSimplexMLを使用してLIBXML拡張機能を使用すると、より高度なXML操作方法が提供されますが、 XML_PARSEなどの基礎となる元のパーサーは、大規模なデータストリームを処理する際のより効率的です。

  • 外部XMLデータを直接信頼しないでください。フォーマットエラーに加えて、悪意のあるエンティティ(XXE攻撃)に注入することもできます。エンティティの解析機能をオフにすることを忘れないでください。