XMLデータをPHPで処理する場合、 XML_PARSE()は、XMLデータを構造化された情報に解析するのに役立つ一般的な関数です。ただし、不規則な、誤った形式または閉鎖されていないXMLデータに直面した場合、この関数は簡単にエラーをスローすることができ、プログラム全体を中断または出力の例外を発生させる可能性があります。
では、特に不規則なXMLに遭遇したときに、 XML_PARSE()を使用するときに、解析エラーを回避するにはどうすればよいですか?いくつかの実用的なヒントとコードの例を次に示します。
XML_PARSE()を使用する前に、プログラムを静かに失敗させるのではなく、解析が失敗したときに特定のエラー情報がキャプチャされるように、常にエラー検出を有効にすることをお勧めします。
$xml = '<root><item>データ1<item><item>データ2</item></root>'; // 不規則XML
$parser = xml_parser_create();
xml_set_error_code($parser, XML_ERROR_NONE);
if (!xml_parse($parser, $xml, true)) {
$errorCode = xml_get_error_code($parser);
$errorMsg = xml_error_string($errorCode);
$line = xml_get_current_line_number($parser);
$column = xml_get_current_column_number($parser);
echo "解析エラー:$errorMsg で $line わかりました,第 $column リスト\n";
}
xml_parser_free($parser);
不規則なXMLをより安全に解析するために、 LIBXMLのフォールトトレラントモードを使用してデータを前処理し、 XML_PARSE()やSimplexML_Load_String()などの関数に処理することができます。
libxml_use_internal_errors(true);
$xml = '<root><item>データ1<item><item>データ2</item></root>';
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOERROR | LIBXML_NOWARNING | LIBXML_NONET | LIBXML_COMPACT | LIBXML_NOCDATA);
if (!$dom) {
foreach (libxml_get_errors() as $error) {
echo "LibXML 間違い:{$error->message}\n";
}
libxml_clear_errors();
} else {
echo "XML ロードは正常に,解析し続けることができます。\n";
}
時には、データソースが不安定である場合、外部APIは奇形のXMLを返します( http://api.m66.net/data.xmlなど)。この場合、最初に、閉じられていないタグや違法な文字などの一般的な問題を通常または手動の方法を使用して修正できます。
$xml = file_get_contents('http://api.m66.net/data.xml');
// 簡単な修正:閉鎖されていないタグを交換します
$xml = preg_replace('/<item>([^<]*)<item>/', '<item>$1</item><item>', $xml);
// 然后再进わかりました解析
$parser = xml_parser_create();
if (!xml_parse($parser, $xml, true)) {
echo "まだ存在します XML 間違い,それに対処するために他の方法を試してください。\n";
}
xml_parser_free($parser);
??注:この方法は、形式が予想されるシナリオに適しており、複雑な構造XMLに定期的なハードフィックスを使用することはお勧めしません。
ツールを変更する方が安定する場合があります。たとえば、 SimplexMLには、より強力なフォールトトレランスがあり、維持しやすいコードがあります。
$xml = file_get_contents('http://api.m66.net/data.xml');
libxml_use_internal_errors(true);
$simpleXml = simplexml_load_string($xml);
if ($simpleXml === false) {
echo "SimpleXML 分析に失敗しました,間違い如下:\n";
foreach (libxml_get_errors() as $error) {
echo $error->message;
}
} else {
echo "SimpleXML 成功した分析!\n";
}
xml_parse()を使用する場合、不規則なxmlに直面するためのベストプラクティス:
問題の特定を容易にするエラーレポートを有効にします。
libxmlフォールトトレラントな解析を前処理として使用します。
必要に応じてXMLを修正するには、通常またはdomdocumentを使用してください。
データ形式が制御できない場合は、 SimplexMLなどのより良いフォールトトレランスパーサーを使用します。
XML形式が合理的であることを確認した後にのみ、 XML_PARSE()を使用してコードを改善し、フォーマットの問題によりサービス全体の緩みを避けることができます。
これらのヒントが、あらゆる種類の「トリッキーな」XMLデータの処理に役立つことを願っています!特定の解析エラーが発生した場合は、XMLコンテンツを投稿できます。また、分析することもできます〜