読者です 読者をやめる 読者になる 読者になる

DOMを利用してXMLファイルを読む その2

Javaの流儀はまったくわからんけれども、とりあえず書いてみた。
XMLファイルのパース部分の動きについてのメモは明日書こう。
今日はその前準備メモ。


■ パースしたXML形式データの扱い

読み込んでパースしたXML形式のデータ構造は、そのまま出力するのではなく、独自定義したクラスに格納することにした。
そのままSystem.out.printlnで出力して終了ってのは普通はないよね。

1つのクラスインスタンスで、1つのチャンネルのデータ(タイトルとURL)を格納するので、配列として利用する。

■ 独自定義したクラスを配列で利用する

独自に定義したChannelクラスを配列として使うのには、要素毎にnewで生成したインスタンスを代入してやる必要がある。
そうしないと、NullPointerExceptionが...
初期化だけなら、こんな感じ。

Channel[] channels;
channels = new Channel[3];
for(int i = 0; i < 3; i++) {
    channels[i] = new Channel();
}

C言語的に考えると、まぁ当然といえば当然だんだけど...どうなんだろうなぁ...


■ とりあえずテストコードを書いてみた TestXmlReader.java

import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FilterInputStream;
import java.io.BufferedInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;



public class TestXmlReader {
    public static void main(String[] args) {
        DocumentBuilderFactory document_builder_factory;
        DocumentBuilder document_builder;
        Document document;
        Element root_tree, sub_tree;
        NodeList channel_node_list, title_node_list, url_node_list;
        Node title_node, url_node;

        String filename;
        int ch_idx, ch_max;

        Channel[] channels;

        filename = "test.xml";

        try {
            document_builder_factory = DocumentBuilderFactory.newInstance();
            document_builder = document_builder_factory.newDocumentBuilder();
            document = document_builder.parse(
                new BufferedInputStream(new FileInputStream(filename)));

            root_tree = document.getDocumentElement();

            channel_node_list = root_tree.getElementsByTagName("channel");
            ch_max = channel_node_list.getLength();
            channels = new Channel[ch_max];
            
            for (ch_idx = 0; ch_idx < ch_max; ch_idx++) {
                sub_tree = (Element)channel_node_list.item(ch_idx);
                title_node_list = sub_tree.getElementsByTagName("title");
                url_node_list = sub_tree.getElementsByTagName("url");
                title_node = title_node_list.item(0);
                url_node = url_node_list.item(0);
                channels[ch_idx] = new Channel();
                channels[ch_idx].set_title(
                    title_node.getFirstChild().getNodeValue());
                channels[ch_idx].set_url(
                    url_node.getFirstChild().getNodeValue());

                System.out.println(new Integer(ch_idx).toString());
                System.out.println(channels[ch_idx].get_title());
                System.out.println(channels[ch_idx].get_url());
            }
        } catch (Exception e) {
            System.err.println(e);
        }
    }


class Channel {
    private String title;
    private String url;

    public Channel() {
        this.title = null;
        this.url   = null;
    }
    public void set_title(String buff) {
        this.title = buff;
    }
    public void set_url(String buff) {
        this.url = buff;
    }
    public String get_title() {
        return this.title;
    }
    public String get_url() {
        return this.url;
    }
}