PROBLEM
- PHP関数
simplexml_load_file
はURLからXMLファイルをロードしようとしたときにエラーparser error : xmlParseEntityRef
を解析投げています。 URLによって返さ
原因
- XMLが有効なXMLではありません。それは、
&
値 代わり&
のが含まれています。現時点で明らかではない他のエラーがある可能性は非常に高いです。
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 & 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はそれを正しく行うという非常に優れた仕事をしますが、視覚的に見て100%確実であることは決してありません。私たちの場合は、$ xmlと$ tidyを比較するだけで簡単です。
XMLが無効です。あなたはまったくそれをロードすることができないかもしれません。エラーは、 'simplexml_load_file'の前に' @ 'を追加するか、フラグを追加することで抑止できます。詳細については' simplexml_load_file'のマニュアルページを参照し、質問を削除してください。 – hakre
これは実際には解決策であると私の答えがかなり注目されているのがわかります。「正解」としてフラグを立てることができますか?ありがとう。 – ricricucit