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で入手できます。