XML_PARSE_INTO_STRUCT()は、Expat XML解析ライブラリに基づく関数であり、そのプロトタイプは次のとおりです。
int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )
$パーサー: XML_PARSER_CREATE()によって作成されたパーサー。
$データ:解析するXML文字列。
$値:順番に配置されたXMLデータ構造の配列。
$ index :オプション、ラベル名と対応するインデックスを記録するために使用されます。
関数は1を返して解析が成功し、関数は0を返して障害を示します。
XMLは、非常に厳格なフォーマット要件を持つマークアップ言語であり、一般的なエラーには次のものが含まれます。
除去されていないタグ
属性は引用されていません
違法なキャラクター(コントロール文字など)
ネスティングエラーをタグ付けします
サンプルコード:
$data = '<root><item>Test</root>'; // ない </item> ラベル
$parser = xml_parser_create();
if (!xml_parse_into_struct($parser, $data, $values)) {
echo "XML Error: " . xml_error_string(xml_get_error_code($parser));
}
xml_parser_free($parser);
出力:
XML Error: mismatched tag
XML宣言( <?XMLバージョン= "1.0"エンコード= "utf-8"?>など)のエンコードは、実際のコンテンツエンコードと矛盾しているため、解析が失敗します。
たとえば、ファイルはUTF-8として宣言されますが、コンテンツは実際にはGBKエンコードされているため、違法な文字エラーが発生します。
解決:
ファイルのエンコードとXML宣言が一貫していることを確認してください。
MB_CONVERT_ENCODING()を使用して、UTF-8に変換します。
$data = mb_convert_encoding($data, 'UTF-8', 'GBK');
< 、 > 、 && "および' in xmlは、逃げる必要がある特殊文字です:
< → &lt;
> → &gt;
& → &amp;
例えば:
$data = '<note>Tom & Jerry</note>'; // 間違い:逃げられない &
に変更する必要があります:
$data = '<note>Tom & Jerry</note>';
ラベル名は数字や特殊文字から始めることも、スペースを含めることもできません。例えば:
<123tag>value</123tag> <!-- 違法 -->
<tag name="a b">value</tag> <!-- 属性値のスペースは引用されていません -->
これらの2つの機能は、問題をすばやく見つけるのに役立ちます。
if (!xml_parse_into_struct($parser, $data, $values)) {
echo "Error: " . xml_error_string(xml_get_error_code($parser)) .
" at line " . xml_get_current_line_number($parser);
}
トラブルシューティングプロセス中に、XMLをhttps://gitbox.net/tools/xml-validator/などのオンライン検証ツールに貼り付けて、構文エラーをすばやく発見できます。
XMLがリモートインターフェイスまたは外部ファイルから発生している場合は、解析する前に以下をクリーニングして記録することをお勧めします。
file_put_contents('/tmp/raw_xml.log', $data);
また、次のクリーニング機能を使用することもお勧めします。
function clean_xml($data) {
$data = trim($data);
// 取り除く BOM
$data = preg_replace('/^\xEF\xBB\xBF/', '', $data);
// 目に見えない文字を削除します
return preg_replace('/[^\x09\x0A\x0D\x20-\x7F\xA0-\xFF]/', '', $data);
}
xml_parse_into_struct()はdomを使用していませんが、xmlを読む前にlibxml_use_internal_errors()を使用することは、全体的なデバッグに役立ちます。
libxml_use_internal_errors(true);
透明な構造と優れた形式を持つXMLの場合、SimplexMLがより推奨されます。
$xml = simplexml_load_string($data);
よりフレンドリーなオブジェクトインターフェイスとより高い断層トレランスを提供します。