人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Ruby1.8.5でRSSを出力すると<taxo:topics>がつくのですが、これをなくすにはどうすればいいでしょうか?

■ソースコード
------------------------------
require "rss/1.0"
require "rss/maker"

rss = RSS::Maker.make("1.0") do |maker|
maker.channel.about = "http://www.example.com/feed"
maker.channel.title = "フィードのタイトル"
maker.channel.description = "フィードの要約"
maker.channel.link = "http://www.example.com/"

item = maker.items.new_item
item.title = "記事のタイトル"
item.link = "http://www.example.com/articles/20061126"
end

rss.output_encoding = "Shift_JIS"

puts rss.to_s
------------------------------

●質問者: afternoontea
●カテゴリ:インターネット ウェブ制作
✍キーワード:.new LINK make require RSS
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● furutanian
●50ポイント

私は RSS はおろか、taxo タグのなんたるかも知りませんが。以下のタグの出力を抑制したいということでよろしいしょうか。

< <taxo:topics>
< <rdf:Bag/>
< </taxo:topics>

Ruby 1.9 の nightly build に添付の RSS ライブラリ Ver.0.1.6 だと、taxonomy.rb に以下の行を付加すれば、出力を抑制できるようです。

/usr/lib/ruby/1.8/rss # vi taxonomy.rb
 84 def to_s(need_convert=true, indent=calc_indent)
 85 rv = tag(indent) do |next_indent|
 86 [
 87 Bag_element(need_convert, next_indent),
 88 other_element(need_convert, next_indent),
 89 ]
 90 end
 91 '' # 追加
 92 end

上記の場所が見つからない場合は、以下のように探してみてください。

/usr/lib/ruby/1.8/rss # cat -n taxonomy.rb | grep to_s
 84 def to_s(need_convert=true, indent=calc_indent)
 168 def to_s(need_convert=true, indent=calc_indent)

なお、ライブラリの直接の変更でなくスイッチかなにかで抑制できないかもどうかも確認してみましたが、ざっと読んだ限りではそのようなスイッチは存在しないようです。

◎質問者からの返答

1.8.5 では taxonomy.rb に to_s がないようです。

中身が空っぽだし、Feed Validator にも This feed does not validate なんて言われるので消したかったのですが。

converter.rb:97: def def_to_shift_jis_from_utf_8
converter.rb:112: def def_to_shift_jis_from_euc_jp
parser.rb:393: @last_element.__send__(setter, text.to_s)
rss.rb:153: "\#{@#{n}.to_s(need_convert, indent)}"
rss.rb:174: value = "\#{x.to_s(need_convert, indent)}"
rss.rb:284: if /\\A\\s*\\z/ !~ new_value.to_s
rss.rb:296: undef_method(:to_s)
rss.rb:297: alias_method(:to_s, :#{type})
rss.rb:621: def to_s(need_convert=true, indent='')
rss.rb:642: normalized_attrs[key.to_s] = value
rss.rb:645: value = normalized_attrs[variable_name.to_s]
rss.rb:972: to_s
rss.rb:977: end.to_s
utils.rb:19: s.to_s.gsub(/&amp;/, "&amp;").gsub(/\"/, "&quot;").gsub(/>/, "&gt;").gsub(/</, "&lt;")
xml-stylesheet.rb:15: pi = xss.to_s
xml-stylesheet.rb:45: if vars.include?(name.to_s)
xml-stylesheet.rb:51: def to_s

2 ● backupper
●50ポイント

あまり良い方法が思い浮かばなかったので、回答する気はなかったのですが、ライブラリ変更は最後の最後の手段だと思うので、とりあえずそうではない方法を。参考になれば幸いです。

モジュールの使用は、ライブラリの読み込み状況で変わってくるので、rss/taxonomy.rbの読み込みを抑止すれば良いと思います。

正攻法で読み込みを辞めさせる方法は無いと思うので、本当は読んでないのに読んだ事にしてしまいます。

$LOADED_FEATURES.push("rss/taxonomy.rb")#既に読んだ事にして読み込みロック
require "rss/1.0"
require "rss/maker"

rss = RSS::Maker.make("1.0") do |maker|
maker.channel.about = "http://www.example.com/feed"
maker.channel.title = "フィードのタイトル"
maker.channel.description = "フィードの要約"
maker.channel.link = "http://www.example.com/"

item = maker.items.new_item
item.title = "記事のタイトル"
item.link = "http://www.example.com/articles/20061126"
end

rss.output_encoding = "Shift_JIS"

puts rss.to_s

初めの一行を追加するだけです。

いかにも対処療法的クイックハックでなんですが、パッと手間無く思いついたのはこれぐらいでした。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ