【Java入門】XMLファイルの操作(読み込み)

スポンサーリンク

こんにちは!しーま(@s59shima)です。

いつもブログをご覧いただきありがとうございます。

今回は、こんな悩みや疑問のある方に向けて記事を書きました。

読書
読書

XMLファイルの読み込みを行う方法について知りたいな。階層とか要素の取得とか難しそうだな。

JavaでXMLを読み込む方法について詳しく知りたい方にはおすすめの記事です。

JavaでXMLファイルを読み込むには

XMLファイルを読み込むための方法は色々あります。それぞれのAPIにはメリット・デメリットがあります。よって、目的によって使い分ける必要があります。

本記事で活用するAPIについて

  • DOM(Document Object Model)
    • メリット:要素の追加・削除が可能
    • デメリット:メモリ消費量が多い
  • SAX(Simple API for XML)
    • メリット:メモリ消費量が少なく、読み込み処理が高速
    • デメリット:要素の追加・削除が不可

使用するXML

<?xml version="1.0" encoding="UTF-8"?>
<customers>
 <customer id="1000">
  <name>
   <firstname>taro</firstname>
   <lastname>sato</lastname>
  </name>
  <programming>Java</programming>
 </customer>
</customers>

DOM – API

XMLをオブジェクトのツリー構造で読み込みます。javax.xml.parsers.DocumentBuilderクラスを使用します。

メリット

  • 要素の追加・削除が可能

デメリット

  • メモリ消費量が多い

サンプルコード

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

class Sample4 {
    public static void main( String[] args ) {
        try ( InputStream is = Files.newInputStream(Paths.get( "D:\ws_java\sample.xml" ))) {
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Node root = builder.parse( is );
            readXml( root );
        } catch ( ParserConfigurationException | IOException | SAXException e ) {
            System.out.println( e.getMessage() );
        }
    }
    private static void readXml( Node node ) {
        Node child = node.getFirstChild();
        while( child != null ) {
            System.out.println( child.getNodeName() + " = " + child.getNodeValue() );
            NamedNodeMap attributes = child.getAttributes();
            if ( attributes != null ) {
                for ( int index = 0; index < attributes.getLength(); index++ ) {
                    Node attribute = attributes.item( index );
                    System.out.print( "Attribute: " );
                    System.out.println( attribute.getNodeName() + " = " + attribute.getNodeValue() );
                }
            }
            readXml( child );
            child = child.getNextSibling();
        }
    }
}

実行結果

customers = null
#text = 
 
customer = null
Attribute: id = 1000
#text = 
  
name = null
#text = 
   
firstname = null
#text = taro
#text = 
   
lastname = null
#text = sato
#text = 
  
#text = 
  
programming = null
#text = Java
#text = 
 
#text =

SAX – API

XMLファイルを上から順番に読み込んで処理を実行します。javax.xml.parsers.SAXParserとorg.xml.sax.helpers.DefaultHandlerクラスを使用します。

メリット

  • メモリ消費量が少なく、読み込み処理が高速

デメリット

  • 要素の追加・削除が不可

サンプルコード

Sampleクラス

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;

public class Sample {
    public static void main( String[] args ) {
        try ( InputStream is = Files.newInputStream(Paths.get("D:\ws_java\sample.xml")) ) {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            SampleHandler handler = new SampleHandler();
            parser.parse(is, handler);
            parser = factory.newSAXParser();
        } catch ( ParserConfigurationException | SAXException | IOException e ) {
            System.out.println( e.getMessage() );
        }
    }
}

SampleHandlerクラス(DefaultHandlerクラスを継承)

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

public class SampleHandler extends DefaultHandler {
    @Override
    public void startDocument() {
        System.out.println( "start Doc" );
    }

     @Override
    public void endDocument() {
        System.out.println( "end Doc" );
    }
 
    @Override
    public void startElement (String namespaceURI, String localName, String qName, Attributes atts ) {
        if ( atts != null ) {
            for ( int index = 0; index < atts.getLength(); index++ ) {
                System.out.println( "Attribute: " + atts.getQName(index) );
            }
        }
        System.out.println( "Start Element: " + qName );
    }

    @Override
    public void endElement (String namespaceURI, String localName, String qName ) {
        System.out.println( "End Element: " + qName );
    }

    @Override
    public void characters (char[] ch, int start, int length ) {
        String text = new String (ch, start, length );
        System.out.println( "Text: " + text );
    }
}

実行結果

start Doc
Start Element: customers
Text: 
 
Attribute: id
Start Element: customer
Text: 
  
Start Element: name
Text: 
   
Start Element: firstname
Text: taro
End Element: firstname
Text: 
   
Start Element: lastname
Text: sato
End Element: lastname
Text: 
  
End Element: name
Text: 
  
Start Element: programming
Text: Java
End Element: programming
Text: 
 
End Element: customer
Text: 

End Element: customers
end Doc

本記事のまとめ

今回は、XMLファイルの操作(読み込み)について解説しました。

最後まで読んでいただきありがとうございます(*^-^*)

本記事の内容をまとめると以下の通りです。

本記事で活用するAPIについて

  • DOM(Document Object Model)
    • メリット:要素の追加・削除が可能
    • デメリット:メモリ消費量が多い
  • SAX(Simple API for XML)
    • メリット:メモリ消費量が少なく、読み込み処理が高速
    • デメリット:要素の追加・削除が不可

各ファイルの操作方法を紹介

本ブログで紹介する各ファイル操作(読み込み・書き込み)は下記5つ。

おすすめ記事

Javaプログラミングをもう一度本格的に勉強したいっ!」という方へ

逆に、「Javaプログラミング以外を本格的に勉強したいっ!」という方へ

関連記事

Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
タイトルとURLをコピーしました