「JavaでXMLファイルを読み込みたいけど、どうすればいいの?」
こんな疑問を持っていませんか?
実は、JavaにはXMLを扱うための便利な機能が標準で用意されています。
この記事では、JavaでXMLを読み書きする方法を、実践的なコード例とともに分かりやすく解説していきます。
JavaでXMLを扱う3つの主要な方法

それぞれの特徴を知ろう
JavaでXMLを操作するには、主に3つのアプローチがあります。
1. DOM(Document Object Model)
XMLファイル全体をメモリに読み込んで、ツリー構造として扱う方法です。
小〜中規模のファイルに適しており、読み書き両方が簡単にできます。
2. SAX(Simple API for XML)
XMLファイルを上から順番に読み込んでいく方法です。
メモリ効率が良く、大きなファイルの処理に向いています。
3. StAX(Streaming API for XML)
SAXに似ていますが、より柔軟に読み込みを制御できる方式です。
Java 6以降で標準搭載されており、現代的なアプローチとして人気があります。
それぞれに長所と短所があるので、用途に応じて使い分けましょう。
DOM方式でXMLを読み込む方法
DOMの基本的な流れ
DOMは最も直感的に使える方法です。
XMLファイル全体を一度メモリに読み込み、ツリー構造として操作できます。
実装の手順
ステップ1:必要なクラスをインポート
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
これらは全てJavaの標準ライブラリに含まれているので、追加のインストールは不要です。
ステップ2:XMLファイルを読み込む
DocumentBuilderFactoryを使って、XMLファイルをパースします。
パースとは、XMLの文字列をプログラムで扱える形に変換することですね。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("sample.xml");
たった3行で読み込みが完了します。
ステップ3:要素を取得する
getElementByTagNameメソッドで、特定のタグを持つ要素を取得できます。
NodeList nodeList = document.getElementsByTagName("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
String title = element.getElementsByTagName("title")
.item(0)
.getTextContent();
System.out.println("タイトル: " + title);
}
このコードは、すべての<book>タグから<title>の内容を取り出しています。
DOMのメリットとデメリット
メリット:
- コードが分かりやすい
- 要素の追加・削除・変更が簡単
- ランダムアクセスが可能
デメリット:
- 大きなファイルではメモリを大量に消費する
- ファイル全体の読み込みに時間がかかる
100MB以下のファイルなら、DOMで問題なく処理できますよ。
SAX方式でXMLを効率的に読む
SAXが活躍する場面
SAXは、イベント駆動型のパーサーです。
XMLを読み進めながら、タグの開始や終了といったイベントに反応して処理を行います。
大容量のXMLファイルや、一部のデータだけが必要な場合に最適です。
SAXの実装例
ステップ1:ハンドラークラスを作成
DefaultHandlerクラスを継承して、独自のハンドラーを作ります。
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
public class BookHandler extends DefaultHandler {
private StringBuilder currentValue = new StringBuilder();
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) {
currentValue.setLength(0);
if (qName.equals("book")) {
String isbn = attributes.getValue("isbn");
System.out.println("ISBN: " + isbn);
}
}
@Override
public void characters(char[] ch, int start, int length) {
currentValue.append(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName) {
if (qName.equals("title")) {
System.out.println("タイトル: " + currentValue.toString());
}
}
}
このハンドラーは、タグの開始・内容・終了それぞれで処理を行います。
ステップ2:パーサーを実行
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
BookHandler handler = new BookHandler();
parser.parse("sample.xml", handler);
SAXは順次処理なので、メモリ使用量が少なく済むんですね。
SAXの注意点
一度読み飛ばした部分には戻れません。
そのため、データの構造を事前に理解しておく必要があります。
また、コードがやや複雑になりがちなので、小規模なファイルではDOMの方が適しているでしょう。
StAX方式で柔軟に読み込む

StAXの特徴
StAXは、SAXの効率性とDOMの使いやすさを両立した方式です。
Java 6以降では、javax.xml.streamパッケージとして標準で提供されています。
プルパース方式なので、必要な時に必要なだけデータを取得できるのが強みですね。
XMLStreamReaderを使った実装
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import java.io.FileInputStream;
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(
new FileInputStream("sample.xml")
);
while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamReader.START_ELEMENT) {
if (reader.getLocalName().equals("title")) {
String title = reader.getElementText();
System.out.println("タイトル: " + title);
}
}
}
reader.close();
whileループで自分のペースで読み進められるのが便利です。
StAXのメリット
- メモリ効率が良い(SAX並み)
- コードが書きやすい(DOM寄り)
- 双方向の読み書きに対応
- エラーハンドリングがシンプル
モダンなJava開発では、StAXを選ぶケースが増えています。
JavaでXMLファイルを作成する方法
DOMでXMLを書き出す
XMLファイルを新規作成する場合も、DOMが便利です。
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 java.io.File;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
// ルート要素を作成
Element root = document.createElement("bookstore");
document.appendChild(root);
// 子要素を追加
Element book = document.createElement("book");
book.setAttribute("isbn", "978-4-12345-678-9");
root.appendChild(book);
Element title = document.createElement("title");
title.setTextContent("Javaプログラミング入門");
book.appendChild(title);
// ファイルに書き出し
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File("output.xml"));
transformer.transform(source, result);
このコードで、構造化されたXMLファイルを簡単に作成できます。
インデントを整える
デフォルトでは、作成されるXMLに改行やインデントがありません。
見やすくするには、以下の設定を追加しましょう。
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
これで、きれいに整形されたXMLが出力されます。
XPathで効率的に要素を検索する
XPathとは何か
XPathは、XML文書内の要素を指定するための言語です。
階層構造を持つXMLから、特定の要素を簡単に取り出せます。
JavaでXPathを使う
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathConstants;
import org.w3c.dom.NodeList;
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
// すべてのtitleタグを取得
String expression = "//book/title";
NodeList nodeList = (NodeList) xpath.evaluate(
expression,
document,
XPathConstants.NODESET
);
for (int i = 0; i < nodeList.getLength(); i++) {
System.out.println(nodeList.item(i).getTextContent());
}
XPathを使えば、複雑な条件検索も簡単に実現できますよ。
よく使うXPath表現
//book– すべてのbookタグ/bookstore/book[1]– 最初のbookタグ//book[@isbn]– isbn属性を持つbookタグ//book[price>1000]– 価格が1000円超のbookタグ
XPathを覚えると、XML操作が格段に楽になります。
エラーハンドリングのベストプラクティス
適切な例外処理
XML操作では、様々な例外が発生する可能性があります。
主な例外と対処方法を押さえておきましょう。
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("sample.xml");
} catch (ParserConfigurationException e) {
System.err.println("パーサーの設定エラー: " + e.getMessage());
} catch (SAXException e) {
System.err.println("XML解析エラー: " + e.getMessage());
} catch (IOException e) {
System.err.println("ファイル読み込みエラー: " + e.getMessage());
}
それぞれの例外に応じた適切なメッセージを表示することが重要です。
バリデーション(妥当性検証)
XMLが正しい構造になっているか検証する機能もあります。
factory.setValidating(true);
factory.setNamespaceAware(true);
これにより、不正なXMLを早期に発見できますね。
外部ライブラリでさらに便利に
JDOM – シンプルで使いやすい
JDOMは、標準APIよりも直感的に使えるライブラリです。
Javaらしいオブジェクト指向の設計になっています。
SAXBuilder builder = new SAXBuilder();
Document document = builder.build("sample.xml");
Element root = document.getRootElement();
List<Element> books = root.getChildren("book");
コード量が減り、可読性も向上します。
dom4j – 高機能で柔軟
dom4jは、XPath、XSLT、XML Schemaなど、高度な機能を網羅したライブラリです。
企業システムでよく採用されています。
Jackson – JSONとの相互変換
JacksonはJSON処理で有名ですが、XMLにも対応しています。
XMLとJavaオブジェクトを簡単に相互変換できるのが魅力ですね。
パフォーマンスを意識した実装
ファイルサイズに応じた方式選択
小規模(10MB未満): DOMがおすすめ
中規模(10〜100MB): StAXが最適
大規模(100MB以上): SAXを検討
この目安を参考に、適切な方式を選びましょう。
メモリ使用量の監視
大量のXMLを処理する場合は、メモリリークに注意が必要です。
使い終わったオブジェクトは、適切にクローズしましょう。
try (FileInputStream fis = new FileInputStream("sample.xml")) {
XMLStreamReader reader = factory.createXMLStreamReader(fis);
// 処理
} catch (Exception e) {
e.printStackTrace();
}
try-with-resources文を使えば、自動的にリソースが解放されます。
キャッシュの活用
同じXMLファイルを何度も読み込む場合は、キャッシュを検討しましょう。
一度読み込んだDocumentオブジェクトを保持しておくことで、処理速度が向上します。
セキュリティ上の注意点
XXE攻撃への対策
XXE(XML External Entity)攻撃は、XMLの外部エンティティ機能を悪用した攻撃です。
これを防ぐには、外部エンティティの読み込みを無効化します。
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
セキュリティは最初から考慮することが大切ですね。
信頼できないXMLの処理
外部から受け取ったXMLを処理する際は、特に慎重になりましょう。
入力値の検証やサイズ制限を設けることで、リスクを軽減できます。
よくあるトラブルと解決方法

Q. 文字化けが発生する
XMLファイルのエンコーディング設定を確認しましょう。
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
UTF-8を明示的に指定することで、日本語の文字化けを防げます。
Q. メモリ不足エラーが出る
処理するXMLファイルが大きすぎる可能性があります。
DOMからStAXまたはSAXへの切り替えを検討してください。
Q. 名前空間の扱い方が分からない
名前空間を使用する場合は、以下の設定が必要です。
factory.setNamespaceAware(true);
これにより、名前空間付きの要素を正しく扱えるようになります。
まとめ:JavaでXMLを使いこなそう
JavaでXMLを扱う方法について、基礎から実践まで解説してきました。
適切な方式を選ぶことで、効率的なXML処理が実現できます。
この記事の重要ポイント:
- DOMは小規模ファイル向けで、使いやすさが魅力
- SAXは大規模ファイル向けで、メモリ効率に優れる
- StAXは両者の長所を併せ持つ現代的な選択肢
- XPathを使えば、複雑な検索も簡単に実現できる
- セキュリティ対策は必須(XXE攻撃への備え)
- 外部ライブラリを使えば、さらに開発効率が向上する
まずは小さなXMLファイルで、DOMを使った読み書きから始めてみましょう。
実際にコードを動かしながら学ぶことで、JavaでのXML操作が身についていきますよ。


コメント