2011-09-29 13 views
67

私はsimplexml_load_fileを使用してPHPでxmlを読んでいます。しかし、xmlをロードしようとすると、警告リストが表示されます'xmlParseEntityRef:no name' PHPファイルに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はtest.phpを内の変数にロードされたURL http://..../index.php/site/projects &から生成されています。私はindex.phpに書き込み権限がありいけない)

+0

XMLが無効です。あなたはまったくそれをロードすることができないかもしれません。エラーは、 'simplexml_load_file'の前に' @ 'を追加するか、フラグを追加することで抑止できます。詳細については' simplexml_load_file'のマニュアルページを参照し、質問を削除してください。 – hakre

+0

これは実際には解決策であると私の答えがかなり注目されているのがわかります。「正解」としてフラグを立てることができますか?ありがとう。 – ricricucit

答えて

95

XMLはおそらく無効です。

問題は「&」

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

は「&」を取り除くと、それのHTMLコードのバージョンで置き換え...それを試してみるれます可能性があります。

+1

ありがとうございます。あなたは私の一日を救った! – Saim

+0

XMLを使って作業する際のベストプラクティスは、競合する文字がないことを確認することです。その前にそれらを置き換える必要があります。 –

+0

ありがとう、xmlが無効なので、この質問の主な点は – yussan

5

XMLが無効です。

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

CDATAが見つかりW3C

54

ごとに、すべての特殊XML文字の周りに巻かれるべきこのhere ...

問題:「:NONAME xmlParseEntityRef」

XMLパーサがエラーを返します

原因:浮遊する '& '(アンパサンド文字)をXMLテキストのどこかに挿入します。いくつかのテキスト&いくつかのより多くのテキスト

ソリューション:

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

注:正しく処理されない場合は、「&」「< '「>「はすべての問題を与えるだろう。

+6

です。 – Bwire

+0

なぜこれが分かっていますか?また、CDATAセクションはまだこのデータの一部をレンダリングするブラウザによって取得されますか?私は自分のXMLタグの中にいくつかのHTMLタグを持っており、それらを編集ツールのためにエンドユーザに表示する必要があります。 – skeletalbassman

+0

@skeletalbassman理由は答えの一部です。 –

2

これは、文字がデータに混乱しているためです。私のために働いたhtmlentities($yourText)を使用して(私はXML文書の中にhtmlコードを持っていました)。 http://uk3.php.net/htmlentitiesを参照してください。

私が組み合わされたバージョンを使用
5

:この機能を使用して最初のHTMLをきれいにしてください

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

これは完全に動作しています。あなたはちょうど終わりの右の括弧が不足している – myh34d

9

を:

特殊文字は通常、HTMLで異なる表現され、それはコンパイラのために混乱するかもしれません

$html = htmlspecialchars($html); 
&のようになります &amp;になります。

+0

誰かがこれdownvoted理由を説明することはできますか? 'htmlspecialchars()'は、要素データ内の '&、"、<, > '文字を変換する正確な関数です – jacobross85

+0

説明が明確ではなく、簡単に読むことができるため、 –

+0

に完全に働きました –

0

これは私のproblèmeを解決:

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

PROBLEM

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

原因

  • XMLが有効なXMLではありません。それは、&値 代わり&amp;のが含まれています。現時点で明らかではない他のエラーがある可能性は非常に高いです。

OUR CONTROL OF OUT THINGS

  • 理想的には、有効なXMLをPHP simplexml_load_file機能に供給されていることを確認する必要がありますが、私たちはいずれかを持っていないように見えますXMLの作成方法を制御します。
  • simplexml_load_fileに無効なXMLファイル を処理させることもできません。 以外にも、XMLファイル自体を修正する以外にも、多くのオプションがあります。

POSSIBLE SOLUTION

有効な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はそれを正しく行うという非常に優れた仕事をしますが、視覚的に見て100%確実であることは決してありません。私たちの場合は、$ xmlと$ tidyを比較するだけで簡単です。

0

あなたはopencartで、この問題を取得している場合は

カタログ/コントローラ/拡張/フィード/詳細は をgoogle_sitemap.phpし、それはどのようにこの参照してください行うには編集をしてみてください:xmlparseentityref-no-name-error

関連する問題