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に特権を書き込む必要はありません)
XMLはおそらく無効です。
問題は「&」
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
「&」を取り除き、HTMLコードバージョンに置き換えます...試してみてください。
これを見つけました here ...
問題:XMLパーサーがエラー「xmlParseEntityRef:noname」を返します
原因:XMLテキストのどこかに「&」(アンパサンド文字)が含まれています。テキストとその他のテキスト
解決策:
- 解決策1:アンパサンドを削除します。
- 解決策2:アンパサンドをエンコードします(つまり、「&」文字を「&amp;」に置き換えます)。 XMLテキストを読み取るときは必ずデコードしてください。
- 解決策3:CDATAセクションを使用します(CDATAセクション内のテキストはパーサーによって無視されます)。 <![CDATA [テキストとその他のテキスト]]>
注:「&」「<」「>」はすべて、正しく処理されないと問題を引き起こします。
この関数を使用して、最初にHTMLをクリーンアップしてみてください。
$html = htmlspecialchars($html);
通常、特殊文字はHTMLで異なって表され、コンパイラにとって混乱を招く可能性があります。 &
は&
になります。
私は組み合わせたバージョンを使用します:
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
問題
simplexml_load_file
は、URLからXMLファイルをロードしようとしているときに解析エラーparser error : xmlParseEntityRef
をスローしています。原因
&
値の代わりに&
が含まれます。この時点では明らかではない他のエラーがある可能性は十分にあります。私たちの制御外のもの
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 & Development for under developed nations">
<invalid-data>Some other data containing & 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を比較するのと同じくらい簡単なはずです。
これは、文字がデータをいじり回しているためです。 htmlentities($yourText)
を使用するとうまくいきました(xmlドキュメント内にhtmlコードがありました)。 http://uk3.php.net/htmlentities を参照してください。
Opencartでこの問題が発生している場合は、編集してみてください
catalog/controller/extension/feed/google_sitemap.php詳細と方法については、これを参照してください: xmlparseentityref-no-name-error
これは私の問題を解決します:
$description = strip_tags($value['Description']);
$description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $description);
$description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description);
$description=str_replace(' & ', ' & ', html_entity_decode((htmlspecialchars_decode($description))));