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();
}
}
}
パース処理の流れ
- DocumentBuilderFactoryのインスタンスを取得: XMLをパースするためのファクトリークラスを取得します。
- DocumentBuilderのインスタンスを取得: XMLを読み込むためのビルダーを取得します。
- XMLファイルを読み込む:
parse
メソッドを使用して、指定したXMLファイルを読み込み、DOMツリーを構築します。 - ルート要素の取得:
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の保存手順
- TransformerFactoryのインスタンスを取得: XMLを保存するためのファクトリークラスを取得します。
- Transformerのインスタンスを取得: XMLをファイルに書き込むためのトランスフォーマーを取得します。
- 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データを効果的に扱うためのスキルを身につけてみてください。