感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

dom4jやXPathを使って、JavaでXML文書を読み込むサンプル

<スポンサーリンク>

JavaXMLを扱うためのライブラリ

dom4jJavaXMLを扱うためのライブラリ。
dom4jは以下からダウンロードできる。
http://sourceforge.net/projects/dom4j/files/dom4j/1.6.1/

上記のURLからjarをダウンロードして、適当にパスを通す。
自分の場合は、Eclipseのプロジェクト直下にlibというフォルダを作って、そこにjarをコピーした。
で、そのjarを右クリックして、「ビルド・パス」→「ビルドパスに追加」で、ビルドパスにjarを追加することができる。

XML文書そのものを読み込んで表示してみる。

以下のようなXMLファイルを用意する。

<?xml version="1.0" encoding="UTF-8" ?>
<persons>
	<person>
		<name>sho322</name>
		<age>28</age>
		<job>programmer</job>
	</person>
	<person>
		<name>michitaka</name>
		<age>27</age>
		<job>kami</job>
	</person>
	<person>
		<name>toshi</name>
		<age>27</age>
		<job>ikemen</job>
	</person>
</persons>

こちらのXML文書を読み込んで、XMLのまま出力してみる。

package dom4jsample;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4jSample {
	public static void main(String[] args) {
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read("C:\\tmp\\member.xml");
			Element root = document.getRootElement();
			System.out.println(root.asXML());
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

これを実行すると、コンソールには読み込んだXMLと全く同じモノが表示される。

では、次に各要素のテキストを取り出してみる。

package dom4jsample;

import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4jSample {
	public static void main(String[] args) {
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read("C:\\tmp\\member.xml");
			Element root = document.getRootElement();
			for (Iterator i = root.elementIterator(); i.hasNext();) {
				Element element = (Element) i.next();
				System.out.println("テキストを取り出す:" + element.getStringValue());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

こちらを実行すると、XMLのテキストの部分だけ取り出して表示する。
実行結果はこちら。

テキストを取り出す:
		sho322
		28
		programmer
	
テキストを取り出す:
		michitaka
		27
		kami
	
テキストを取り出す:
		toshi
		27
		ikemen

XPathとは

XPathとは、XML Path Langageの略。XML文書の中の特定の要素を指し示す記述方法を定めた規格のことである。
JavaXPathを扱う場合は、XPathの評価エンジンであるjaxenライブラリを使う。

XPathの式

XPathXML文書を表すには、XPあthの式を使うらしい。
ルートノードは「/」(スラッシュ)、ルートノードの子孫は「/ルート/子1/子2」というように区切っていく。
属性は名前の前に@(アットマーク)をつける。

XPath 意味
/ ルートノード
/要素名A ルート要素A
/要素名A/要素名B 要素名Aの子である要素B
//要素名C 文書内のすべての要素C

jaxenライブラリをダウンロードする

以下のURLから「jaxen/jaxen-1.1.3.jar.zip( 198 k)」をクリックする。
http://www.java2s.com/Code/Jar/j/Downloadjaxen113jar.htm

jaxenとdom4jを使えば、XPathの式を使って要素を取り出すことができる。

dom4jで特定の要素だけ取り出してみる

上のXMLの[job]だけ取り出して、テキストを表示してみる。

package dom4jsample;

import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class Dom4jSample {
	public static void main(String[] args) {
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read("C:\\tmp\\member.xml");
			List nodes = document.selectNodes("/persons/person/job");

			for(Iterator i = nodes.iterator(); i.hasNext();) {
				Node node = (Node) i.next();
				System.out.println("job:" + node.getText());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

実行すると結果はこうなる。

job:programmer
job:kami
job:ikemen

いいねぇ!簡単!

それでは、XMLのうちのnameがsho322のものの、jobとかageを取り出してみる。
抽象的に言うと、XPathで特定のノードの兄弟ノードを取り出してみるという感じ。
サンプルjはかなり強引だけどこんな感じ。

package dom4jsample;

import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class Dom4jSample {
	public static void main(String[] args) {
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read("C:\\tmp\\member.xml");
			List nodes = document.selectNodes("/persons/person/name[text()='sho322']/following-sibling::*");

			for(Iterator i = nodes.iterator(); i.hasNext();) {
				Node node = (Node) i.next();
				System.out.println(node.getText());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

結果はこうなる。

28
programmer

いちおう特定のノードの兄弟のテキスト値が取れた!
いちおう。。

勉強した本

現場で使えるJavaライブラリ

現場で使えるJavaライブラリ

感謝のプログラミング

今回で感謝のプログラミングは【518時間目】
10000時間まで、あと【9482時間】