Java を使って XML ファイルを解析する方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

XML ファイルの解析は Java 開発における一般的なタスクです。なぜなら、XML は情報の保存と交換に広く使用されているデータ形式だからです。このチュートリアルでは、Java API を使用して XML ファイルを解析するプロセスを案内し、アプリケーションで XML データを扱うための実用的な例とテクニックを提供します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/FileandIOManagementGroup -.-> java/files("Files") java/FileandIOManagementGroup -.-> java/read_files("Read Files") java/FileandIOManagementGroup -.-> java/io("IO") java/FileandIOManagementGroup -.-> java/stream("Stream") java/SystemandDataProcessingGroup -.-> java/xml_dom4j("XML/Dom4j") subgraph Lab Skills java/files -.-> lab-414100{{"Java を使って XML ファイルを解析する方法"}} java/read_files -.-> lab-414100{{"Java を使って XML ファイルを解析する方法"}} java/io -.-> lab-414100{{"Java を使って XML ファイルを解析する方法"}} java/stream -.-> lab-414100{{"Java を使って XML ファイルを解析する方法"}} java/xml_dom4j -.-> lab-414100{{"Java を使って XML ファイルを解析する方法"}} end

XML ファイル構造のはじめに

XML (Extensible Markup Language、拡張可能マークアップ言語) は、情報を構造化して表現および保存するための方法を提供する、広く使用されているデータ交換形式です。XML ファイルは、要素、属性、およびテキストコンテンツで構成されており、これらが一緒になって階層構造を形成します。

XML 構造の理解

XML ファイルは通常、以下の主要なコンポーネントで構成されています。

  • XML 宣言: これは使用されている XML のバージョンを指定します。通常は <?xml version="1.0" encoding="UTF-8"?> です。
  • 要素: これらは XML ドキュメントの構成要素で、山括弧で囲まれたタグで表されます。例: <book></book>
  • 属性: これらは要素に関する追加情報を提供し、開始タグ内で定義されます。例: <book id="1">
  • テキストコンテンツ: これは要素内に含まれる実際のデータまたは情報です。例: <title>The Catcher in the Rye</title>
  • 階層: XML 要素は入れ子にすることができ、親要素内に子要素が含まれる階層構造を作成します。
graph TD A[XML Document] --> B[XML Declaration] A --> C[Root Element] C --> D[Child Element] D --> E[Attribute] D --> F[Text Content]

XML 名前空間

XML 名前空間は、XML ドキュメント内の要素と属性を一意に識別する方法を提供します。これらは xmlns 属性を使用して定義され、異なる XML 語彙間の名前の衝突を回避するために使用できます。

<book xmlns="http://example.com/books">
  <title>The Catcher in the Rye</title>
  <author>J.D. Salinger</author>
</book>

この例では、xmlns 属性が book 要素とその子要素の名前空間を指定しています。

XML の基本的な構造と概念を理解することで、Java を使用して XML データを解析し、操作する準備がより整うようになります。

Java API を使用した XML ファイルの解析

Java は XML ファイルを解析するためのいくつかの API を提供しており、それぞれに独自の利点と使用例があります。Java で最も一般的に使用される XML 解析 API は以下の通りです。

DOM (Document Object Model、ドキュメントオブジェクトモデル) パーサー

DOM パーサーは、XML ドキュメント全体をツリー構造としてメモリ内に表現します。これにより、XML データのランダムアクセスと操作が可能になりますが、大きなファイルに対してはメモリを大量に消費することがあります。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("example.xml");

SAX (Simple API for XML、XML 用シンプル API) パーサー

SAX パーサーはイベント駆動型のパーサーで、XML ドキュメントを順次処理し、さまざまな解析イベントに対してコールバックをトリガーします。これにより、DOM パーサーよりもメモリ効率が良くなりますが、XML データのランダムアクセスは提供されません。

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("example.xml", new MyXMLHandler());

StAX (Streaming API for XML、XML 用ストリーミング API) パーサー

StAX パーサーはカーソルベースのイベント駆動型パーサーで、SAX と比較してより直感的で柔軟な API を提供します。これにより、XML データをストリーミング方式で読み書きできるため、大きな XML ファイルの処理に適しています。

XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("example.xml"));

XML 解析 API の選択は、XML ファイルのサイズ、ランダムアクセスの必要性、XML 構造の複雑さなど、アプリケーションの具体的な要件によって異なります。

実用的な XML 解析の例

このセクションでは、先ほど説明した Java API を使用して XML ファイルを解析する実用的な例をいくつか見ていきます。

シンプルな XML ファイルの解析

まずは books.xml という名前のシンプルな XML ファイルから始めましょう。

<?xml version="1.0" encoding="UTF-8"?>
<library>
  <book>
    <title>The Great Gatsby</title>
    <author>F. Scott Fitzgerald</author>
    <year>1925</year>
  </book>
  <book>
    <title>To Kill a Mockingbird</title>
    <author>Harper Lee</author>
    <year>1960</year>
  </book>
</library>

DOM パーサーを使用して、このファイルを解析し、書籍情報を抽出することができます。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml");

NodeList bookNodes = document.getElementsByTagName("book");
for (int i = 0; i < bookNodes.getLength(); i++) {
    Node bookNode = bookNodes.item(i);
    System.out.println("Title: " + bookNode.getElementsByTagName("title").item(0).getTextContent());
    System.out.println("Author: " + bookNode.getElementsByTagName("author").item(0).getTextContent());
    System.out.println("Year: " + bookNode.getElementsByTagName("year").item(0).getTextContent());
}

複雑な XML ファイルの解析

次に、名前空間を含むより複雑な XML ファイルを考えてみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<library xmlns="http://example.com/library"
         xmlns:dc="http://purl.org/dc/elements/1.1/">
  <book>
    <dc:title>The Catcher in the Rye</dc:title>
    <dc:creator>J.D. Salinger</dc:creator>
    <dc:date>1951</dc:date>
  </book>
  <book>
    <dc:title>1984</dc:title>
    <dc:creator>George Orwell</dc:creator>
    <dc:date>1949</dc:date>
  </book>
</library>

このファイルを解析し、名前空間付きの要素にアクセスするには、次のコードを使用できます。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml");

NodeList bookNodes = document.getElementsByTagNameNS("http://example.com/library", "book");
for (int i = 0; i < bookNodes.getLength(); i++) {
    Node bookNode = bookNodes.item(i);
    System.out.println("Title: " + bookNode.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "title").item(0).getTextContent());
    System.out.println("Author: " + bookNode.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "creator").item(0).getTextContent());
    System.out.println("Year: " + bookNode.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", "date").item(0).getTextContent());
}

これらの実用的な例を理解することで、Java API を使用して XML ファイルを解析する方法をしっかりと把握できるはずです。

まとめ

このチュートリアルでは、Java API を使用して XML ファイルを解析する方法を学びました。XML ファイル構造の基本を説明し、さまざまな Java 解析アプローチを探り、実践的な例を提供して始める手助けをしました。これらのテクニックを習得することで、Java プロジェクトで XML ファイルからデータを効率的に処理および抽出することができます。