戻る
■ http://www.imjp.co.jp/news/rss10.rss
キーワード: 小泉首相
キーワード: ジーコ
キーワード: ウェブ・ワーカーズ
rdf:about | http://www.imjp.co.jp/irnews/news/articles/20050120_1427_10049.html |
title | 異動子会社に関する概要書 株式会社ウェブ・ワーカーズ |
link | http://www.imjp.co.jp/irnews/news/articles/20050120_1427_10049.html |
dc:date | 2005-09-15T15:05:00+09:00 |
rdf:about | http://www.imjp.co.jp/imjgroupnews/news/articles/20040510_01g.html |
title | ウェブ・ワーカーズ、エフワンインタラクティブ東京支店からの人材の受け入れ及び什器の譲り受けについてのお知らせ |
link | http://www.imjp.co.jp/imjgroupnews/news/articles/20040510_01g.html |
dc:date | 2004-05-10T00:00:00+09:00 |
rdf:about | http://www.imjp.co.jp/imjgroupnews/news/articles/20040107_01g.html |
title | ウェブ・ワーカーズ、NTTコミュニケーションズとホームページ作成代行サービスで協業! |
link | http://www.imjp.co.jp/imjgroupnews/news/articles/20040107_01g.html |
dc:date | 2004-01-07T00:00:00+09:00 |
キーワード: ニュース
※チャネル内にキーワードが見つかりました
rdf:about | http://www.imjp.co.jp/news/rss10.rdf |
title | IMJ アイエムジェイ NEWS |
link | http://www.imjp.co.jp |
description | ニュースリリース、トピックス、IRニュース、IMJグループニュースのRSSをお届けいたします |
キーワード: ブログ
rdf:about | http://www.imjp.co.jp/release/news/articles/20060508_10148.html |
title | AOLのブログポータル「Gencheez」構築でWeb2.0的な情報集積モデルを実現 |
link | http://www.imjp.co.jp/release/news/articles/20060508_10148.html |
dc:date | 2006-05-09T11:00:00+09:00 |
rdf:about | http://www.imjp.co.jp/release/news/articles/20050930_10054.html |
title | 「プラズマテレビ ブログモニター キャンペーン」実施について |
link | http://www.imjp.co.jp/release/news/articles/20050930_10054.html |
dc:date | 2005-09-30T15:00:00+09:00 |
キーワード: 国連
■ http://www.hp.com/hps/news/hps_news.xml
キーワード: 小泉首相
キーワード: ジーコ
キーワード: ウェブ・ワーカーズ
キーワード: ニュース
キーワード: ブログ
キーワード: 国連
■ http://feeds.feedburner.jp/MCPC
キーワード: 小泉首相
キーワード: ジーコ
キーワード: ウェブ・ワーカーズ
キーワード: ニュース
キーワード: ブログ
rdf:about | http://blog.dtpwiki.jp/dtp/2006/05/dtpblog_abe1.html |
title | DTPのblogは多くなってはきたよ。全然足りんけれども |
link | http://blog.dtpwiki.jp/dtp/2006/05/dtpblog_abe1.html |
description | PDF/X研究室 - 小さな世界かな [d.hatena.ne.jp] DTP業界って担っている人の人数からすると、ブログを書いたりする人が少ないみたいですね。仕事でモニタと睨めっこしているから、オフでもMacを触るなんてとんでもない! なんて人が多いのだろうか? ソーシャルブックマークで検索してみたけど、web上で発言されているDTPの世界のオピニオンリーダー的な人は片手で数えるぐらいみたいです。 そー言う場合はテクノラティでみてみましょう。 DTPを含むブログエントリーチャートGenerated by Technorati Chart generator Webを含むブログエントリーチャートGenerated by Technorati Chart generator ↑はCGIなのでリアルタイムで更新されますので、このエントリを書いた時点のデータを以下に。 僕はつねづね言っていますけれども、このままのペースだとマジで DTP とか、印刷業とかがあちら側の人たちに業種として認識されなくなりますよね。... |
content:encoded | PDF/X研究室 - 小さな世界かな [d.hatena.ne.jp]
DTP業界って担っている人の人数からすると、ブログを書いたりする人が少ないみたいですね。仕事でモニタと睨めっこしているから、オフでもMacを触るなんてとんでもない! なんて人が多いのだろうか?
ソーシャルブックマークで検索してみたけど、web上で発言されているDTPの世界のオピニオンリーダー的な人は片手で数えるぐらいみたいです。
そー言う場合はテクノラティでみてみましょう。
↑はCGIなのでリアルタイムで更新されますので、このエントリを書いた時点のデータを以下に。
僕はつねづね言っていますけれども、このままのペースだとマジで DTP とか、印刷業とかがあちら側の人たちに業種として認識されなくなりますよね。 |
dc:subject | DTP |
dc:date | 2006-05-20T00:01:00+09:00 |
キーワード: 国連
■ http://www3.asahi.com/rss/index.rdf
キーワード: 小泉首相
キーワード: ジーコ
キーワード: ウェブ・ワーカーズ
キーワード: ニュース
キーワード: ブログ
キーワード: 国連
rdf:about | http://www.asahi.com/international/update/0520/009.html?ref=rss |
title | 国連事務次長とスー・チー氏会談 軍政、約2年ぶり許可 |
link | http://www.asahi.com/international/update/0520/009.html?ref=rss |
dc:subject | 国際 |
dc:date | 2006-05-20T22:52:45+09:00 |
■ http://www.nikkeibp.co.jp/news/rss/it/index.rdf
キーワード: 小泉首相
キーワード: ジーコ
キーワード: ウェブ・ワーカーズ
キーワード: ニュース
※チャネル内にキーワードが見つかりました
rdf:about | http://www.nikkeibp.co.jp/news/it/ |
title | nikkeibp.jp IT - RSS |
link | http://www.nikkeibp.co.jp/news/it/ |
description | nikkeibp.jpがお届けするITのニュース一覧(15分おきに更新中) |
dc:language | ja |
dc:date | 2006-05-20T08:07:00+09:00 |
キーワード: ブログ
キーワード: 国連
■ http://www.nikkeibp.co.jp/style/biz/rss/column.rdf
キーワード: 小泉首相
キーワード: ジーコ
キーワード: ウェブ・ワーカーズ
キーワード: ニュース
キーワード: ブログ
rdf:about | http://www.nikkeibp.co.jp/style/biz/feature/forbes/060519_kaiko |
title | あなたの解雇につながるこれだけの道筋 |
link | http://www.nikkeibp.co.jp/style/biz/feature/forbes/060519_kaiko |
description | ブログに度を超えたことを書けば、解雇される危険がある。コメントが独断的なものなら、なおさらだ。 |
dc:date | 2006-05-19T11:23:00+09:00 |
rdf:about | http://www.nikkeibp.co.jp/style/biz/net/blogmarketing/060501_kikaku5 |
title | ビジネスブログを企画する(5)?してはいけない三つのこと |
link | http://www.nikkeibp.co.jp/style/biz/net/blogmarketing/060501_kikaku5 |
description | ファンをつくるポイントの第2は「いかに閲覧者と意思疎通するか?」、第3は「隠さない、ごまかさない、ウソをつかない」です。 |
dc:date | 2006-05-01T10:00:00+09:00 |
キーワード: 国連
■ http://www.nikkeibp.co.jp/index.rdf
キーワード: 小泉首相
キーワード: ジーコ
キーワード: ウェブ・ワーカーズ
キーワード: ニュース
※チャネル内にキーワードが見つかりました
rdf:about | http://www.nikkeibp.co.jp/news/ |
title | “仕事”を磨く総合ビジネス情報 nikkeibp.jp - RSS |
link | http://www.nikkeibp.co.jp/news/ |
description | nikkeibp.jpがお届けするニュース・コラム一覧(15分おきに更新中) |
dc:language | ja |
dc:date | 2006-05-20T08:07:00+09:00 |
キーワード: ブログ
キーワード: 国連
::::::::::::::
memo/Spec.txt
::::::::::::::
■キーワード入力
XML形式のプロパティファイルで保持する
■アグリゲート対象URLの指定
XML形式のプロパティファイルで保持する
■RSSバージョンの自動認識
■RSS0.91形式の場合に取り出せる項目
○チャネル
-- title
-- link
-- description
-- language
-- lastBuildingDate
-- docs
○アイテム(リスト構造)
-- title
-- link
-- description
■RSS1.0形式の場合に取り出せる項目
○チャネル
-- title
-- link
-- description
-- dc:language
-- dc:creator
-- dc:date
-- sy:updatePeriod
○アイテム(リスト構造)
-- link
-- title
-- description
-- dc:subject
-- dc:creation
-- dc:date
-- content:encoded
■RSS2.0形式の場合に取り出せる項目
○チャネル
-- title
-- link
-- language
-- webMaster
-- lastBuildingDate
-- generator
-- docs
○アイテム(リスト構造)
-- title
-- link
-- description
-- category
-- guid
-- generator
-- pubDate
::::::::::::::
GetContent.sh
::::::::::::::
#!/bin/sh
if [ $# != 2 ] ; then
echo "Usage: $0 [URL|FILE] [Version]"
echo "such as:"
echo " ./GetContent.sh http://health.yahoo.co.jp/news/rss.xml 2.0"
exit
fi
java -cp RSSAggregator.jar RagTimeRSS.RSSReaderFactory $1 $2
::::::::::::::
Keywords.sh
::::::::::::::
#!/bin/sh
java -cp RSSAggregator.jar RagTimeRSS.KeywordsObtainer
::::::::::::::
RSSAggregator.sh
::::::::::::::
#!/bin/sh
java -cp RSSAggregator.jar RagTimeRSS.RSSAggregator
::::::::::::::
RSSFeedURLObtainer.sh
::::::::::::::
#!/bin/sh
java -cp RSSAggregator.jar RagTimeRSS.RSSFeedURLObtainer
::::::::::::::
src/AbstractRSSReader.java
::::::::::::::
package RagTimeRSS;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
public abstract class AbstractRSSReader implements RSSReader {
/** ドキュメントのルート要素 */
protected Element root;
protected DocumentBuilder builder;
protected RSSEntity channel = null;
protected List<RSSEntity> itemList = null;
public AbstractRSSReader( ) throws Exception {
//------------------------------------------------------------------------------------
// ドキュメントビルダーファクトリを生成
//------------------------------------------------------------------------------------
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//------------------------------------------------------------------------------------
// 【重要】 -- CDATAノードの取り出し方です --
// このファクトリで作成されたパーサが CDATA ノードを Text ノードに変換し、
// それを隣接 (存在する場合) Text ノードに追加するように指定します。
// デフォルトでは、この値は false に設定されます。
//------------------------------------------------------------------------------------
factory.setCoalescing( true );
//------------------------------------------------------------------------------------
// ドキュメントビルダーを生成
//------------------------------------------------------------------------------------
builder = factory.newDocumentBuilder();
}
public void parse( String source ) throws Exception {
//----------------------------------------------------------------
// パースを実行してDocumentオブジェクトを取得
//----------------------------------------------------------------
Document doc = builder.parse( source );
System.err.println( "【XMLのバージョン】" + doc.getXmlVersion() );
System.err.println( "【文書のエンコーディング】" + doc.getXmlEncoding() );
root = doc.getDocumentElement();
// --- ここまではXML文書を読むための共通処理
////////////////////////////////////////////////////////////
// RSSバージョンにより異なる
////////////////////////////////////////////////////////////
showInfo();
traverse();
}
protected abstract void showInfo() throws Exception;
public RSSEntity getChannel() {
return channel;
}
public List getItemList() {
return itemList;
}
}
::::::::::::::
src/HTMLWriter.java
::::::::::::::
package RagTimeRSS;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
import java.util.*;
import java.io.*;
public class HTMLWriter {
private Writer writer;
private final String html = "result.html";
public static void main( String[] args ) throws Exception {
HTMLWriter myWriter = new HTMLWriter();
myWriter.outputHeader( "テスト" );
RSSEntity channel = new RSSEntity();
channel.put( "rdf:about", "http://www.imjp.co.jp/news/rss10.rdf" );
channel.put( "title", "IMJ アイエムジェイ NEWS" );
channel.put( "link", "http://www.imjp.co.jp" );
channel.put( "description", "ニュースリリース、トピックス、IRニュース、IMJグループニュースのRSSをお届けいたします" );
myWriter.outputEntity( channel );
myWriter.close();
}
public HTMLWriter() throws Exception {
writer = new FileWriter( html );
}
public void outputHeader( String title ) throws Exception {
writer.write( "<html>" );
writer.write( "<head>" );
writer.write( "<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\"><title>" + title + "</title>" );
writer.write( "<LINK rel=\"stylesheet\" href=\"result.css\" type=\"text/css\">" );
writer.write( "</head>" );
writer.write( "<body>" );
}
public void close() throws Exception {
writer.write( "</body>" );
writer.write( "</html>" );
writer.close();
}
public void write( String str ) throws Exception {
writer.write( str );
}
public void outputEntity( RSSEntity entity ) throws Exception {
writer.write( "<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\">" );
Iterator iterator = entity.keySet().iterator();
while ( iterator.hasNext() ) {
String key = ( String ) iterator.next();
String value = ( String ) entity.get( key );
writer.write( "<tr>" );
writer.write( "<td>" );
writer.write( key );
writer.write( "</td>" );
writer.write( "<td>" );
writer.write( value );
writer.write( "</td>" );
writer.write( "</tr>" );
}
writer.write( "</table>\n" );
}
}
::::::::::::::
src/KeywordsObtainer.java
::::::::::::::
package RagTimeRSS;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* <pre>シングルトンにする⇒一度ファイルを読み込んだら、もう読まない</pre>
* @author KISHI Yasuhiro
*/
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
public class KeywordsObtainer {
private final static String config = "etc/keywords.xml";
private static List keywords = null;
private static KeywordsObtainer uniqueInstance = null;
public static KeywordsObtainer getInstance() throws Exception {
if ( uniqueInstance == null ) {
System.err.println( "/** キーワードファイルを読み取っています! */" );
uniqueInstance = new KeywordsObtainer();
init();
}
return uniqueInstance;
}
public static List obtain() throws Exception {
return keywords;
}
private static void init() throws Exception {
keywords = new LinkedList();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//------------------------------------------------------------------------------------
// 【重要】 -- CDATAノードの取り出し方です --
// このファクトリで作成されたパーサが CDATA ノードを Text ノードに変換し、
// それを隣接 (存在する場合) Text ノードに追加するように指定します。
// デフォルトでは、この値は false に設定されます。
//------------------------------------------------------------------------------------
factory.setCoalescing( true );
//------------------------------------------------------------------------------------
// ドキュメントビルダーを生成
//------------------------------------------------------------------------------------
DocumentBuilder builder = factory.newDocumentBuilder();
//----------------------------------------------------------------
// パースを実行してDocumentオブジェクトを取得
//----------------------------------------------------------------
Document doc = builder.parse( config );
// System.out.println( "【XMLのバージョン】" + doc.getXmlVersion() );
// System.out.println( "【文書のエンコーディング】" + doc.getXmlEncoding() );
// ルート要素を取得
Node root = doc.getDocumentElement();
traverse( root );
}
private static void traverse( Node root ) {
// 子要素のリストを取得
Node childNode = root.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
// System.out.println( nodeName );
if ( "keyword".equals( nodeName ) ) {
// System.out.println( childNode.getFirstChild().getNodeValue() );
String keyword = childNode.getFirstChild().getNodeValue();
keywords.add( keyword.trim() );
}
childNode = childNode.getNextSibling();
}
}
public static void main( String[] args ) throws Exception {
List keywords = KeywordsObtainer.getInstance().obtain();
Iterator iterator = keywords.iterator();
while ( iterator.hasNext() ) {
System.out.println( iterator.next() );
}
}
}
::::::::::::::
src/RSS0_91.java
::::::::::::::
package RagTimeRSS;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
public class RSS0_91 extends AbstractRSSReader {
public static void main( String[] args ) {
if ( args.length != 1 ) {
System.err.println( "usage: java -cp . RSS0_91 [URI|fileName]" );
System.exit( -1 );
}
String source = args[ 0 ];
try {
/////////////////////////////////////////////////////
// RSSリーダのインスタンス生成
/////////////////////////////////////////////////////
RSS0_91 reader = new RSS0_91();
/////////////////////////////////////////////////////
// ルート要素から再帰的に走査していく
/////////////////////////////////////////////////////
reader.parse( source );
// ダンプする
reader.iterateAll();
} catch ( Exception e ) {
e.printStackTrace();
}
}
public RSS0_91( ) throws Exception {
super( );
}
protected void showInfo() throws Exception {
System.err.println( "【ルート要素のタグ名】" + root.getTagName() );
System.err.println( "【ルート要素の属性】" + root.getAttribute( "version" ) );
if ( ! "0.91".equals( root.getAttribute( "version" ) ) ) {
throw new VersionMismatchException( "0.91" );
}
}
/**
* セットされた情報を全て列挙する
*/
public void iterateAll() {
if ( channel != null ) {
System.err.println();
System.err.println( "/** channel */" );
channel.iterate();
}
if ( itemList != null ) {
Iterator iterator = itemList.iterator();
while ( iterator.hasNext() ) {
RSSEntity item = ( RSSEntity ) iterator.next();
System.err.println();
System.err.println( "/** item */" );
item.iterate();
}
}
}
public void traverse() {
// 子要素のリストを取得 -- getFirstChild()はNodeクラスが持つメソッドなのでキャストする
Node childNode = ( ( Node ) root ).getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
if ( "channel".equals( nodeName ) ) {
// System.err.println( nodeName );
parseChannel( childNode );
}
childNode = childNode.getNextSibling();
}
}
private void parseChannel( Node node ) {
channel = new RSSEntity();
// 子要素のリストを取得 -- getFirstChild()はNodeクラスが持つメソッドなのでキャストする
Node childNode = node.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
if ( "title".equals( nodeName )
|| "link".equals( nodeName )
|| "description".equals( nodeName )
|| "language".equals( nodeName )
|| "lastBuildingDate".equals( nodeName )
|| "docs".equals( nodeName )
) {
channel.put( nodeName, childNode.getFirstChild().getNodeValue() );
} else if ( "item".equals( nodeName ) ) {
parseItem( childNode );
}
childNode = childNode.getNextSibling();
}
}
private void parseItem( Node node ) {
if ( itemList == null ) {
itemList = new LinkedList();
}
RSSEntity item = new RSSEntity();
// 子要素のリストを取得
Node childNode = node.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
if ( "title".equals( nodeName )
|| "link".equals( nodeName )
|| "description".equals( nodeName )
) {
String nodeValue = "";
if ( !childNode.hasChildNodes() ) {
/**
* 要素に値がない場合はnull例外が発生するので止むを得ず対応
*/
// System.err.println( "*** NULL *** " );
// DO NOTHING
} else {
nodeValue = childNode.getFirstChild().getNodeValue();
}
// System.err.println( nodeName + ": " + nodeValue );
item.put( nodeName, nodeValue );
}
childNode = childNode.getNextSibling();
}
itemList.add( item );
}
}
::::::::::::::
src/RSS1_0.java
::::::::::::::
package RagTimeRSS;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
public class RSS1_0 extends AbstractRSSReader {
private RSSEntity image = null;
public static void main( String[] args ) {
if ( args.length != 1 ) {
System.err.println( "usage: java -cp . RSS1_0 [URI|fileName]" );
System.exit( -1 );
}
String source = args[ 0 ];
try {
/////////////////////////////////////////////////////
// RSSリーダのインスタンス生成
/////////////////////////////////////////////////////
RSS1_0 reader = new RSS1_0( );
/////////////////////////////////////////////////////
// ルート要素から再帰的に走査していく
/////////////////////////////////////////////////////
reader.parse( source );
// ダンプする
reader.iterateAll();
} catch ( Exception e ) {
e.printStackTrace();
}
}
public RSS1_0( ) throws Exception {
super( );
}
protected void showInfo() throws Exception {
System.err.println( "【ルート要素のタグ名】" + root.getTagName() );
System.err.println( "【ルート要素の属性】" + root.getAttribute( "xmlns" ) );
if ( ! "http://purl.org/rss/1.0/".equals( root.getAttribute( "xmlns" ) ) ) {
throw new VersionMismatchException( "1.0" );
}
}
public void traverse() {
// 子要素のリストを取得 -- getFirstChild()はNodeクラスが持つメソッドなのでキャストする
Node childNode = ( ( Node ) root ).getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
if ( "channel".equals( nodeName ) ) {
// System.err.println( nodeName );
parseChannel( childNode );
}
if ( "image".equals( nodeName ) ) {
// System.err.println( nodeName );
parseImage( childNode );
}
if ( "item".equals( nodeName ) ) {
// System.err.println( nodeName );
parseItem( childNode );
}
childNode = childNode.getNextSibling();
}
}
/**
* セットされた情報を全て列挙する
*/
public void iterateAll() {
if ( channel != null ) {
System.err.println();
System.err.println( "/** channel */" );
channel.iterate();
}
if ( image != null ) {
System.err.println();
System.err.println( "/** image */" );
image.iterate();
}
if ( itemList != null ) {
Iterator iterator = itemList.iterator();
while ( iterator.hasNext() ) {
RSSEntity item = ( RSSEntity ) iterator.next();
System.err.println();
System.err.println( "/** item */" );
item.iterate();
}
}
}
private void parseItem( Node node ) {
if ( itemList == null ) {
itemList = new LinkedList();
}
RSSEntity item = new RSSEntity();
item.put( "rdf:about", ( ( Element ) node ).getAttribute( "rdf:about" ) );
// 子要素のリストを取得
Node childNode = node.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
// System.err.println( nodeName );
if ( childNode.hasChildNodes() ) {
if ( "link".equals( nodeName )
|| "title".equals( nodeName )
|| "description".equals( nodeName )
|| "dc:subject".equals( nodeName )
|| "dc:creation".equals( nodeName )
|| "dc:date".equals( nodeName )
|| "content:encoded".equals( nodeName )
) {
item.put( nodeName, childNode.getFirstChild().getNodeValue() );
}
}
childNode = childNode.getNextSibling();
}
itemList.add( item );
}
private void parseChannel( Node node ) {
channel = new RSSEntity();
channel.put( "rdf:about", ( ( Element ) node ).getAttribute( "rdf:about" ) );
// 子要素のリストを取得
Node childNode = node.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
// System.err.println( nodeName );
if ( childNode.hasChildNodes() ) {
if ( "title".equals( nodeName )
|| "link".equals( nodeName )
|| "description".equals( nodeName )
|| "dc:language".equals( nodeName )
|| "dc:creator".equals( nodeName )
|| "dc:date".equals( nodeName )
|| "sy:updatePeriod".equals( nodeName )
) {
channel.put( nodeName, childNode.getFirstChild().getNodeValue() );
}
}
if ( "image".equals( nodeName ) ) {
channel.put( "image", ( ( Element ) childNode ).getAttribute( "rdf:resource" ) );
}
if ( "admin:generatorAgent".equals( nodeName ) ) {
channel.put( nodeName, ( ( Element ) childNode ).getAttribute( "rdf:resource" ) );
}
childNode = childNode.getNextSibling();
}
}
private void parseImage( Node node ) {
image = new RSSEntity();
image.put( "rdf:about", ( ( Element ) node ).getAttribute( "rdf:about" ) );
// 子要素のリストを取得
Node childNode = node.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
// System.out.println( nodeName );
if ( childNode.hasChildNodes() ) {
if ( "title".equals( nodeName )
|| "link".equals( nodeName )
|| "url".equals( nodeName )
) {
image.put( nodeName, childNode.getFirstChild().getNodeValue() );
}
}
childNode = childNode.getNextSibling();
}
}
}
::::::::::::::
src/RSS2_0.java
::::::::::::::
package RagTimeRSS;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
public class RSS2_0 extends AbstractRSSReader {
public static void main( String[] args ) {
if ( args.length != 1 ) {
System.err.println( "usage: java -cp . RSS2_0 [URI|fileName]" );
System.exit( -1 );
}
String source = args[ 0 ];
try {
/////////////////////////////////////////////////////
// RSSリーダのインスタンス生成
/////////////////////////////////////////////////////
RSS2_0 reader = new RSS2_0( );
/////////////////////////////////////////////////////
// ルート要素から再帰的に走査していく
/////////////////////////////////////////////////////
reader.parse( source );
// ダンプする
reader.iterateAll();
} catch ( Exception e ) {
e.printStackTrace();
}
}
public RSS2_0( ) throws Exception {
super( );
}
protected void showInfo() throws Exception {
System.err.println( "【ルート要素のタグ名】" + root.getTagName() );
System.err.println( "【ルート要素の属性】" + root.getAttribute( "version" ) );
if ( ! "2.0".equals( root.getAttribute( "version" ) ) ) {
throw new VersionMismatchException( "2.0" );
}
}
/**
* セットされた情報を全て列挙する
*/
public void iterateAll() {
if ( channel != null ) {
System.err.println();
System.err.println( "/** channel */" );
channel.iterate();
}
if ( itemList != null ) {
Iterator iterator = itemList.iterator();
while ( iterator.hasNext() ) {
RSSEntity item = ( RSSEntity ) iterator.next();
System.err.println();
System.err.println( "/** item */" );
item.iterate();
}
}
}
public void traverse() {
// 子要素のリストを取得 -- getFirstChild()はNodeクラスが持つメソッドなのでキャストする
Node childNode = ( ( Node ) root ).getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
if ( "channel".equals( nodeName ) ) {
// System.err.println( nodeName );
parseChannel( childNode );
}
childNode = childNode.getNextSibling();
}
}
private void parseChannel( Node node ) {
channel = new RSSEntity();
// 子要素のリストを取得 -- getFirstChild()はNodeクラスが持つメソッドなのでキャストする
Node childNode = node.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
if ( "title".equals( nodeName )
|| "link".equals( nodeName )
|| "language".equals( nodeName )
|| "webMaster".equals( nodeName )
|| "lastBuildingDate".equals( nodeName )
|| "generator".equals( nodeName )
|| "docs".equals( nodeName )
) {
channel.put( nodeName, childNode.getFirstChild().getNodeValue() );
} else if ( "item".equals( nodeName ) ) {
parseItem( childNode );
}
childNode = childNode.getNextSibling();
}
}
private void parseItem( Node node ) {
if ( itemList == null ) {
itemList = new LinkedList();
}
RSSEntity item = new RSSEntity();
// 子要素のリストを取得
Node childNode = node.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
if ( "title".equals( nodeName )
|| "link".equals( nodeName )
|| "description".equals( nodeName )
|| "category".equals( nodeName )
|| "guid".equals( nodeName )
|| "generator".equals( nodeName )
|| "pubDate".equals( nodeName )
) {
String nodeValue = "";
if ( !childNode.hasChildNodes() ) {
/**
* 要素に値がない場合はnull例外が発生するので止むを得ず対応
*/
// System.err.println( "*** NULL *** " );
// DO NOTHING
} else {
nodeValue = childNode.getFirstChild().getNodeValue();
}
// System.err.println( nodeName + ": " + nodeValue );
item.put( nodeName, nodeValue );
}
childNode = childNode.getNextSibling();
}
itemList.add( item );
}
}
::::::::::::::
src/RSSAggregator.java
::::::::::::::
package RagTimeRSS;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
import java.util.*;
public class RSSAggregator {
public static void main( String[] args ) throws Exception {
Iterator iterator;
int i;
List keywords;
String keyword;
Map URLs;
HTMLWriter myWriter = new HTMLWriter();
myWriter.outputHeader( "フィルタリング結果" );
URLs = RSSFeedURLObtainer.obtain();
Iterator itrt = URLs.keySet().iterator();
while ( itrt.hasNext() ) {
String URL = ( String ) itrt.next();
String version = ( String ) URLs.get( URL );
System.err.printf( " Now processing -- %s: %s\n", URL , version );
myWriter.write( "<h1>■ " + URL + "</h1>" );
RSSReader reader = RSSReaderFactory.newInstance( version );
reader.parse( URL );
RSSEntity channel = reader.getChannel();
/** キーワード別にマッチしたフィードを出力していく */
keywords = KeywordsObtainer.getInstance().obtain();
iterator = keywords.iterator();
while ( iterator.hasNext() ) {
keyword = ( String ) iterator.next();
System.out.println( "KEYWORD=" + keyword );
myWriter.write( "<h2>キーワード: <u>" + keyword + "</u></h2>" );
if ( channel.containsKeyword( keyword ) ) {
System.out.println( "// キーワード[ " + keyword + " ] がチャネルに含まれています! ⇒ " + URL );
channel.iterate();
// HTMLに出力
myWriter.write( "<h3>※チャネル内にキーワードが見つかりました</h3>" );
myWriter.outputEntity( channel );
}
checkItemList( reader, keyword , myWriter );
}
}
myWriter.close();
}
private static void checkItemList( RSSReader reader, String keyword, HTMLWriter myWriter ) throws Exception {
/** アイテムリストを取得する */
List list = reader.getItemList();
Iterator iterator = list.iterator();
while ( iterator.hasNext() ) {
RSSEntity item = ( RSSEntity ) iterator.next();
if ( item.containsKeyword( keyword ) ) {
System.out.println( "// キーワード[ " + keyword + " ] がアイテムに含まれています!" );
item.iterate();
// HTMLに出力
myWriter.outputEntity( item );
}
}
}
}
::::::::::::::
src/RSSEntity.java
::::::::::::::
package RagTimeRSS;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
* <pre>チャネル、イメージ、アイテムなどを格納するクラス</pre>
*/
public class RSSEntity extends LinkedHashMap {
public RSSEntity() {
super();
}
public void iterate() {
Iterator iterator = this.keySet().iterator();
while ( iterator.hasNext() ) {
String key = ( String ) iterator.next();
String value = ( String ) this.get( key );
System.out.println( key + "\t" + value );
}
}
public boolean containsKeyword( String keyword ) {
Iterator iterator = this.keySet().iterator();
while ( iterator.hasNext() ) {
String key = ( String ) iterator.next();
String value = ( String ) this.get( key );
if ( value.contains( keyword ) ) {
return true;
}
}
return false;
}
}
::::::::::::::
src/RSSFeedURLObtainer.java
::::::::::::::
package RagTimeRSS;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
public class RSSFeedURLObtainer {
private final static String config = "etc/rss-feed-url.xml";
private static Map URLs;
public static Map obtain() throws Exception {
URLs = new LinkedHashMap();
init();
return URLs;
}
private static void init() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//------------------------------------------------------------------------------------
// 【重要】 -- CDATAノードの取り出し方です --
// このファクトリで作成されたパーサが CDATA ノードを Text ノードに変換し、
// それを隣接 (存在する場合) Text ノードに追加するように指定します。
// デフォルトでは、この値は false に設定されます。
//------------------------------------------------------------------------------------
factory.setCoalescing( true );
//------------------------------------------------------------------------------------
// ドキュメントビルダーを生成
//------------------------------------------------------------------------------------
DocumentBuilder builder = factory.newDocumentBuilder();
//----------------------------------------------------------------
// パースを実行してDocumentオブジェクトを取得
//----------------------------------------------------------------
Document doc = builder.parse( config );
// System.out.println( "【XMLのバージョン】" + doc.getXmlVersion() );
// System.out.println( "【文書のエンコーディング】" + doc.getXmlEncoding() );
// ルート要素を取得
Node root = doc.getDocumentElement();
traverse( root );
}
private static void traverse( Node root ) {
// 子要素のリストを取得
Node childNode = root.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
if ( "URL".equals( nodeName ) ) {
String URL = childNode.getFirstChild().getNodeValue();
String version = ( ( Element ) childNode ).getAttribute( "rssVersion" );
URLs.put( URL.trim(), version );
}
childNode = childNode.getNextSibling();
}
}
public static void main( String[] args ) throws Exception {
Map URLs = RSSFeedURLObtainer.obtain();
Iterator iterator = URLs.keySet().iterator();
while ( iterator.hasNext() ) {
String URL = ( String ) iterator.next();
String version = ( String ) URLs.get( URL );
System.out.println( URL + ": " + version );
}
}
}
::::::::::::::
src/RSSReader.java
::::::::::::::
package RagTimeRSS;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
import java.util.*;
public interface RSSReader {
/** 全要素をダンプする */
public void iterateAll();
/** DOMツリーを走査して、データを取り出す */
public void traverse();
/** チャネルのMAPを取得する */
public RSSEntity getChannel();
/** アイテムリストを取得する */
public List getItemList();
/** URIあるいはファイルを解析する */
public void parse( String source ) throws Exception;
}
::::::::::::::
src/RSSReaderFactory.java
::::::::::::::
package RagTimeRSS;
/**
* $Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
import java.util.*;
public class RSSReaderFactory {
public static RSSReader newInstance( String version ) throws Exception {
if ( "0.91".equals( version ) ) {
return new RSS0_91( );
} else if ( "1.0".equals( version ) ) {
return new RSS1_0( );
} else if ( "2.0".equals( version ) ) {
return new RSS2_0( );
} else {
throw new RSSReaderInvalidFactoryException( version );
}
}
public static void main( String[] args ) {
if ( args.length != 2 ) {
System.out.println( "java -cp . RSSReaderFactory [URL|FILE] [Version]" );
System.exit( 1 );
}
String source = args[ 0 ];
String version = args[ 1 ];
try {
RSSReader reader = RSSReaderFactory.newInstance( version );
reader.parse( source );
System.out.println();
showContext( reader );
} catch ( Exception e ) {
e.printStackTrace();
}
/**
try {
RSSReader reader = RSSReaderFactory.newInstance( "1.1" );
} catch ( Exception e ) {
e.printStackTrace();
}
try {
System.out.println( "------ RSS0.91 ---------------------" );
RSSReader reader = RSSReaderFactory.newInstance( "0.91" );
reader.parse( "" );
System.out.println();
showContext( reader );
} catch ( Exception e ) {
e.printStackTrace();
}
try {
System.out.println( "------ RSS1.0 ---------------------" );
RSSReader reader = RSSReaderFactory.newInstance( "1.0" );
reader.parse( "http://japan.linux.com/desktop.rdf" );
System.out.println();
showContext( reader );
} catch ( Exception e ) {
e.printStackTrace();
}
try {
System.out.println( "------ RSS2.0 ---------------------" );
RSSReader reader = RSSReaderFactory.newInstance( "2.0" );
reader.parse( "http://www.zubari.jp/rss2.php" );
System.out.println();
showContext( reader );
} catch ( Exception e ) {
e.printStackTrace();
}
**/
}
public static void showContext( RSSReader reader ) {
RSSEntity channel = reader.getChannel();
channel.iterate();
List itemList = reader.getItemList();
Iterator iterator = itemList.iterator();
while ( iterator.hasNext() ) {
RSSEntity item = ( RSSEntity ) iterator.next();
System.out.println();
System.out.println( "/** item */" );
item.iterate();
}
}
}
::::::::::::::
src/RSSReaderInvalidFactoryException.java
::::::::::::::
package RagTimeRSS;
/**
$Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class RSSReaderInvalidFactoryException extends Exception {
public RSSReaderInvalidFactoryException( String version ) {
super( "指定されたバージョン(" + version + ") はサポート対象外です!" );
}
}
::::::::::::::
src/VersionMismatchException.java
::::::::::::::
package RagTimeRSS;
/**
$Id: RSSAggregator.html,v 1.1 2009/06/22 16:11:53 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class VersionMismatchException extends Exception {
public VersionMismatchException( String version ) {
super( "version: " + version + " ではありません!" );
}
}
::::::::::::::
etc/keywords.xml
::::::::::::::
<?xml version="1.0" encoding="Shift_JIS"?>
<keywords>
<keyword>
<![CDATA[
小泉首相
]]>
</keyword>
<keyword>
<![CDATA[
ジーコ
]]>
</keyword>
<keyword>
<![CDATA[
ウェブ・ワーカーズ
]]>
</keyword>
<keyword>
<![CDATA[
ニュース
]]>
</keyword>
<keyword>
<![CDATA[
ブログ
]]>
</keyword>
<keyword>
<![CDATA[
国連
]]>
</keyword>
</keywords>
::::::::::::::
etc/rss-feed-url.xml
::::::::::::::
<?xml version="1.0" encoding="Shift_JIS"?>
<URLs>
<URL rssVersion="1.0">
<![CDATA[
http://www.imjp.co.jp/news/rss10.rss
]]>
</URL>
<URL rssVersion="2.0">
<![CDATA[
http://www.hp.com/hps/news/hps_news.xml
]]>
</URL>
<URL rssVersion="1.0">
<![CDATA[
http://feeds.feedburner.jp/MCPC
]]>
</URL>
<URL rssVersion="1.0">
<![CDATA[
http://www3.asahi.com/rss/index.rdf
]]>
</URL>
<URL rssVersion="1.0">
<![CDATA[
http://www.nikkeibp.co.jp/news/rss/it/index.rdf
]]>
</URL>
<URL rssVersion="1.0">
<![CDATA[
http://www.nikkeibp.co.jp/style/biz/rss/column.rdf
]]>
</URL>
<URL rssVersion="1.0">
<![CDATA[
http://www.nikkeibp.co.jp/index.rdf
]]>
</URL>
</URLs>
戻る