DOMを使ってRSS2.0文書を作成する

戻る

生成されたXMLはこちら。

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

import org.w3c.dom.*;
import java.io.*;
import java.util.*;

import java.text.*;

/**
* $Id: making-rss2.0-doc.html,v 1.1 2009/06/22 16:12:16 kishi Exp kishi $
* DOMを使ってXML文書を作成するモックアッププログラム
*/

public class CreateXMLTest {

    public static void main( String[] args ) throws Exception {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        DOMImplementation domImpl = builder.getDOMImplementation();
        //-------------------------------------
        // ルート要素名をrssにする
        //-------------------------------------
        Document document = domImpl.createDocument( "", "rss", null );

        //-------------------------------------
        // ルート要素を取得
        //-------------------------------------
        Element rss = document.getDocumentElement();

        //-------------------------------------
        // 属性としてversionを付与
        //-------------------------------------
        rss.setAttribute( "version", "2.0" );
        /**
        * 以下の方法でも可
               * Attr attr = document.createAttribute( "version" );
               * attr.setValue( "2.0" );
               * rss.setAttributeNode( attr );
        **/

        //-------------------------------------
        // ルート配下にchannel要素を追加
        //-------------------------------------
        Element channel = document.createElement( "chanell" );

        //-------------------------------------
        // channel配下にそれぞれの要素を追加
        //-------------------------------------
        createChannel( document, channel );

        rss.appendChild( channel );

        //-------------------------------------
        // DOMツリーをXMLに変換
        //-------------------------------------
        TransformerFactory transFactory = TransformerFactory.newInstance();
        Transformer transformer = transFactory.newTransformer();

        DOMSource source = new DOMSource( document );

        /**
                 File newXML = new File("newXML.xml"); 
                 FileOutputStream os = new FileOutputStream(newXML); 
        **/

        StreamResult result = new StreamResult( System.out ); // ファイル出力の場合は、FileOutputStreamを引き渡す
        transformer.transform( source, result );

    }

    private static void createChannel( Document document, Element channel ) {
        addOn( document, channel, "title", "私のブログでやんす!" );
        addOn( document, channel, "link", "http://www.xxx.yyy.zzz.jp/" );
        addOn( document, channel, "description", "DOMでRSS2.0文書を生成してみます" );
        addOn( document, channel, "language", "ja" );
        addOn( document, channel, "webmaster", "mimetype@content-type.jp" );
        addOn( document, channel, "lastBuildDate", getFormattedDate() );
        addOn( document, channel, "generator", "AS-IS-TO-BE" );
        addOn( document, channel, "docs", "http://blogs.law.harvard.edu/tech/rss" );

        createItems( document, channel );
    }

    private static void createItems( Document document, Element channel ) {
        Element item1 = document.createElement( "item" );
        addOn( document, item1, "title", "ブッシュ大統領の支持率、最低の29%に下落" );
        addOn( document, item1, "link", "http://www.xxx.yyy.zzz.jp/item1" );
        addOn( document, item1, "description", "米紙ウォール・ストリート・ジャーナル(電子版)は12日、世論調査機関ハリス・インタラクティブの調査結果として、ブッシュ大統領の支持率が2001年の政権発足後、最低の29%に下落したと報じた。不支持は71%だった。 支持率は1月の調査の43%、4月の35%から急落。主要な世論調査でブッシュ大統領の支持率が3割を切ったのは初めて。調査は5〜8日、全国の1003人を対象に電話で行われた。 「危険水域」とされる2割台に突入したことで、11月に中間選挙を控えた与党・共和党はさらに危機感を強めるとみられる。" );
        addOn( document, item1, "category", "政治" );
        addOn( document, item1, "comment", "http://www.asahi.com/international/update/0514/001.html" );
        addOn( document, item1, "guid", "http://www.doblog.com/weblog/myblog/7160/2553728#2553728" );
        addOn( document, item1, "pubDate", getFormattedDate() );

        channel.appendChild( item1 );

        Element item2 = document.createElement( "item" );
        addOn( document, item2, "title", "地デジ受信機1千万台、BSデジタル放送の2倍の早さ" );
        addOn( document, item2, "link", "http://www.xxx.yyy.zzz.jp/item2" );
        addOn( document, item2, "description", "NHKは11日、地上デジタル放送の受信機が、4月末現在で、1000万台を突破し、1049万台に達したことを明らかにした。 1000万台の突破は2003年12月の地上デジタル放送開始以来、880日での達成で、1735日かかったBSデジタル放送の2倍近い速さ。 受信可能世帯は、6月末で全世帯の68%にあたる3220万世帯に達する見通しで、年末には84%にまで拡大する。" );
        addOn( document, item2, "category", "エンタメ" );
        addOn( document, item2, "comment", "http://www.yomiuri.co.jp/entertainment/news/20060511it12.htm" );
        addOn( document, item2, "guid", "http://www.doblog.com/weblog/myblog/7160/12553728#12553728" );
        addOn( document, item2, "pubDate", getFormattedDate() );

        channel.appendChild( item2 );

    }


    private static void addOn( Document document, Element parent, String elementName, String value ) {
        Element element = document.createElement( elementName );
        element.appendChild( document.createTextNode( value ) );
        parent.appendChild( element );
    }

    private static String getFormattedDate() {
        //
        // Sat, 13 May 2006 19:18:00 +0900 みたいなRFC822タイムゾーンがついた形式で日付時刻を返す
        //
        Date date = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat( "EEE, d MMM yyyy HH:mm:ss Z", Locale.US );
        String value = formatter.format( date );

        return value;
    }
}

戻る inserted by FC2 system