Java XMLをDOMで読み込んで内容を取得する


スポンサーリンク

JavaでXMLファイルの内容を読み込むにはjavax.xml.parsers.DocumentBuilderを使います。
サンプルを見ればわかりますが、DocumentBuilderでファイルを読み込んで、エレメント(要素)を引っ張り出してきます。

今回はこんなsample.xmlを読み込んでみます。

<?xml version="1.0"?>
<persons name="my friend">
    <person name="yoshida">
		<age>28</age>
		<interest>basketball</interest>
    </person>
    <person name="yamada">
		<age>26</age>
		<interest>baseball</interest>
    </person>
</persons>

お友達リストのようなイメージです。
ここからテキスト情報(タグに囲まれてる"baseball"とか)や、属性情報(タグの中にあるname="yamada"とか)を取得してみます。

フォルダ構成はこんな感じ。

f:id:sho322:20140808000107j:plain

XMLを読み込むクラスはこちらになります。

XmlReader.java

package reader;

import java.io.IOException;

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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XmlReader {
	public void domRead(String file) throws SAXException, IOException, ParserConfigurationException {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = factory.newDocumentBuilder();
		Document document = documentBuilder.parse(file);

		Element root = document.getDocumentElement();

		//ルート要素のノード名を取得する
		System.out.println("ノード名:" +root.getNodeName());

		//ルート要素の属性を取得する
		System.out.println("ルート要素の属性:" + root.getAttribute("name"));

		//ルート要素の子ノードを取得する
		NodeList rootChildren = root.getChildNodes();

		System.out.println("子要素の数:" + rootChildren.getLength());
		System.out.println("------------------");

		for(int i=0; i < rootChildren.getLength(); i++) {
			Node node = rootChildren.item(i);

			if (node.getNodeType() == Node.ELEMENT_NODE) {
				Element element = (Element)node;
				if (element.getNodeName().equals("person")) {
					System.out.println("名前:" + element.getAttribute("name"));
					NodeList personChildren = node.getChildNodes();

					for (int j=0; j < personChildren.getLength(); j++) {
						Node personNode = personChildren.item(j);
						if (personNode.getNodeType() == Node.ELEMENT_NODE) {

							if (personNode.getNodeName().equals("age")) {
								System.out.println("年齢:" + personNode.getTextContent());
							} else if (personNode.getNodeName().equals("interest")) {
								System.out.println("趣味:" + personNode.getTextContent());
							}

						}
					}
					System.out.println("------------------");
				}
			}


		}


	}
}

こいつをMainクラスで使ってみます。

package action;

import reader.XmlReader;

public class Main {
	public static void main(String[] args) throws Exception {
		XmlReader reader = new XmlReader();
		reader.domRead("sample.xml");
	}
}

結果はこうなります。

ノード名:persons
ルート要素の属性:my friend
子要素の数:5
------------------
名前:yoshida
年齢:28
趣味:basketball
------------------
名前:yamada
年齢:26
趣味:baseball
------------------

今回参考にしたのはこの書籍です。
開発に必要なサンプルはだいたい載っています。
Java逆引きレシピ