【Java】XMLファイルの扱い方について(読み込み・書き込み方法)

Java

はじめに

今回はJavaで「XMLファイル」の読み込み・書き込み方法について勉強したことを記載していきたいと思います。

 

XMLファイルとは

XMLファイル(eXtensible Markup Language)とは、XMLという形式/ルールで書かれたファイルのことです。

・テキストで記載された文書である
・XML 宣言をすること
 <?xml version=”1.0″?>
・中身をタグで囲み、タグ内でデータを記載していくこと

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<blogs>
    <blog>
        <name>SEもりのLog</name>
        <auther>もり</auther>
    </blog>
    <blog>
        <name>Test</name> 
        <auther>test</auther>
    </blog>
</blogs>

 

DOMを使用したXMLの読み込み

javax.xml.parsers.DocumentBuilderを使用することでXMLファイルからファイルデータを読み込むことができます。DocumentBuilderはDocumentBuilderFactoryから取得して使用します。

 

import

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
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 org.w3c.dom.Node;

 

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        // XMLを読み込み
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = factory.newDocumentBuilder();
        Document document = documentBuilder.parse("test.xml");

        // 要素のリストを取得
        NodeList nodeList = document.getElementsByTagName("blog");
        
        // 要素の中身を一つずつ取得
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);

            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element) node;
                System.out.println(element.getElementsByTagName("name").item(0).getTextContent());
                System.out.println(element.getElementsByTagName("auther").item(0).getTextContent());
            }
        }
    }

 

DOMを使用したXMLファイルの作成

読み込みと同様にjavax.xml.parsers.DocumentBuilderを使用してXMLを作成することができます。ファイル出力はTransformerを使用して出力形式をXML指定しファイル出力します。

 

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        // XMLを読み込み
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = factory.newDocumentBuilder();

        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty("method", "xml");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");

        Document document = documentBuilder.newDocument();

        // XMLファイルの作成
        Element blogs = document.createElement("blogs");
        document.appendChild(blogs);
        Element blog = document.createElement("blog");
        blogs.appendChild(blog);
        Element name = document.createElement("name");
        name.setAttribute("name", "ブログ名");
        name.appendChild(document.createTextNode("SEもりのLog"));
        blog.appendChild(name);
        Element auther = document.createElement("auther");
        auther.appendChild(document.createTextNode("もり"));
        blog.appendChild(auther);

        BufferedWriter writer = null;

        try {

            writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test.xml")));
            transformer.transform(new DOMSource(document), new StreamResult(writer));

        } finally {

            if (writer != null) {
                writer.close();
            }
        }
    }

 

StAXを使用してXMLファイルを読み込む

javax.xml.stream.XMLStreamReaderを使用することでもXMLファイルを読み込むことが可能です。

 

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        try (InputStream input = new FileInputStream("test.xml")) {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader reader = factory.createXMLStreamReader(input);

            while (reader.hasNext()) {
                switch (reader.getEventType()) {
                    case XMLStreamConstants.CHARACTERS:
                        System.out.println(reader.getText());
                        break;
                    case XMLStreamConstants.START_ELEMENT:
                        System.out.println(reader.getLocalName());
                        break;
                    default:
                }
                reader.next();
            }
            reader.close();;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

StAXを使用してXMLファイルを書き込む

javax.xml.stream.XMLStreamWriterを使用することで、XMLを作成することが可能です。

 

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        XMLOutputFactory factory = XMLOutputFactory.newInstance();

        StringWriter strWriter = new StringWriter();
        XMLStreamWriter writer = factory.createXMLStreamWriter(strWriter);

        writer.writeStartDocument("UTF-8", "1.0");
        writer.writeStartElement("blogs");
        writer.writeStartElement("blog");
        writer.writeStartElement("name");
        writer.writeDTD("SEもりのLog");
        writer.writeEndElement();
        writer.writeStartElement("auther");
        writer.writeDTD("もり");
        writer.writeEndElement();
        writer.writeEndDocument();

        writer.flush();
        writer.close();

        System.out.println(strWriter.toString());
    }

 

ドキュメント

【公式ドキュメント】
Java SE Specifications (oracle.com)

 

最後に

Javaの環境構築は、この記事を参照してみてください。
【開発環境構築】VS CodeでJavaを使用するための環境構築を実施する – SEもりのLog (selifemorizo.com)

以上、ログになります。
これからも継続していきましょう!!

Javaサーバーサイド関連
おすすめIT本
良いコード/悪いコードで学ぶ設計入門

「ITエンジニア本大賞2023」技術書部門で大賞を受賞した本です。
・コードの可読性
・普段意識したほうが良いこと
・リファクタリング考え方
等、普段のコードを設計する際に意識することが書かれています。
コードのあるべき姿に迷ったら一度読んでみると良い本です。

仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん

Dockerって何?となったときに私が最初に読んだ本です。
Dockerがどんな仕組みで動いているのか、コマンドでは何を命令しているのかを理解できるように、イラストを多用して説明しています。

1冊ですべて身につくJavaScript入門講座

「ITエンジニア本大賞2024」技術書部門で大賞を受賞した本です。
私が次に読もうと思っている本なのでおすすめとして挙げておきたいと思います。

コメント

タイトルとURLをコピーしました