「Java」XML 操作してみた(DOM)

JavaXML の操作してみたので、その時のメモ。
今回は DOM を使用して XML ファイル読み込むって内容をやりました。

[ 参考ページ ]
Javaで実現するDOM/SAXプログラミング(2):初めてJavaXML文書を操作してみる (1/3) - @IT
http://www.atmarkit.co.jp/ait/articles/0102/10/news003.html

※ オラクルのドキュメント的は以下あたりっぽいですが、今回は上記の Web ページを参考にさせていただきました ( ドキュメントは後日しっかり読もう・・・ )。
・Lesson: Document Object Model (The Java"! Tutorials > Java API for XML Processing (JAXP))
http://docs.oracle.com/javase/tutorial/jaxp/dom/index.html


操作対象の XML ファイルは以下の内容とした。

■ input.xml

<?xml version="1.0" encoding="UTF-8"?>
<node attr1="0001">
  <node1>
    <node11>hoge</node11>
    <node12>uga</node12>
  </node1>
  <node2>oro</node2>
  <node3>ahe</node3>
</node>

上記の XML ファイルに対して、いろいろ遊んでみました。
かなりセンスが感じられないコードになってますが、特に目的なく "遊んだ" ということで・・・

■ XMLDOMTest.java

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XMLDOMTest {
	public static void main(String[] args) {
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder document = factory.newDocumentBuilder();

			FileInputStream fis = new FileInputStream("input.xml");
			Node root = document.parse(fis);

			// <node> の情報
			Node node = root.getFirstChild();
			System.out.println(node.getNodeName());
			System.out.println(node.getAttributes().getNamedItem("attr1"));

			// <node1> の情報
			Node node1 = node.getFirstChild().getNextSibling();
			System.out.println(node1.getNodeName());

			// <node11> <node12> の情報
			NodeList node1112 = node1.getChildNodes();
			System.out.println(node1112.item(1).getNodeName() + ":"
					+ node1112.item(1).getFirstChild().getNodeValue());
			System.out.println(node1112.item(3).getNodeName() + ":"
					+ node1112.item(3).getFirstChild().getNodeValue());

			// <node2> の情報
			Node node2 = node1.getNextSibling().getNextSibling();
			System.out.println(node2.getNodeName() + ":"
					+ node2.getFirstChild().getNodeValue());

			// <node3> の情報
			Node node3 = node2.getNextSibling().getNextSibling();
			System.out.println(node3.getNodeName() + ":"
					+ node3.getFirstChild().getNodeValue());

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}
}

■ 出力結果

node
attr1="0001"
node1
node11:hoge
node12:uga
node2:oro
node3:ahe


個人的には、次のコードで得られる出力が感覚的にわかりにくいなぁと思った ( [ 参考ページ ] の図1がなかったら調べるの時間がかかったぽい )。

 - 略 -
NodeList nodelist = node.getChildNodes();
for (int i = 0; i < nodelist.getLength(); i++) {
  Node n = nodelist.item(i);
  System.out.println(n.getNodeName());
}
 - 略 -

■ 出力結果

#text
node1
#text
node2
#text
node3
#text


次は SAX 使った操作もやってみたいですが、DOM に関してもまだまだ勉強が必要そうです。

以上です。