RSS配信これで完璧?
こないだ作ったRSSだが,Validatorによっては"valid"と言ってくれたり,"invalid"と言われたりという感じだった.「はてなRSSではちゃんと読んでくれるし,これでいいか」と思っていたのだが,今日Firefoxのライブブックマークに登録してみたら*1,最初の1件しか出ないことが判明した.おそらく原因は参考にしたMLの投稿でも問題にしていたところで,
<rdf:Seq> <rdf:li rdf:resource="http://www.momo-p.com/showdetail.php?movieid=momo051015ga08b"/> <rdf:li rdf:resource="http://www.momo-p.com/showdetail.php?movieid=momo051015ga07b"/> </rdf:Seq>
となるべきところが,
<rdf:Seq> <rdf:li rdf:resource="http://www.momo-p.com/showdetail.php?movieid=momo051015ga08b"/> </rdf:Seq> <rdf:Seq> <rdf:li rdf:resource="http://www.momo-p.com/showdetail.php?movieid=momo051015ga07b"/> </rdf:Seq>
のように<rdf:Seq>を毎回閉じてしまっているところだろうと思われた.しかし,MLでも解決していなかったし,自分でいじってみた範囲でもPEAR::XML_Serializerを使う限りどうしようもないように思われた.
結局,getSerializedDataで配列をxmlにした後に,正規表現で置換するという泥臭い方法にしてしまった.
$buf=$serializer->getSerializedData(); ereg("(.+?<rdf:Seq>)(.+)(</rdf:Seq>.+)",$buf,$regs); $regs[2]=ereg_replace("<.?rdf:Seq>","",$regs[2]); echo $regs[1].$regs[2].$regs[3];
これでFirefoxでも全件のタイトルが出るようになったし,w3cのvalidatorも通るようになった.めでたしめでたし.でも本当はもっとまともなやり方があるんだろうな……