多くの開発者は、PHPのXML_PARSE()関数を使用してXMLデータを解析する際に一般的な問題に遭遇します。「XML解析失敗」エラー。この種のエラーは、特に一見よく形成されたXMLコンテンツを扱う場合、しばしば混乱します。この記事では、この問題の原因を詳細に分析し、いくつかの効果的なソリューションを提供します。
XML_PARSE()は、PHPのXMLパーサー拡張の一部であり、イベント駆動型の解析のためにExpat XMLパーサーライブラリに依存しています。入力XMLがXML標準に完全に準拠する必要があります。そうしないと、解析エラーがスローされます。
構文は次のとおりです。
bool xml_parse(resource $parser, string $data, bool $is_final)
パラメーター説明:
$パーサー: xml_parser_create()によって作成されたパーサーリソース。
$データ:解析するXMLデータ。
$ is_final :それが最後のデータであるかどうかを示します。
最も一般的な問題は、XML自体が誤った形式であることです。例えば:
閉じていないラベル
違法なキャラクターが使用されました( &として正しく逃げられないなど)
たとえば、宣言エラー、XML宣言はスペースの後に配置されます
$xml = '<note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don\'t forget me this weekend.</note>';
上記の例では、欠落している</body>タグは解析を故障させます。
XML宣言がUTF-8を使用しているが、実際のコンテンツに非UTF-8エンコードされた文字が含まれている場合、解析も失敗します。
<?xml version="1.0" encoding="UTF-8"?>
コンテンツにGBKエンコードされた文字が含まれているが、それらがUTF-8であることを示している場合、エラーも発生します。
URLまたはファイルを介してXMLコンテンツを読み取ると、読み取りが失敗するか、部分的なデータのみが読み取られ、解析障害も発生します。
$url = 'https://m66.net/data/feed.xml';
$xmlData = file_get_contents($url);
if ($xmlData === false) {
die("読む XML 失敗");
}
セグメントで大規模なXMLを読む場合、 XML_PARSE()の3番目のパラメーター$ IS_FINALを最後の呼び出しでTRUEに設定する必要があります。設定されていない場合、「解像度が完了していない」エラーが発生します。
これらの機能は、解析エラーの特定の原因を見つけるのに役立ちます。
$parser = xml_parser_create();
if (!xml_parse($parser, $xml, true)) {
$errorCode = xml_get_error_code($parser);
$errorMessage = xml_error_string($errorCode);
$line = xml_get_current_line_number($parser);
$column = xml_get_current_column_number($parser);
echo "XML parsing failed: $errorMessage at line $line, column $column";
}
xml_parser_free($parser);
XML検証をサポートするエディター(VSコード、崇高なテキスト、メモ帳++など)または事前検証のためのオンラインツールを使用することをお勧めします: https://m66.net/tools/xml-validator
XML宣言のエンコーディングが実際のエンコードと一致していることを常に確認してください。 UTF-8エンコーディングが推奨され、ファイルを保存するときに明示的に設定されます。
XMLソースがリモートURLである場合、リクエストが最初に成功したかどうかを確認し、次に解析することをお勧めします。
$url = 'https://m66.net/api/xml';
$xml = @file_get_contents($url);
if ($xml === false) {
die("リモートを取得できません XML データ");
}
元のXML_PARSE()と比較して、PHPはSimplexMLなどのよりモダンで簡単なXML解析方法を提供します。
$xml = simplexml_load_string($xmlData);
if ($xml === false) {
echo "SimpleXML 解析失敗";
}
またはdomdocumentを使用してください。
$dom = new DOMDocument();
$success = $dom->loadXML($xmlData);
if (!$success) {
echo "DOMDocument 解析失敗";
}
どちらの方法でも、より友好的なエラープロンプトを提供し、XMLノードの操作を容易にします。
「XML解析失敗」エラーは一般的ですが、その背後にある理由は、体系的な検査を通じて明確にチェックされることがよくあります。 XML形式の仕様を理解してフォローし、エンコードとツールを合理的に使用すると、解析の成功率が大幅に向上する可能性があります。さらに進むと、より近代的なXML解析ツールを使用することを考慮すると、開発プロセスがより効率的で安定していることもあります。
リモートXMLインターフェイスを頻繁に処理する場合は、上記の検出ロジックを関数にカプセル化し、プロジェクトで再利用して堅牢性を向上させることもできます。