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

1. 前書き

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

2. StAXを使用した解析

StAXは、https://www.baeldung.com/java-xml-libraries [JavaのXMLライブラリ]の1つです。 * Java 6以降、JDKに含まれるメモリ効率の高いライブラリです。* StAXはXML全体をメモリにロードしません。 代わりに、転送専用の方法でストリームからデータをプルします。 ストリームは_XMLEventReader_オブジェクトによって読み取られます。

3. _XMLEventReader_クラス

StAXでは、開始タグまたは終了タグはイベントです。 * _XMLEventReader_は、イベントのストリームとしてXMLファイルを読み取ります。* XMLの解析に必要なメソッドも提供します。 最も重要な方法は次のとおりです。
  • isStartElement():現在のイベントが_StartElement_かどうかを確認します
    (開始タグ)

  • isEndElement():現在のイベントが_EndElement_(end
    tag)

  • asCharacters():現在のイベントを文字として返します

  • getName():現在のイベントの名前を取得します

  • _ getAttributes()_:現在のイベントのイテレーター_を返します
    属性

4. シンプルなXMLパーサーの実装

言うまでもなく、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を解析して、すべてのデータを_websites_というエンティティオブジェクトのリストに保存しましょう。
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サイトの最後の要素に到達すると、エンティティが完全であることがわかり、エンティティを_websites_リストに追加します。

6. 結論

このチュートリアルでは、* StAXライブラリを使用してXMLファイルを解析する方法*を学びました。
サンプルのXMLファイルと完全なパーサーコードは、いつものようにhttps://github.com/eugenp/tutorials/tree/master/xml[Githubで]から入手できます。