すずろぐ

人生大逆転を目指す、鈴木俊吾の成長日記

Java XMLをDOMで読み込んで内容を取得するサンプルプログラム

Java

こんにちは、すずしんです。

XMLは、データをシンプルに扱うためのデータ構造です。
非常に使い勝手が良く、Webなどの世界ではよく利用されます。

そのXMLを、Javaで扱う方法について今回は書いてみようと思います。
具体的には、XMLをDOMで読み込んで内容を取得する方法を扱います。

DOMとは?

DOMというのは、XMLを扱うためのAPI仕様の事をいいます。
この仕様では、XMLによって書かれた文書全体をドキュメントと呼びます。
ドキュメントはノードから構成されるノードツリーとなっています。

ドキュメントの取得方法(Java)

Javaでドキュメントを取得するには、主に3つのステップがあります。

ステップ1: DocumentBuilderFactoryクラスのnewInstance()メソッドを使用します。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

ステップ2: DocumentBuiderFactoryのインスタンスからnewDocumentBuilder()メソッドを呼び出します。

DocumentBuilder builder = factory.newDocumentBuilder();

ステップ3: DocumentBuilderのインスタンスからparse()メソッドを呼び出します。

Document document = builder.parse("sample.xml");

ドキュメントの操作方法

ドキュメントを操作するには、まずgetDocumentElement()メソッドでElementノードを取得します。
このElementノードに対して操作メソッドを使います。

Element root = document.getDocumentElement();

その後は、NodeやElementに対する操作が多くなりますが…。
これらで使用できるメソッド群についての詳細はAPIを参照してください。

Node (Java Platform SE 7 )
Element (Java Platform SE 7 )

今回の例で使用するのは、主に以下のメソッドです。

Node
String getNodeName(): ノード名を取得。
NodeList getChildNodes(): このノードの子をすべて含むNodeListを取得。

Element
String getAttribute(String name): 属性を取得。

NodeList
int getLength(): リスト内のノード数を取得。
Node item(int index): リスト内のindex番目の項目を取得。

DOMでXMLを扱うサンプルプログラム

このサンプルで扱うXMLは以下のようになっています。
友達リストのような形です。
これをpersons.xmlとして保存してあります。

<?xml version="1.0" encoding="utf-8" ?>
<persons name="friends">
  <person name="Asakura">
    <gender>Male</gender>
    <age>20</age>
    <interest>Game</interest>
  </person>
  <person name="Kikuchi">
    <gender>Male</gender>
    <age>23</age>
    <interest>Tennis</interest>
  </person>
  <person name="Suzuki">
    <gender>Female</gender>
    <age>19</age>
    <interest>Baseball</interest>
  </person>
</persons>

persons.xmlの内容を取得して、コンソールに取得するサンプルプログラムは以下のようになります。
ここではXMLReaderクラスとしてみました。

package jp.suzushin7.sample;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLReader {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("persons.xml");
        
        Element root = document.getDocumentElement();
        
        System.out.println("Node: " + root.getNodeName());
        System.out.println("name: " + root.getAttribute("name"));
        
        System.out.println("==============================");
        
        NodeList personsNodeList = root.getChildNodes();
        for(int i = 0; i < personsNodeList.getLength(); i++) {
            Node personNode = personsNodeList.item(i);
            if(personNode.getNodeType() == Node.ELEMENT_NODE) {
                Element personElement = (Element)personNode;
                if(personElement.getNodeName().equals("person")) {
                    System.out.println("[" + personElement.getAttribute("name") + "]");
                    NodeList personChildrenNodeList = personElement.getChildNodes();
                    for(int j = 0; j < personChildrenNodeList.getLength(); j++) {
                        Node node = personChildrenNodeList.item(j);
                        if(node.getNodeType() == Node.ELEMENT_NODE) {
                            System.out.println(node.getNodeName() + ": " + node.getTextContent());
                        }
                    }
                }
            }
        }
        
        System.out.println("==============================");
    }
}

実行結果

上記サンプルプログラムを実行すると、以下のような結果が得られます。
確かに、persons.xmlの内容が正しく取得できているのが分かりますね。

Node: persons
name: friends
==============================
[Asakura]
gender: Male
age: 20
interest: Game
[Kikuchi]
gender: Male
age: 23
interest: Tennis
[Suzuki]
gender: Female
age: 19
interest: Baseball
==============================

ひとこと

今回の記事では、JavaでDOMを使ってXMLを扱う方法について書いてみました。
やり方が分かってしまえば、それほど難しいというわけでもなさそうですね。

今回のサンプルプログラムは、XMLの内容を表示するだけの非常にシンプルなものでしたが…。
XMLを扱えるようになると、もっと色々な応用ができると思います。
ぜひ工夫して便利なプログラムを作成してみてくださいね。