2012年12月12日水曜日

XMLを読み込んだときにエラーが出る、もしくは読み込めない。(EntityRef問題)

  • このエントリーをはてなブックマークに追加

例えば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を一時的に作成して、simplexml_load_file simplexmlで読み込むことが出来る。


一部記述が間違ってたため訂正(2013/1/18)

2)の中で使用するのはsimplexml_load_fileではなくsimplexml_load_string

2 件のコメント:

  1. はじめまして。
    同様のエラーがあり、参考にさせていただきました。
    最後のsimplexml_load_fileはsimplexml_load_stringではないでしょうか?
    この後の処理がどういうものかわからないのですが、
    私はsimplexml_load_stringだとうまくいきました。
    いずれにしましても参考になり助かりました。
    ありがとうございます。

    返信削除
    返信
    1. > 最後のsimplexml_load_fileはsimplexml_load_stringではないでしょうか?
      この処理を記述してるソースを確認したところ、
      simplexml_load_stringとなっておりました。

      ご指摘ありがとうございます、記述を変更しておきました。

      削除

Adsense