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; } }