java-stax
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で]から入手できます。