2009/05/17

BloggerAPI-パースエラー

ブラウザから手入力して投稿した記事の場合


 <content type='html'><div xmlns='http://www.w3.org/1999/xhtml'>

を含んでいなかったりする。入力してないのだから当たり前に、ない。その為 Blogger API を利用して GET Request し獲得した XML の content 要素は REXML ではパースエラーになってしまう。これを解消する方法をあれこれ考えてみたけれども挫折中。

パースエラーになるってことは例えばカテゴリをいっぺんに変換したくてもできない記事が存在してしまうってことになる。なぜなら、PUT Request でカテゴリを変更するリクエストを投げる時、その xml データには新規記事と全く同様の要素(タイトル、コンテンツ、カテゴリなど)が必要なのであって content は変更しないので含めませんでした、ではリクエストは通らない。

# 試しに content なしのデータを PUT リクエストしてみたところ BadRequest エラーだった。

でも、content を変えたいわけじゃなくてカテゴリーだけ変えたい。content は元のままを維持したい。それで Get で得られた xml の content をパースしてその要素をそのまんま PUT リクエストデータの content にしてしまえば楽だしミスがない。でもパースできないやつがあるってことが分かった。なぜなら div がないから。あるいはひょっとしてタイプミスして変なタグいれちゃったからなんだけど.. orz

# 結局、BloggerAPI からコントロールしたければ全ての記事の content には div 要素が必要だってことは明白になったので元の文章がちゃんとテキストで保存されていて尚かつ変更しやすそうな記事だけ div 要素を加えることができた。

簡単なテスト


  # coding: utf-8
 str=<<EOF
  # ここにパースエラーになった記事の content 要素内容をはりつける。
  # Get Request で得られた XML の entry.elements['content'].text
 EOF

  doc = REXML::Document.new()
  doc << REXML::XMLDecl.new(version="1.0", encoding="utf-8" )
  # Entry element
  x = doc.add_element(
  "entry",
  {'gd'=>'http://schemas.google.com/g/2005','xmlns'=>'http://www.w3.org/2005/Atom'}
  )
  begin
   # div 要素が存在し かつ ほかの要素も xhtml的に正しければこの行でパースが成功する。
    div = REXML::Document.new(str)
    div.add_namespace({ 'xmlns'=>'http://www.w3.org/1999/xhtml'})
    c = x.add_element('content', {'type'=>'xhtml'})
    c.add_element(div)
    puts c
  rescue REXML::ParseException
    # div 要素がない。あるいは div があってもタグがどっかおかしかったりとか変な br があったりとか? 未知
    # 記事中に Ruby の継承である記号があらわれただけでエラーになったりする
    # gstr = str.gsub(" < ", ' &lt; ').gsub("<<","&lt;&lt;")
    # この先どうすべきやら
  end

memo
カテゴリーを指定して Get Request を発行する場合のURL
#参照
# http://code.google.com/intl/ja/apis/blogger/docs/2.0/developers_guide_protocol.html

# URL 例:
# http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie

0 件のコメント: