java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

org.w3c.domパッケージでXMLファイルを読み込む

投稿日:

最終更新日:2016年09月05日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

今回はXMLファイルの読み込みを試してみました。

XMLを読み込む方法はいくつかあるようですが、今回はDocumentBuilderFactoryを使う方法を試しました。

XMLファイル

読み込むXMLファイルは以下の構成にしました。

students
└student(繰り返し項目)
 ├name
 └age

具体的はファイルの内容は以下です。

XMLファイル

<?xml version="1.0"?>
<students>
  <student>
    <name>name1</name>
    <age>16</age>
  </student>
  <student>
    <name>name2</name>
    <age>17</age>
  </student>
</students>

出力するプログラム

今回作ったプログラムは以下の形式で出力するプログラムです。
name: [name要素の内容]
age: [age要素の内容]

以下はソースと実行結果です。

ソース

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

public class HelloDOM {

    public static void main(String[] args) {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;
        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        Document document = null;
        try {
            document = builder.parse("resource/HelloDOM.xml");
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Element root = document.getDocumentElement();
        NodeList list1 = root.getChildNodes();
        for (int i = 0; i < list1.getLength(); i++) {
            if (list1.item(i).getNodeName().equals("student")) {
                NodeList list2 = list1.item(i).getChildNodes();
                for (int j = 0; j < list2.getLength(); j++) {
                    switch (list2.item(j).getNodeName()) {
                    case "name":
                        System.out.println("name: " + list2.item(j).getTextContent());
                        break;

                    case "age":
                        System.out.println("age: " + list2.item(j).getTextContent());
                        break;
                    }
                }

            }
        }

    }

}

結果

name: name1
age: 16
name: name2
age: 17

DocumentBuilderFactoryを使う場合、static DocumentBuilderFactory newInstance()メソッドを使います。新しいインスタンスを取得することができます。次に、newDocumentBuilder()メソッドでDocumentBuilderのインスタンスを取得します。
DocumentBuilderクラスにはparse(String uri)メソッドが用意されていて、パスを指定することでXMLファイルを読み込むことができます。返却されるものはDocumentクラスのインスタンスです。

目的の出力を実行するために、最初にルート要素を取得します。getDocumentElement()メソッドでElementクラスを取得します。次にgetChildNodes()メソッドにより、NodeListクラスのインスタンスを取得します。NodeListがどのような状態で取得できているのかよくわかりませんでしたが、XML上の要素名はgetNodeName()メソッドで返却されるようです。そのため、getNodeName()メソッドの返却値と要素名を比較しています。”student”と等しい場合に、更にNodeListを取得しています。要素名がnameとageの場合のみ内容を出力するため、switch文を使ってます。getTextContent()メソッドで内容を取得しています。API仕様書によると、「指定されたノードとノードの子孫のテキスト・コンテンツを返します。」とあるため、name要素、age要素が入れ子構造を持っていた場合、違った結果になるのかもしれません。