PHPのSimplexml_load_String関数を使用してXML文字列を解析する場合、「違法な文字」の問題に解析障害を引き起こすことがよくあります。このタイプのエラーは、通常、コントロール文字、非脱型の特別なシンボル、または一貫性のないエンコード形式などのXML仕様に準拠していないXML文字列に文字が存在することに起因します。この記事では、問題を引き起こすものの詳細な説明を提供し、ソリューションとサンプルコードを提供します。
Simplexml_load_stringは、XML文字列を解析するためにPHPが使用する単純な関数です。 XML文字列に違法文字が含まれている場合、関数はfalseを返し、エラーメッセージがトリガーされます。違法なキャラクターは一般的に次のものを含みます。
ASCII制御文字(スペース、ラインブレーク、タブ文字を除く0x00〜0x1Fなど)
正しく逃げられないキャラクター(たとえば、 &として書かれていない)
XML宣言またはコンテンツエンコーディングは、実際のエンコードと一致しません
非UTF-8エンコードは宣言されていません
これらの文字により、XMLパーサーが文字列構造を正しく理解できなくなり、障害が発生します。
コントロール文字は、正規表現で削除できます。
<?php
$xmlString = 'これには違法なキャラクターが含まれていますXML弦';
// 制御文字を削除します,ラインブレークを保ちます(\n)、入力(\r)、タブシンボル(\t)
$cleanXmlString = preg_replace('/[^\PC\s]/u', '', $xmlString);
$xml = simplexml_load_string($cleanXmlString);
if ($xml === false) {
echo "分析に失敗しました\n";
} else {
print_r($xml);
}
?>
XMLコンテンツに、& 、 < 、 >などのような非脱型シンボルが含まれている場合、最初に逃げる必要があります。
<?php
$xmlString = 'これには、脱却されていないものが含まれています&のシンボルXML弦';
$xmlString = str_replace('&', '&', $xmlString);
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "分析に失敗しました\n";
} else {
print_r($xml);
}
?>
注:すでに合法的なXMLである場合、それを交換するとエラーを引き起こす可能性があり、特定の状況で処理する必要があります。
simplexml_load_stringは、デフォルトでUTF-8エンコード文字列を処理します。 XMLが別のエンコード(GBK、ISO-8859-1など)である場合、エンコードを最初に変換する必要があります。
<?php
$xmlString = file_get_contents('http://gitbox.net/path/to/xmlfile.xml');
$xmlString = mb_convert_encoding($xmlString, 'UTF-8', 'GBK');
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "分析に失敗しました\n";
} else {
print_r($xml);
}
?>
より良いデバッグのために、内部エラーキャプチャを有効にすることができます:
<?php
libxml_use_internal_errors(true);
$xmlString = '<invalid&xml>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
foreach (libxml_get_errors() as $error) {
echo "間違い:", $error->message;
}
libxml_clear_errors();
} else {
print_r($xml);
}
?>
以下は、違法なキャラクターのクリーンアップ、エンコードの確保、およびエラーのキャッチを示す包括的な例です。
<?php
libxml_use_internal_errors(true);
$xmlString = file_get_contents('http://gitbox.net/sample.xml');
// 違法なキャラクターをきれいにします(ラインブレークを保ちます、入力、タブシンボル)
$xmlString = preg_replace('/[^\PC\s]/u', '', $xmlString);
// コードをに変換します UTF-8(元のエンコードがあると仮定します GBK)
$xmlString = mb_convert_encoding($xmlString, 'UTF-8', 'GBK');
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "分析に失敗しました,間違い信息如下:\n";
foreach (libxml_get_errors() as $error) {
echo trim($error->message), "\n";
}
libxml_clear_errors();
} else {
echo "成功した分析:\n";
print_r($xml);
}
?>
Simplexml_load_Stringの解析が失敗した場合、最初のステップは、違法な制御文字があるかどうかを確認し、適切にクリーンアップすることです。
XML文字列の特殊文字が正しく逃げられていることを確認してください。
XML文字列がUTF-8としてエンコードされ、必要に応じて変換されることを確認してください。
libxml_use_internal_errors(true)を使用して、詳細なエラー情報を取得します。これは、問題を見つけるのに役立ちます。
これらのスキルを習得すると、違法なキャラクターによって引き起こされる障害の解析を効果的に回避でき、XMLがより安定して信頼性を高めることができます。