PHPでは、 XML_PARSEはXMLデータを解析するために一般的に使用される機能です。パーサーを介してXML文字列を解析し、それらをPHP構造に変換します。ただし、開発者がXML_PARSE関数を使用する場合、XMLのエンティティ文字( & amp;など)は正しく解析されない場合があります。この記事では、この問題の原因と解決策について説明します。
XMLドキュメントでは、エンティティは特定の文字の代替表現です。たとえば、 &amp; &&& lt; <文字を表します。これらのエンティティは、エンティティを接続するために使用される一方で、要素をマークする< and <および>など、XML構文との競合を回避するのに役立ちます。
一般に、エンティティシンボルには2つの形式があります。
&amp;などの事前定義されたエンティティ、 &lt;等
XMLドキュメントの特定のシンボルとして定義できるカスタムエンティティ。
ただし、場合によっては、 &amp; ampのような文字列を形成するためにエンティティが逃げられる場合があります。つまり、実際には&amp ;
XMLデータを処理する場合、PHPのXML_PARSE関数は、標準のXML解析ルールに従ってエンティティ文字を解析します。通常の状況では、 XML_PARSEは変換します& amp; to &lt; XMLドキュメントの宣言とコンテキストに基づいて、 < 、および他のエンティティを正しく処理します。
しかし、問題は通常、次の場合に発生します。
XMLのエンティティが逃げられている場合(たとえば、&amp; amp; )、 xml_parse関数はそれらをさらに解析しません。これは、xml 、&amp; amp;通常の文字列と見なされ、解析する必要があるエンティティではありません。簡単に言えば、 &amp; amp;実際には、 &amp;に自動的に変換されることはありません。
特にドキュメントがDTD(ドキュメントタイプ定義)またはXMLエンティティを適切に宣言していない場合、カスタムエンティティがXMLで定義されている場合、 XML_PARSEはそれらを処理できない場合があります。
上記の問題に対処するために、次の解決策をとることができます。
このような状況に遭遇した場合は、解析する前にこれらの二重脱出エンティティを手動で交換できます。これは、 str_replaceを使用して実現できます。例えば:
$xmlString = str_replace('&amp;', '&', $xmlString);
このコードは&amp; amp; &amp;そして、それを解析します。このアプローチは、特定のエンティティのみがある状況に適していることに注意してください。
XML_PARSE関数が十分に柔軟でないことがわかった場合は、 SimplexML_Load_Stringを使用してXMLデータを解析することを検討できます。多くの場合、エンティティをより適切に処理し、よりクリーンなインターフェイスを提供することができます。例えば:
$xmlString = str_replace('&amp;', '&', $xmlString);
$xml = simplexml_load_string($xmlString);
SimplexML関数は通常、一般的なXMLエンティティをよりインテリジェントに処理できます。
アプリケーションのニーズがより複雑で、カスタムエンティティまたはDTDが関与している場合は、より多くの制御および構成オプションを提供するXMLReaderなどの他のXML解析ライブラリの使用を検討することをお勧めします。
XML_PARSE関数を使用してXMLでエンティティを処理し、解析する方法を示す完全な例を次に示します。
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>
<root>
<example>&amp;</example>
<data>Some data</data>
</root>';
// 二重脱出エンティティを交換します
$xmlString = str_replace('&amp;', '&', $xmlString);
// パーサーを作成します
$parser = xml_parser_create();
// 分析 XML 弦
if (!xml_parse($parser, $xmlString, true)) {
echo "Error: " . xml_error_string(xml_get_error_code($parser));
} else {
echo "XML parsed successfully!";
}
// 释放分析器
xml_parser_free($parser);
この例では、最初に&amp; amp;を置き換えます。 XML文字列のエンティティとXML_PARSEを使用して解析します。エラーが存在する場合、パーサーはエラーメッセージを返します。
関連タグ:
xml_parse