質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Ruby

    8157questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

rssのdescriptionにタグ付きの内容を出力したい。rubyでrss2.0を作成

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 701

takataka75

score 66

rssモジュールを利用して
rubyでrss2.0を出力するプログラムを作っているのですが、
1か所、うまくいきません。

うまくいかない所は
descriptionの項目に「<CDATA[なんちゃら~」と書くと
なんちゃらの部分はhtml_escapeされて

        <description>
 &lt;![CDATA[&lt;img src=https://amd.c.yimg.jp/im_siggCB0P2WlcKh4RxvwE3l0I3w---x150-y84-q90/amd/20180105-00000045-natalieo-000-0-thumb.jpg &gt;&lt;BR&gt;…BSプレミアム)にガンバレルーヤ、はなしょー、阿佐ヶ谷姉妹、平野ノラ、相席スタート・ケイら多数の女性芸人が出演する。この番組は久本雅美が昨年活躍した女性…&lt;BR&gt;15日(金) 1438分  エンタメ総合(お笑いナタリー)]]&gt;
        </description>


となってしまいます。
出力としては、↓というように、出力したいのですが、
うまくいきません。

        <description>
<![CDATA[<img src=https://amd.c.yimg.jp/im_siggCB0P2WlcKh4RxvwE3l0I3w---x150-y84-q90/amd/20180105-00000045-natalieo-000-0-thumb.jpg ><BR>…BSプレミアム)にガンバレルーヤ、はなしょー、阿佐ヶ谷姉妹、平野ノラ、相席スタート・ケイら多数の女性芸人が出演する。この番組は久本雅美が昨年活躍した女性…<BR>1月5日(金) 14時38分  エンタメ総合(お笑いナタリー)]]>
        </description>

モンキーパッチを入れると可能らしいという事で
http://motivation.drivendevelopment.jp/2009-12-02-1.html
をそのまま使ったのですが、
変わりませんでした。

rssモジュールでは無い方法もあるようですが、
rssモジュールでできるようにしたいです。
(rssモジュールの投稿日ソートを使っているので)

よろしくお願いします。

作成部分のコードは、こんな感じ
モンキーパッチの部分は
http://motivation.drivendevelopment.jp/2009-12-02-1.html
をそのまま入れています。

    rss = RSS::Maker.make("2.0") do |xml|
        xss = xml.xml_stylesheets.new_xml_stylesheet
#        xss.href = "http://example.com/index.xsl"

        xml.items.do_sort = true

        xss.href = http://hogehoge/index.xml"
        xml.channel.title = "Sample"
        xml.channel.link = 'http://hogehoge"
        xml.channel.about = "http://hogehoge/news.xml"
        xml.channel.description = "ほげほげ"

        xml.items.new_item do |item|
            item.title = "アイテムタイトル"
            item.link = "http://hogehoge"

            description =""
            description << "<img src=" + img_url + " >"
            description << "<BR>" 
            description << "ほげほげ" 

#いろいろやってみた。けど・・・

#            item.description do
#                item.cdata! description
#            end
#            item.description = "<![CDATA[" + description + "]]>"

            item.content_encoded =  description 

#            xml.description do
#               xml.cdata do
#                  xml << description
#               end
#            end
        end
    end
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

こんにちは。
 
stackoverflow に出ていた、
encode-content-as-cdata-in-generated-rss-feed
を参考にして、以下のような対応をやってみました。

 修正前(パッチなし)

ご質問にあるコードに多少手を加えてあります。

ソースコード:

require 'rss'

img_url = 'http://example.com/test.jpg'

rss = RSS::Maker.make('2.0') do |xml|
  xss = xml.xml_stylesheets.new_xml_stylesheet
  xss.href = 'http://example.com/index.xsl'

  xml.items.do_sort = true

  xss.href = 'http://example.com/index.xml'
  xml.channel.title = 'Sample'
  xml.channel.link = 'http://example.com'
  xml.channel.about = 'http://example/news.xml'
  xml.channel.description = 'ほげほげ'

  xml.items.new_item do |item|
    item.title = 'アイテムタイトル'
    item.link = 'http://example.com'

    description = ''
    description << '<img src="' + img_url + '" >'
    description << '<BR>'
    description << 'ほげほげ'

    item.description = description
    item.content_encoded =  description

  end
end

puts rss

実行結果:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Sample</title>
    <link>http://example.com</link>
    <description>ほげほげ</description>
    <item>
      <title>アイテムタイトル</title>
      <link>http://example.com</link>
      <description>&lt;img src=&quot;http://example.com/test.jpg&quot; &gt;&lt;BR&gt;ほげほげ</description>
      <content:encoded>&lt;img src=&quot;http://example.com/test.jpg&quot; &gt;&lt;BR&gt;ほげほげ</content:encoded>
    </item>
  </channel>
</rss>

 修正後(パッチあり)

修正前のコードに、class RSS::Rss::Channel::Item へのパッチ
(以下の class RSS::Rss::Channel::Item 〜 end の行)
を追加しました。その他は変更なしです。

ソースコード:

require 'rss'

class RSS::Rss::Channel::Item

  def content_encoded_element need_convert, indent
    markup = "#{indent}<content:encoded>"
    markup << @description
    markup << '</content:encoded>'
    markup
  end

  def description_element need_convert, indent
    markup = "#{indent}<description>"
    markup << "<![CDATA[#{@description}]]>"
    markup << '</description>'
    markup
  end
end

img_url = 'http://example.com/test.jpg'

rss = RSS::Maker.make('2.0') do |xml|
  xss = xml.xml_stylesheets.new_xml_stylesheet
  xss.href = 'http://example.com/index.xsl'

  xml.items.do_sort = true

  xss.href = 'http://example.com/index.xml'
  xml.channel.title = 'Sample'
  xml.channel.link = 'http://example.com'
  xml.channel.about = 'http://example/news.xml'
  xml.channel.description = 'ほげほげ'

  xml.items.new_item do |item|
    item.title = 'アイテムタイトル'
    item.link = 'http://example.com'

    description = ''
    description << '<img src="' + img_url + '" >'
    description << '<BR>'
    description << 'ほげほげ'

    item.description = description
    item.content_encoded =  description

  end
end

puts rss

実行結果:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Sample</title>
    <link>http://example.com</link>
    <description>ほげほげ</description>
    <item>
      <title>アイテムタイトル</title>
      <link>http://example.com</link>
      <description><![CDATA[<img src="http://example.com/test.jpg" ><BR>ほげほげ]]></description>
      <content:encoded><img src="http://example.com/test.jpg" ><BR>ほげほげ</content:encoded>
    </item>
  </channel>
</rss>

以上、参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/07 15:51

    ありがとうございます。
    見事一発で問題が解決しました。

    キャンセル

  • 2018/01/07 15:56

    解決されたようでよかったです!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    8157questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。