1. 序章

このチュートリアルでは、StAXを使用してXMLファイルを解析する方法を説明します。 単純なXMLパーサーを実装し、例を使用してどのように機能するかを確認します。

2. StAXによる解析

StAXは、JavaにあるいくつかのXMLライブラリの1つです。 これはJava6.StAX以降のJDKに含まれているメモリ効率の高いライブラリです。StAXはXML全体をメモリにロードしません。 代わりに、フォワードのみの方法でストリームからデータをプルします。 ストリームはXMLEventReaderオブジェクトによって読み取られます。

3. XMLEventReaderクラス

StAXでは、開始タグまたは終了タグはすべてイベントです。 XMLEventReaderは、XMLファイルをイベントのストリームとして読み取ります。また、XMLの解析に必要なメソッドも提供します。 最も重要な方法は次のとおりです。

  • isStartElement():現在のイベントが StartElement (開始タグ)であるかどうかを確認します
  • isEndElement():現在のイベントが EndElement (終了タグ)であるかどうかを確認します
  • asCharacters():現在のイベントを文字として返します
  • getName():現在のイベントの名前を取得します
  • getAttributes():現在のイベントの属性のIteratorを返します

4. 単純なXMLパーサーの実装

言うまでもなく、XMLを解析するための最初のステップはそれを読み取ることです。 ファイルを読み取るためのXMLEventReaderを作成するには、XMLInputFactoryが必要です。

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream(path));

XMLEventReader の準備ができたので、 nextEvent()を使用してストリームを進めます。

while (reader.hasNext()) {
    XMLEvent nextEvent = reader.nextEvent();
}

次に、最初に目的の開始タグを見つける必要があります。

if (nextEvent.isStartElement()) {
    StartElement startElement = nextEvent.asStartElement();
    if (startElement.getName().getLocalPart().equals("desired")) {
        //...
    }
}

したがって、属性とデータを読み取ることができます。

String url = startElement.getAttributeByName(new QName("url")).getValue();
String name = nextEvent.asCharacters().getData();

終了タグに到達したかどうかを確認することもできます。

if (nextEvent.isEndElement()) {
    EndElement endElement = nextEvent.asEndElement();
}

5. 構文解析の例

理解を深めるために、サンプルXMLファイルでパーサーを実行してみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<websites>
    <website url="https://baeldung.com">
        <name>Baeldung</name>
        <category>Online Courses</category>
        <status>Online</status>
    </website>
    <website url="http://example.com">
        <name>Example</name>
        <category>Examples</category>
        <status>Offline</status>
    </website>
    <website url="http://localhost:8080">
        <name>Localhost</name>
        <category>Tests</category>
        <status>Offline</status>
    </website>
</websites>

XMLを解析し、すべてのデータをwebsiteというエンティティオブジェクトのリストに保存しましょう。

while (reader.hasNext()) {
    XMLEvent nextEvent = reader.nextEvent();
    if (nextEvent.isStartElement()) {
        StartElement startElement = nextEvent.asStartElement();
        switch (startElement.getName().getLocalPart()) {
            case "website":
                website = new WebSite();
                Attribute url = startElement.getAttributeByName(new QName("url"));
                if (url != null) {
                    website.setUrl(url.getValue());
                }
                break;
            case "name":
                nextEvent = reader.nextEvent();
                website.setName(nextEvent.asCharacters().getData());
                break;
            case "category":
                nextEvent = reader.nextEvent();
                website.setCategory(nextEvent.asCharacters().getData());
                break;
            case "status":
                nextEvent = reader.nextEvent();
                website.setStatus(nextEvent.asCharacters().getData());
                break;
        }
    }
    if (nextEvent.isEndElement()) {
        EndElement endElement = nextEvent.asEndElement();
        if (endElement.getName().getLocalPart().equals("website")) {
            websites.add(website);
        }
    }
}

各Webサイトのすべてのプロパティを取得するには、各イベントの startElement.getName()。getLocalPart()を確認します。 次に、それに応じて対応するプロパティを設定します。

Webサイトの終了要素に到達すると、エンティティが完了したことがわかるので、エンティティをwebsiteリストに追加します。

6. 結論

このチュートリアルでは、StAXライブラリを使用してXMLファイルを解析する方法を学びました。

サンプルのXMLファイルと完全なパーサーコードは、いつものようにGithubで入手できます。