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
------------------------------

回答の条件
  • 1人2回まで
  • 登録:2006/11/26 19:23:16
  • 終了:2006/11/30 01:41:23

回答(2件)

id:furutanian No.1

furutanian回答回数112ベストアンサー獲得回数142006/11/27 09:18:46

ポイント50pt

私は 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)

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

id:afternoontea

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
2006/11/27 22:48:37
id:backupper No.2

backupper回答回数95ベストアンサー獲得回数102006/11/28 10:58:24

ポイント50pt

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

モジュールの使用は、ライブラリの読み込み状況で変わってくるので、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

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

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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません