xmlをphpファイルにロードする際の「xmlParseEntityRef:名前なし」の警告


89

を使用してphpでxmlを読んでいsimplexml_load_fileます。ただし、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への書き込み特権はありません)


XMLが無効です。まったくロードできない場合があります。エラーは@、前にsimplexml_load_file追加するか、フラグを追加することで抑制できます。詳細については、のマニュアルページを参照してsimplexml_load_fileください。質問を削除してください。重複しています。
hakre 2011

それが実際の解決策である場合、私の答えがかなり注目を集めていることがわかります。「正解」としてフラグを立ててください。ありがとう。
ricricucit 2014年

回答:


143

XMLはおそらく無効です。

問題は「&」である可能性があります

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

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


2
ありがとうございました。あなたは私の日を救った!
サイム2017

2
XMLを使用する際のベストプラクティスは、競合する文字がないことを確認することです。パーシンの前に文字を置き換える必要があります
Mr Megamind

2
おかげで、この質問の要点はxmlが無効であるためです
ゆっさん2017年

少し追加します。すべてのアンパサンドを置き換える場合は、正規表現に「g」を追加します。:更新されたソリューションは、次のようになります $text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&amp;', $text);
flaming.codes

80

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

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

原因: XMLテキストのどこかに漂遊 '&'(アンパサンド文字)があります。いくつかのテキストといくつかのより多くのテキスト

解決:

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

注: '&' '<' '>'は、正しく処理されないとすべて問題が発生します。


9
これは今日私を救った。
bwire 2014年

これがなぜなのか分かりますか?また、CDATAセクションは、このデータの一部をレンダリングするブラウザーによって引き続き取得されますか?XMLタグ内にいくつかのHTMLタグがあり、編集ツールのためにエンドユーザーにレンダリングする必要があります。
sulimmesh 2016

11

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

$html = htmlspecialchars($html);

特別な文字は通常、HTMLで異なって表現され、コンパイラーを混乱させる可能性があります。のように&なり&amp;ます。


誰かがこれが反対票を投じられた理由を説明できますか?要素データの文字htmlspecialchars()を変換する正確な関数&, ", <, >です。
JacobRossDev 2016年

7
この場合はうまく機能しないため、この回答は反対票を投じられています。この関数を使用すると、「<」を「&lt;」に変換してXMLを完全に破壊します。htmlspecialchars()XMLを壊さずに使用できる方法を私は知りません。いくつかのフラグを試しましたが、XMLはまだ壊れていました。
Alex Finnarn 2017年

1
あなたは使うべきhtmlspecialcharsではない全体XMLに、XMLタグの内容に
gbalduzzi

7

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

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

1
これは完全に機能しています。
右角

7

問題

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

原因

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

私たちの手に負えないもの

  • 理想的には、有効なXMLがPHPsimplexml_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を比較するのと同じくらい簡単なはずです。



3

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


1

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

$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))));

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.