XML

Java – DOMを利用したXML操作についてわかりやすく解説

JavaのDOM(Document Object Model)は、XML文書をツリー構造としてメモリ上に読み込み、操作するためのAPIです。

DocumentBuilderを使用してXMLをパースし、Documentオブジェクトを生成します。

このオブジェクトを通じて、ノードの追加、削除、更新、検索が可能です。

例えば、getElementsByTagNameで特定のタグを取得し、createElementで新しい要素を追加できます。

操作後はTransformerを使ってXMLを保存します。

DOMは柔軟性が高い一方、大規模なXMLではメモリ消費が増える点に注意が必要です。

JavaでDOMを利用する準備

JavaでDOM(Document Object Model)を利用してXMLを操作するためには、いくつかの準備が必要です。

以下の手順に従って、環境を整えましょう。

必要なライブラリのインポート

Javaでは、XMLを操作するためにjavax.xml.parsersパッケージとorg.w3c.domパッケージを使用します。

これらのライブラリをインポートすることで、DOMを利用したXMLの読み込みや操作が可能になります。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;
import java.io.File;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import java.io.IOException;

XMLファイルの準備

DOMを利用するためには、操作対象となるXMLファイルが必要です。

以下のようなサンプルXMLファイルを作成し、プロジェクトのルートディレクトリに保存します。

ファイル名はsample.xmlとします。

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book>
        <title>Java入門</title>
        <author>山田太郎</author>
        <price>3000</price>
    </book>
    <book>
        <title>Python入門</title>
        <author>佐藤花子</author>
        <price>2500</price>
    </book>
</books>

環境設定

Javaの開発環境(IDE)を用意し、上記のXMLファイルとインポート文を含むJavaファイルを作成します。

以下のようにApp.javaというファイル名で保存します。

public class App {
    public static void main(String[] args) {
        // XMLファイルのパスを指定
        String filePath = "sample.xml";
        
        try {
            // DocumentBuilderFactoryのインスタンスを取得
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // DocumentBuilderのインスタンスを取得
            DocumentBuilder builder = factory.newDocumentBuilder();
            // XMLファイルを読み込む
            Document document = builder.parse(new File(filePath));
            
            // ルート要素を取得
            Element root = document.getDocumentElement();
            System.out.println("ルート要素: " + root.getNodeName());
            
            // book要素のリストを取得
            NodeList bookList = document.getElementsByTagName("book");
            System.out.println("書籍の数: " + bookList.getLength());
            
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
    }
}

上記のコードを実行すると、以下のような出力が得られます。

ルート要素: books
書籍の数: 2

このように、JavaでDOMを利用するための準備が整いました。

次のステップでは、XMLデータの操作について解説します。

XMLの読み込みとパース

XMLファイルを読み込み、DOMを利用してパース(解析)する方法について解説します。

これにより、XMLデータをプログラム内で操作できるようになります。

XMLファイルの読み込み

前回の準備で作成したApp.javaを基に、XMLファイルを読み込む方法を詳しく見ていきます。

以下のコードは、XMLファイルを読み込み、DOMツリーを構築する部分です。

public class App {
    public static void main(String[] args) {
        // XMLファイルのパスを指定
        String filePath = "sample.xml";
        
        try {
            // DocumentBuilderFactoryのインスタンスを取得
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // DocumentBuilderのインスタンスを取得
            DocumentBuilder builder = factory.newDocumentBuilder();
            // XMLファイルを読み込む
            Document document = builder.parse(new File(filePath));
            
            // ルート要素を取得
            Element root = document.getDocumentElement();
            System.out.println("ルート要素: " + root.getNodeName());
            
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
    }
}

パース処理の流れ

  1. DocumentBuilderFactoryのインスタンスを取得: XMLをパースするためのファクトリークラスを取得します。
  2. DocumentBuilderのインスタンスを取得: XMLを読み込むためのビルダーを取得します。
  3. XMLファイルを読み込む: parseメソッドを使用して、指定したXMLファイルを読み込み、DOMツリーを構築します。
  4. ルート要素の取得: getDocumentElementメソッドを使用して、XMLのルート要素を取得します。

XMLデータの確認

XMLファイルを正しく読み込んだか確認するために、ルート要素の名前を出力します。

上記のコードを実行すると、以下のような出力が得られます。

ルート要素: books

エラーハンドリング

XMLの読み込み中にエラーが発生する可能性があります。

以下の例外をキャッチして、エラーメッセージを表示します。

  • ParserConfigurationException: パーサーの設定に問題がある場合。
  • SAXException: XMLの構文に問題がある場合。
  • IOException: ファイルの入出力に問題がある場合。

このようにして、XMLファイルを読み込み、DOMツリーを構築することができました。

次のステップでは、XMLデータの操作方法について詳しく解説します。

XMLデータの操作

XMLデータを操作するためには、DOMツリーを利用して要素の取得、変更、追加、削除を行います。

ここでは、XMLデータの操作方法について詳しく解説します。

要素の取得

XMLデータから特定の要素を取得するには、getElementsByTagNameメソッドを使用します。

以下のコードでは、すべてのbook要素を取得し、それぞれのタイトルを出力します。

public class App {
    public static void main(String[] args) {
        String filePath = "sample.xml";
        
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new File(filePath));
            
            // book要素のリストを取得
            NodeList bookList = document.getElementsByTagName("book");
            
            // 各book要素のタイトルを出力
            for (int i = 0; i < bookList.getLength(); i++) {
                Element book = (Element) bookList.item(i);
                String title = book.getElementsByTagName("title").item(0).getTextContent();
                System.out.println("書籍タイトル: " + title);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上記のコードを実行すると、以下のような出力が得られます。

書籍タイトル: Java入門
書籍タイトル: Python入門

要素の変更

特定の要素の内容を変更するには、setTextContentメソッドを使用します。

以下のコードでは、最初のbook要素のタイトルを変更します。

public class App {
    public static void main(String[] args) {
        String filePath = "sample.xml";
        
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new File(filePath));
            
            NodeList bookList = document.getElementsByTagName("book");
            Element firstBook = (Element) bookList.item(0);
            firstBook.getElementsByTagName("title").item(0).setTextContent("Java完全ガイド");
            
            // 変更後のタイトルを出力
            String updatedTitle = firstBook.getElementsByTagName("title").item(0).getTextContent();
            System.out.println("変更後の書籍タイトル: " + updatedTitle);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
変更後の書籍タイトル: Java完全ガイド

要素の追加

新しい要素を追加するには、createElementメソッドを使用します。

以下のコードでは、新しいbook要素を追加します。

public class App {
    public static void main(String[] args) {
        String filePath = "sample.xml";
        
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new File(filePath));
            
            Element root = document.getDocumentElement();
            
            // 新しいbook要素を作成
            Element newBook = document.createElement("book");
            Element newTitle = document.createElement("title");
            newTitle.setTextContent("C++入門");
            newBook.appendChild(newTitle);
            
            // ルート要素に新しいbook要素を追加
            root.appendChild(newBook);
            
            System.out.println("新しい書籍が追加されました。");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

要素の削除

要素を削除するには、removeChildメソッドを使用します。

以下のコードでは、最初のbook要素を削除します。

public class App {
    public static void main(String[] args) {
        String filePath = "sample.xml";
        
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new File(filePath));
            
            NodeList bookList = document.getElementsByTagName("book");
            Element firstBook = (Element) bookList.item(0);
            
            // ルート要素から最初のbook要素を削除
            document.getDocumentElement().removeChild(firstBook);
            
            System.out.println("最初の書籍が削除されました。");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

このように、DOMを利用してXMLデータの要素を取得、変更、追加、削除する方法を学びました。

次のステップでは、XMLの保存方法について解説します。

XMLの保存

XMLデータを操作した後、変更を保存する方法について解説します。

DOMを利用してXMLを保存するには、Transformerクラスを使用します。

以下の手順でXMLデータを保存する方法を見ていきましょう。

XMLの保存手順

  1. TransformerFactoryのインスタンスを取得: XMLを保存するためのファクトリークラスを取得します。
  2. Transformerのインスタンスを取得: XMLをファイルに書き込むためのトランスフォーマーを取得します。
  3. DOMツリーをファイルに書き込む: transformメソッドを使用して、DOMツリーを指定したファイルに書き込みます。

以下のコードは、XMLデータを操作した後、変更を保存する例です。

最初に新しいbook要素を追加し、その後XMLファイルに保存します。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.io.File;
public class App {
    public static void main(String[] args) {
        String filePath = "sample.xml";
        
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new File(filePath));
            
            // 新しいbook要素を作成
            Element newBook = document.createElement("book");
            Element newTitle = document.createElement("title");
            newTitle.setTextContent("C++入門");
            newBook.appendChild(newTitle);
            
            // ルート要素に新しいbook要素を追加
            document.getDocumentElement().appendChild(newBook);
            
            // XMLを保存するためのTransformerを取得
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            
            // DOMツリーをファイルに書き込む
            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(new File(filePath));
            transformer.transform(source, result);
            
            System.out.println("XMLファイルが保存されました。");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上記のコードを実行すると、以下のような出力が得られます。

XMLファイルが保存されました。

XMLファイルの内容確認

実行後、sample.xmlファイルを確認すると、新しいbook要素が追加されていることがわかります。

以下のように、C++入門というタイトルの書籍が追加されています。

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book>
        <title>Java入門</title>
        <author>山田太郎</author>
        <price>3000</price>
    </book>
    <book>
        <title>Python入門</title>
        <author>佐藤花子</author>
        <price>2500</price>
    </book>
    <book>
        <title>C++入門</title>
    </book>
</books>

このように、DOMを利用してXMLデータを操作した後、変更をファイルに保存する方法を学びました。

DOM操作の実践例

ここでは、Javaを使用してDOMを利用したXML操作の実践例を紹介します。

具体的なシナリオとして、書籍情報を管理するXMLファイルを作成し、書籍の追加、更新、削除を行うプログラムを示します。

シナリオの設定

以下の要件に基づいて、書籍情報を管理するXMLファイルを操作します。

  • 書籍情報には、タイトル、著者、価格が含まれます。
  • 新しい書籍を追加する機能。
  • 既存の書籍の情報を更新する機能。
  • 書籍を削除する機能。
  • 最終的に、変更をXMLファイルに保存する機能。

以下のコードは、上記の要件を満たすプログラムの例です。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.io.File;
public class App {
    public static void main(String[] args) {
        String filePath = "sample.xml";
        
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new File(filePath));
            
            // 新しい書籍を追加
            addBook(document, "C++入門", "田中一郎", "3500");
            
            // 書籍情報を更新
            updateBookPrice(document, "Java入門", "3200");
            
            // 書籍を削除
            deleteBook(document, "Python入門");
            
            // XMLを保存
            saveXML(document, filePath);
            
            System.out.println("XMLファイルが更新されました。");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    // 書籍を追加するメソッド
    private static void addBook(Document document, String title, String author, String price) {
        Element newBook = document.createElement("book");
        
        Element newTitle = document.createElement("title");
        newTitle.setTextContent(title);
        newBook.appendChild(newTitle);
        
        Element newAuthor = document.createElement("author");
        newAuthor.setTextContent(author);
        newBook.appendChild(newAuthor);
        
        Element newPrice = document.createElement("price");
        newPrice.setTextContent(price);
        newBook.appendChild(newPrice);
        
        document.getDocumentElement().appendChild(newBook);
    }
    
    // 書籍の価格を更新するメソッド
    private static void updateBookPrice(Document document, String title, String newPrice) {
        NodeList bookList = document.getElementsByTagName("book");
        
        for (int i = 0; i < bookList.getLength(); i++) {
            Element book = (Element) bookList.item(i);
            String currentTitle = book.getElementsByTagName("title").item(0).getTextContent();
            
            if (currentTitle.equals(title)) {
                book.getElementsByTagName("price").item(0).setTextContent(newPrice);
                break;
            }
        }
    }
    
    // 書籍を削除するメソッド
    private static void deleteBook(Document document, String title) {
        NodeList bookList = document.getElementsByTagName("book");
        
        for (int i = 0; i < bookList.getLength(); i++) {
            Element book = (Element) bookList.item(i);
            String currentTitle = book.getElementsByTagName("title").item(0).getTextContent();
            
            if (currentTitle.equals(title)) {
                document.getDocumentElement().removeChild(book);
                break;
            }
        }
    }
    
    // XMLを保存するメソッド
    private static void saveXML(Document document, String filePath) throws Exception {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        
        DOMSource source = new DOMSource(document);
        StreamResult result = new StreamResult(new File(filePath));
        transformer.transform(source, result);
    }
}

上記のコードを実行すると、以下のような出力が得られます。

XMLファイルが更新されました。

XMLファイルの内容確認

実行後、sample.xmlファイルを確認すると、以下のように書籍情報が更新されていることがわかります。

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book>
        <title>Java入門</title>
        <author>山田太郎</author>
        <price>3200</price>
    </book>
    <book>
        <title>C++入門</title>
        <author>田中一郎</author>
        <price>3500</price>
    </book>
</books>

この実践例を通じて、Javaを使用してDOMを利用したXML操作の基本的な流れを学びました。

書籍の追加、更新、削除を行い、最終的に変更をXMLファイルに保存する方法を理解できたと思います。

まとめ

この記事では、Javaを使用してDOMを利用したXML操作の基本から実践例までを詳しく解説しました。

XMLファイルの読み込み、データの取得や変更、要素の追加や削除、そして最終的な保存方法について具体的なコードを通じて説明しました。

これを機に、実際のプロジェクトでXMLデータを効果的に扱うためのスキルを身につけてみてください。

関連記事

Back to top button