PHPでXML_PARSE関数を使用してXMLを解析する一般的な方法ですが、XMLファイルに特殊文字( & 、 < 、 >>などのUTF-8文字など)が含まれている場合、解析の失敗やスクリプトエラーさえも簡単に引き起こすことができます。この記事では、実際の開発で発生したいくつかの一般的な問題を調査し、XMLを特殊文字で解析するときに一般的なトラップに陥ることを避けるための対応するソリューションを提供します。
XMLでは、文字が合法的なUTF-8文字である必要があります。入力に違法な文字(コントロール文字や違法なエンコードなど)が含まれている場合、 XML_PARSEはエラーを直接返します。
ICONVまたはMB_CONVERT_ENCODINGを使用して、コンテンツを前処理します。
$rawXml = file_get_contents('https://m66.net/data.xml');
$cleanXml = mb_convert_encoding($rawXml, 'UTF-8', 'UTF-8');
または、通常のコントロール文字をクリアするために通常を使用します。
$cleanXml = preg_replace('/[^\x09\x0A\x0D\x20-\x7E\xA0-\xFF]/', '', $rawXml);
XMLで、 & amp;として書かれている必要があります。 。元のXMLドキュメントにUNESCAPED &が含まれている場合、 XML_PARSEはエラーを報告します。
htmlspecialcharsまたはstr_replaceを使用するには、前処理には注意してください。
$cleanXml = str_replace('&', '&', $rawXml);
// 知らせ:これは単なる例です,それを使用するとき、あなたはそれが逃げられたかどうかを判断する必要があります。,繰り返される脱出は避けてください
より安全な方法は、XMLが合法であることを確認することです。
libxml_use_internal_errors(true);
$xml = simplexml_load_string($rawXml);
if (!$xml) {
foreach (libxml_get_errors() as $error) {
echo "XML Error: " . $error->message;
}
}
XMLファイルヘッダーがエンコードを指定していない場合、または実際のエンコードと一致しない場合、 XML_PARSEエラーが発生する可能性があります。
一貫したエンコードを確保するために、標準ヘッダーをXMLに強制します。
if (strpos($rawXml, '<?xml') === false) {
$rawXml = '<?xml version="1.0" encoding="UTF-8"?>' . $rawXml;
}
開発者は、 XML_PARSER_FREEに電話するのを忘れることがあり、リソースの漏れや異常な動作をもたらします。
$parser = xml_parser_create('UTF-8');
xml_set_element_handler($parser, 'startElement', 'endElement');
xml_set_character_data_handler($parser, 'characterData');
if (!xml_parse($parser, $cleanXml, true)) {
die(sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
デフォルトでは、 XML_PARSEでエラーが発生した後、例外がスローされ、エラー情報を手動でチェックする必要があります。
xml_get_error_code()やxml_error_string()などのエラー検出関数を使用して、デバッグ効率を向上させます。
XML_PARSEは根本的で十分なパフォーマンスの解析方法ですが、XMLを使用する際の正当性とキャラクターエンコードの問題には非常に注意する必要があります。障害の解析のリスクを最小限に抑えるために、信頼できないまたはサードパーティが提供するXMLファイルを扱うときに、最初に事前洗浄、エンコードチェックサムエラー検出を行うことをお勧めします。
より複雑なXML構造と要件がある場合は、 DomdocumentやSimplexMLなどのより近代的な解析ツールを使用することも検討することもできます。
関連タグ:
xml_parse