6) RSSを生成–XML_Serializer

前回は、RSS※1の取得ができるようになりました。今回はRSSを生成してみましょう。
RSSフィードは、XMLで記述されたコンテンツ配信フォーマットです。XML_Serializerを利用することで、RSS形式のXMLを簡単に生成することができます。
※1 RSS説明は「http://it.jfe-tec.jp/column/it_column/column_rss/」を参照
インターネットリサーチ・コンサルティング・企画、ウェブ翻訳から、Web制作、システム開発までオープンソース・ネットワークビジネスを提供

RSSの構造

RSSの構造について簡単に説明します。他にも必要な要素や属性がありますが、今回はXML_ Serializerを利用してXMLを生成することが目的なので、最低限の要素からなるこの構造で進めていきます。

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" ---(1)
       xmlns="http://purl.org/rss/1.0/"
       xmlns:dc="http://purl.org/dc/elements/1.1/">

 <channel rdf:about="サイトURL"> ---(2)
  <title>サイトタイトル</title>
  <link>サイトURL</link>
  <items>
   <rdf:Seq>
    <rdf:li rdf:resource="記事URL"/>
<!--li要素は記事の数だけ繰り返されます-->
   </rdf:Seq>
  </items>
 </channel>

 <item rdf:about="記事URL"> ---(3)
  <title>記事タイトル</title>
  <link>記事URL</link>
  <description>記事概要</description>
 </item>
<!--item要素は記事の数だけ繰り返されます-->
</rdf:RDF>


(1):ルート要素です
(2):サイト情報を記入するchannel要素です
(3):記事ごとの情報を記入するitem要素です

ルート要素の作成

コンストラクタにオプションを指定することで、ルート要素を作成します。

<?php
$options = array( ---(1)
 "rootName" => "rdf:RDF", ---(2)
 "rootAttributes" => array( ---(3)
  "xmlns"=>"http://purl.org/rss/1.0/",
  "xmlns:rdf"=>"http://www.e3.org/1999/02/22-rdf-syntax-ns#",
  "xmlns:dc"=>"http://purl.org/dc/elements/1.1/"),
 "defaultTagName" => array('rdf:RDF'=>'item', ---(4)
  'rdf:Seq'=>'rdf:li'),
 "attributesArray" => "_attr" ---(5)
);
?>


(1):オプションを設定します
(2):ルート要素の名前を設定します
(3):ルート要素の属性を設定します
(4):繰返し出現する要素を指定します
(5):子要素の属性に設定する配列の添え字を指定します

channel要素の作成

当コラムの情報でchannel要素を作成します。

<?php
$options = array( 
 "rootName"    => "rdf:RDF", 
 "rootAttributes" => array( 
  "xmlns"=>"http://purl.org/rss/1.0/",
  "xmlns:rdf"=>"http://www.e3.org/1999/02/22-rdf-syntax-ns#",
  "xmlns:dc"=>"http://purl.org/dc/elements/1.1/"),
 "defaultTagName" => array('rdf:RDF'=>'item',  'rdf:Seq'=>'rdf:li'),
 "attributesArray" => "_attr" 
);

$url = "http://it.jfe-tec.jp/column/tech_column/column_php/"; --(1)
$xml["channel"] = array(
 "_attr"=> array("rdf:about" =>$url), --(2)
 "title"=>"PHPプログラミング", --(3)
 "link"=>$url, --(4)
 "items" => array("rdf:Seq"=>array( --(5)
  array("_attr"=>array("rdf:resource"=>$url."000072.html")), --(6)
  array("_attr"=>array("rdf:resource"=>$url."000075.html")) --(7)
 ))
);
?>


(1):当コラムのURLを$urlパラメータに格納します
(2):channel要素の属性を設定します
(3):title要素にサイトタイトルを設定します
(4):link要素にサイトURLを設定します
(5):itmes要素に記事URLを設定します
(6):当コラムの第1回「入力フォームを自動作成」の記事URLを設定します
(7):当コラムの第2回「入力値のチェック」の記事URLを設定します

items要素の作成

当コラムの記事、第1回「入力フォームを自動作成」、第2回「入力値のチェック」でitem要素を作成します。

<?php
$options = array( 
 "rootName"    => "rdf:RDF", 
 "rootAttributes" => array( 
  "xmlns"=>"http://purl.org/rss/1.0/",
  "xmlns:rdf"=>"http://www.e3.org/1999/02/22-rdf-syntax-ns#",
  "xmlns:dc"=>"http://purl.org/dc/elements/1.1/"),
 "defaultTagName" => array('rdf:RDF'=>'item', 'rdf:Seq'=>'rdf:li'),
 "attributesArray" => "_attr" 
);

$url = "http://it.jfe-tec.jp/column/tech_column/column_php/"; 
$xml["channel"] = array(
 "_attr"=> array("rdf:about" =>$url), 
 "title"=>"PHPプログラミング", 
 "link"=>$url, 
 "items" => array("rdf:Seq"=>array( 
  array("_attr"=>array("rdf:resource"=>$url."000072.html")), 
  array("_attr"=>array("rdf:resource"=>$url."000075.html")) 
 ))
);

$day = "2007-01-01T01:01:01+09:00"; ---(1)
$xml[] = array( ---(2)
 "_attr"=> array("rdf:about" =>$url."000072.html"), ---(3)
 "title"=>"第1回PHPプログラミング", ---(4)
 "link"=>$url."000072.html", ---(5)
 "description"=>"入力フォームを自動作成", ---(6)
 "dc:date"=>$day ---(7)
);
$xml[] = array( ---(8)
 "_attr"=>array("rdf:about" =>$url."000075.html"),
 "title"=>"第2回PHPプログラミング",
 "link"=>$url."000075.html",
 "description"=>"入力値のチェック",
 "dc:date"=>$day
);
?>


(1):日付を$dayパラメータに格納します
(2):当コラムの記事、第1回「入力フォームを自動作成」でitem要素を作成します
(3):item要素の属性を設定します
(4):title要素に記事タイトルを設定します
(5):link要素に記事URLを設定します
(6):description要素に記事概要を設定します
(7):date要素に日付
(8):同様に、第2回「入力値のチェック」でitem要素を作成します

RSSフィードの作成

XML_Serializerオブジェクトを生成してRSSフィードを出力します。

<?php
$options = array( 
 "rootName"    => "rdf:RDF", 
 "rootAttributes" => array( 
  "xmlns"=>"http://purl.org/rss/1.0/",
  "xmlns:rdf"=>"http://www.e3.org/1999/02/22-rdf-syntax-ns#",
  "xmlns:dc"=>"http://purl.org/dc/elements/1.1/"),
 "defaultTagName" => array('rdf:RDF'=>'item', 'rdf:Seq'=>'rdf:li'),
 "attributesArray" => "_attr" 
);

$url = "http://it.jfe-tec.jp/column/tech_column/column_php/"; 
$xml["channel"] = array(
 "_attr"=> array("rdf:about" =>$url), 
 "title"=>"PHPプログラミング", 
 "link"=>$url, 
 "items" => array("rdf:Seq"=>array( 
  array("_attr"=>array("rdf:resource"=>$url."000072.html")), 
  array("_attr"=>array("rdf:resource"=>$url."000075.html")) 
 ))
);

$day = "2007-01-01T01:01:01+09:00"; 
$xml[] = array( 
 "_attr"=> array("rdf:about" =>$url."000072.html"), 
 "title"=>"第1回PHPプログラミング", 
 "link"=>$url."000072.html", 
 "description"=>"入力フォームを自動作成", 
 "dc:date"=>$day 
);
$xml[] = array( 
 "_attr"=>array("rdf:about" =>$url."000075.html"),
 "title"=>"第2回PHPプログラミング",
 "link"=>$url."000075.html",
 "description"=>"入力値のチェック",
 "dc:date"=>$day
);

require_once 'XML/Serializer.php'; --(1)
$serial = new XML_Serializer($options); --(2)
$result = $serial->serialize($xml); --(3)
echo $serial->getSerializedData(); --(4)
?>


(1):XML_ Serializerライブラリーを読み込みます
(2):オプションを指定してXML_ Serializerオブジェクトを生成します
(3):serialize()メソッドでシリアラズします
(4):getSerializedData()メソッドでシリアラズの結果(RSSフィード)を表示します


ブラウザーからこのファイルにアクセスしてみると、XML文書が表示されます。これがRSSフィードになります。

このページをRSSリーダーから確認してみると、正しく表示されていることがわかります。

このように、XML_Serializerを利用することで、RSSフィードを動的に生成することができます。

次回はデザインとロジックを分離するためのテンプレートエンジンについてご紹介します。

関連キーワード
PHP、PEAR、Webアプリケーション、開発効率、プログラミング、XML、RSS、フィード、情報発信

このエントリーのトラックバックURL

http://it.jfe-tec.jp/mt/mt-tb.cgi/71