例えばXMLに外部リンクのURLを記入して管理し、
simplexml_load_fileを使ってリンクを都度読み込んでいる場合、
たまにparser error : EntityRef: expecting ';' in" and then;.みたいな形でエラーが出てしまう。
原因としては文字列の中に「&」が入っているからであり、
「&」はXHTMLでは「&」といった形でエンコードされた状態でないといけない。
ということで今回はこれの解決方法をまとめてみた。
1)「&」を「&」と置換する
もうこれはそのまんまの意味。
ただ自分が管理してるならまだしも、
クライアントが管理している場合だと徹底されない可能性もあるので応急処置的な。
2)simplexml_load_file simplexmlで読み込む前に「&」を「&」に置換する
XML上ではそのまま「&」で記入をしておいても大丈夫なものである。
処理の流れとしては下記のような感じ。
file_get_contentsでXMLを丸々読込
↓
preg_replaceで「&」を「&」に置換
↓
simplexml_load_file simplexml_load_string
ということでコードで書くと下記のような感じ。
$file = file_get_contents("hoge.xml"); $xml = preg_replace('/&(?=[a-z_0-9]+=)/m','&',$file);これで「&」と「&」がごちゃまぜになっていようとも、$sxml = simplexml_load_file($xml);//simplexml_load_fileではなくsimplexml_load_stringです $sxml = simplexml_load_string($xml);
「&」のみを正しく変換したxmlを一時的に作成して、
一部記述が間違ってたため訂正(2013/1/18)
2)の中で使用するのはsimplexml_load_fileではなくsimplexml_load_string
はじめまして。
返信削除同様のエラーがあり、参考にさせていただきました。
最後のsimplexml_load_fileはsimplexml_load_stringではないでしょうか?
この後の処理がどういうものかわからないのですが、
私はsimplexml_load_stringだとうまくいきました。
いずれにしましても参考になり助かりました。
ありがとうございます。
> 最後のsimplexml_load_fileはsimplexml_load_stringではないでしょうか?
削除この処理を記述してるソースを確認したところ、
simplexml_load_stringとなっておりました。
ご指摘ありがとうございます、記述を変更しておきました。