web-dev-qa-db-ja.com

xmlをphpファイルにロードする際の「xmlParseEntityRef:no name」警告

simplexml_load_fileを使用してphpでXMLを読んでいます。ただし、xmlをロードしようとすると、警告のリストが表示されます

Warning: simplexml_load_file() [function.simplexml-load-file]: <project orderno="6" campaign_name="International Relief & Development" project in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3

Warning: simplexml_load_file() [function.simplexml-load-file]: ional Relief & Development" project_id="313" client_name="International Relief & in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3

これらの警告を削除するにはどうすれば修正できますか?

(XMLはurl http://..../index.php/site/projectsから生成され、test.phpの変数にロードされます。index.phpに特権を書き込む必要はありません)

80
Rajat Gupta

XMLはおそらく無効です。

問題は「&」

$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $text);

「&」を取り除き、HTMLコードバージョンに置き換えます...試してみてください。

129
ricricucit

これを見つけました here ...

問題:XMLパーサーがエラー「xmlParseEntityRef:noname」を返します

原因:XMLテキストのどこかに「&」(アンパサンド文字)が含まれています。テキストとその他のテキスト

解決策:

  • 解決策1:アンパサンドを削除します。
  • 解決策2:アンパサンドをエンコードします(つまり、「&」文字を「&amp;」に置き換えます)。 XMLテキストを読み取るときは必ずデコードしてください。
  • 解決策3:CDATAセクションを使用します(CDATAセクション内のテキストはパーサーによって無視されます)。 <![CDATA [テキストとその他のテキスト]]>

注:「&」「<」「>」はすべて、正しく処理されないと問題を引き起こします。

65
King'ori Maina

この関数を使用して、最初にHTMLをクリーンアップしてみてください。

$html = htmlspecialchars($html);

通常、特殊文字はHTMLで異なって表され、コンパイラにとって混乱を招く可能性があります。 &&amp;になります。

11
Ufuk Özdemir

私は組み合わせたバージョンを使用します:

strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml))
7
Reign.85

問題

  • PHP関数simplexml_load_fileは、URLからXMLファイルをロードしようとしているときに解析エラーparser error : xmlParseEntityRefをスローしています。

原因

  • URLによって返されたXMLは有効なXMLではありません。 &値の代わりに&amp;が含まれます。この時点では明らかではない他のエラーがある可能性は十分にあります。

私たちの制御外のもの

  • 理想的には、有効なXMLがPHP simplexml_load_file関数にフィードされるようにする必要がありますが、XMLの作成方法を制御できないように見えます。
  • simplexml_load_fileに無効なXMLファイルを処理させることもできません。 XMLファイル自体を修正する以外に、多くのオプションはありません。

可能な解決策

無効なXMLを有効なXMLに変換します。 PHP tidy extensionを使用して実行できます。詳細な手順は http://php.net/manual/en/book.tidy.php から見つけることができます

拡張機能が存在するか、インストールされていることを確認したら、以下を実行してください。

/**
 * As per the question asked, the URL is loaded into a variable first, 
 * which we can assume to be $xml
 */
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<project orderno="6" campaign_name="International Relief & Development for under developed nations">
    <invalid-data>Some other data containing & in it</invalid-data>
    <unclosed-tag>
</project>
XML;

/**
 * Whenever we use tidy it is best to pass some configuration options 
 * similar to $tidyConfig. In this particular case we are making sure that
 * tidy understands that our input and output is XML.
 */
$tidyConfig = array (
    'indent' => true,
    'input-xml' => true, 
    'output-xml' => true,
    'wrap' => 200
);

/**
 * Now we can use tidy to parse the string and then repair it.
 */
$tidy = new tidy;
$tidy->parseString($xml, $tidyConfig, 'utf8');
$tidy->cleanRepair();

/**
 * If we try to output the repaired XML string by echoing $tidy it should look like. 

 <?xml version="1.0" encoding="utf-8"?>
 <project orderno="6" campaign_name="International Relief &amp; Development for under developed nations">
      <invalid-data>Some other data containing &amp; in it</invalid-data>
      <unclosed-tag></unclosed-tag>
 </project> 

 * As you can see that & is now fixed in campaign_name attribute 
 * and also with-in invalid-data element. You can also see that the   
 * <unclosed-tag> which didn't had a close tag, has been fixed too.
 */
echo $tidy;

/**
 * Now when we try to use simplexml_load_string to load the clean XML. When we
 * try to print_r it should look something like below.

 SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [orderno] => 6
            [campaign_name] => International Relief & Development for under developed nations
        )

    [invalid-data] => Some other data containing & in it
    [unclosed-tag] => SimpleXMLElement Object
        (
        )

)

 */
 $simpleXmlElement = simplexml_load_string($tidy);
 print_r($simpleXmlElement);

注意

開発者は、無効なXMLを有効なXML(tidyによって生成された)と比較して、tidyを使用した後に悪影響がないことを確認する必要があります。 Tidyはそれを正しく行うという非常に良い仕事をしますが、視覚的にそれを見て、100%確実であることを決して傷つけません。この場合、$ xmlと$ tidyを比較するのと同じくらい簡単なはずです。

7
Kamal Soni

XMLが無効です。

<![CDATA[ 
{INVALID XML}
]]> 

CDATAは、 W3C に従って、すべての特別なXML文字を囲む必要があります

6
Edwin Daniels

これは、文字がデータをいじり回しているためです。 htmlentities($yourText)を使用するとうまくいきました(xmlドキュメント内にhtmlコードがありました)。 http://uk3.php.net/htmlentities を参照してください。

3
Guillaume

Opencartでこの問題が発生している場合は、編集してみてください

catalog/controller/extension/feed/google_sitemap.php詳細と方法については、これを参照してください: xmlparseentityref-no-name-error

これは私の問題を解決します:

$description = strip_tags($value['Description']);
$description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $description);
$description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description);
$description=str_replace(' & ', ' &amp; ', html_entity_decode((htmlspecialchars_decode($description))));
1
Malki Mohamed