SAXパーサーを使用したXMLファイルの解析



Javaには、DOMパーサー、SAXパーサー、またはStAXパーサーを使用してXMLファイルを解析するなど、XMLファイルを解析するためのさまざまな方法が用意されています。

Javaでreplaceを使用する方法

Javaには、XMLファイルを解析するためのさまざまな方法が用意されています。たとえば、DOMパーサー、SAXパーサー、またはStAXパーサーを使用してXMLファイルを解析します。この投稿では、SAXパーサーを使用してXMLファイルを解析する方法を説明します。





SAXパーサーを使用してXMLファイルを解析する方法の詳細に入る前に、まず、異なるパーサーを解析することの違いと、どちらを選択するかを確認しましょう。

SAXパーサー – SAXは、Simple API forXMLの頭字語です。 SAXパーサーはXMLファイルを1行ずつ解析し、XMLファイル内の開始タグ、終了タグ、または文字データを検出するとイベントをトリガーします。これが、SAXパーサーがイベントベースのパーサーと呼ばれる理由です。



DOMパーサー – DOMは、Document ObjectModelの頭字語です。 SAXパーサーとは異なり、DOMパーサーは完全なXMLファイルをメモリにロードし、ツリー内の各ノードがXMLファイルのコンポーネントを表すツリー構造を作成します。 DOMパーサーを使用すると、ノードの作成、ノードの削除、コンテンツの変更、ノード階層のトラバースを行うことができます。 DOMは、XMLファイルの操作中に最大限の柔軟性を提供しますが、大きなXMLファイルの場合、潜在的に大きなメモリフットプリントと大きなプロセッサ要件のコストが伴います。

StAXパーサー – StAXは、Streaming API forXMLの頭字語です。ストリームベースのパーサーは、アプリケーションにメモリ制限がある場合に非常に役立ちます。たとえば、Java MicroEditionを実行している携帯電話。同様に、アプリケーションサーバーなど、アプリケーションが複数のリクエストを同時に処理する必要がある場合は、StAXパーサーを使用する必要があります。

ストリームベースの解析は、さらに次のように分類できます。

プル解析 –プル解析では、クライアントアプリケーションは、XML情報セットと対話する必要があるときに、XML解析ライブラリのメソッドを呼び出します。つまり、クライアントは明示的に要求した場合にのみXMLデータを取得します。



プッシュ解析 –プッシュ解析では、XML情報セット内の要素に遭遇したときに、XMLデータをクライアントにプッシュするのはXMLパーサーです。つまり、パーサーは、アプリケーションがデータを使用する準備ができているかどうかに関係なく、データをアプリケーションに送信します。

SAX、DOM、およびStAXパーサーの比較:

次の表は、SAX、DOM、およびStAXパーサーの機能をまとめたものです。

Java_bloge_2

さまざまなパーサーについて理解したので、SAXパーサーを使用してXMLファイルを解析する方法を見てみましょう。

XMLファイル
以下は、Javaオブジェクトを解析および構築するXMLファイルです。

ボーン・アイデンティティーダグ・リマン119マット・デイモン、フランカ・ポテンテ2002ボーン・スプレマシーポール・グリーングラス108マット・デイモン、フランカ・ポテンテ、ジョーン・アレン2004ボーン・アルティメイタムポール・グリーングラス115マット・デイモン、エドガー・ラミレス、ジョーン・アレン2007ボーン・レガシートニー・ギルロイ135ジェレミー・レナー、レイチェル・ワイズ、エドワード・ノートン2012

プロジェクト構造
これは、EclipseIDEのプロジェクト構造のスクリーンショットです。

これが映画オブジェクトのリストを保持するDVDクラスです

パッケージco.edureka.parsers.saximport java.util.List public class DVD {private String name private List movies public String getName(){return name} public void setName(String name){this.name = name} public List getMovies (){映画を返す} public void setMovies(List movies){this.movi​​es = movies}}

映画オブジェクトには、名前、監督、映画の実行時間(期間)、リリース年、映画のキャストなどのプロパティがあります

パッケージco.edureka.parsers.saxpublic class Movie {private String name private Stringdirectors private int runtime private int release private String cast public String getName(){return name} public void setName(String name){this.name = name} public String getDirectors(){returndirectors} public void setDirectors(Stringdirectors){this.directors = directors} public int getRuntime(){return runtime} public void setRuntime(int runtime){this.runtime = runtime} public int getReleased( ){リリースを返す} public void setReleased(int release){this.released = release} public String getCast(){return cast} public void setCast(String cast){this.cast = cast} @Override public String toString(){ return'Movie [name = '+ name +'、directors = '+ directors +'、runtime = '+ runtime +'、released = '+ release +'、cast = '+ cast +'] '}}

SAXハンドラーの実装:

org.xml.sax.helpersを拡張します。多くのコールバックメソッドを提供し、次のメソッドをオーバーライドするDefaultHandlerクラス:

startElement() –このメソッドは、タグの開始が検出されたときに呼び出されます

endElement() –このメソッドは、タグの終わりに遭遇したときに呼び出されます

文字() –このメソッドは、テキストデータが検出されたときに呼び出されます

注:必要に応じてオーバーライドできるstartDocument()、endDocument()などの他の多くのコールバックメソッドがあります。

パッケージco.edureka.parsers.saximport java.util.ArrayList import java.util.List import org.xml.sax.Attributes import org.xml.sax.helpers.DefaultHandler public class SAXHandler extends DefaultHandler {DVD dvd = new DVD( )ListmovieList = new ArrayList()Movie movie = null String content = null public void startElement(String namespaceURI、String localName、String qname、Attributes attributes){if(qname.equals( 'dvd')){String dvdName = attributes.getValue ( 'name')dvd.setName(dvdName)} else if(qname.equals( 'movie')){movie = new Movie()}} public void endElement(String namespaceURI、String localName、String qname){switch(qname ){case'movie ':movieList.add(movie)break case'name':movie.setName(content)break case'directors ':movie.setDirectors(content)break case'released':movie.setReleased(Integer.parseInt (content))break case'runtime ':movie.setRuntime(Integer.parseInt(content))break case'cast':movie.setCast(content)break case'dvd ':dvd.setMovies(movieList)break}} public voidキャラcters(char [] ch、int start、int length){content = new String(ch、start、length)} public DVD getDVD(){return dvd}}

SAXハンドラーのテスト
それでは、SAXHandlerをテストしてみましょう。以下は、最初にSAXParserFactoryからSAXParserのインスタンスを取得し、ファイルとハンドラーインスタンスの2つの引数を取るparseメソッドを呼び出すテストクラスSAXTestです。

パッケージco.edureka.parsers.saximport java.io.IOException import java.nio.file.Path import java.nio.file.Paths import java.util.List import javax.xml.parsers.ParserConfigurationException import javax.xml.parsers .SAXParser import javax.xml.parsers.SAXParserFactory import org.xml.sax.SAXException public class SAXTest {public static void main(String [] args)throws ParserConfigurationException、SAXException、IOException {SAXParserFactory parserFactor = SAXParserFactory.newInstance()SAXParser parser = parserFactor.newSAXParser()SAXHandlerハンドラー= new SAXHandler()パスパス= Paths.get( 'src / resources'、 'movies.xml')parser.parse(path.toFile()、handler)DVD dvd = handler.getDVD( )リストmovies = dvd.getMovies()System.out.println( 'DVD Name:' + dvd.getName())for(Movie movie:movies){System.out.println(movie)}}}

SAXTestクラスを実行すると、次の出力が得られます。

注意 : movies.xmlとは異なる構造のXMLファイルを解析しようとしている場合は、メソッドstartElement()およびendElement()のコードを変更する必要があります。

自分でコードを試すことに興味がある場合は、コードをダウンロードしてください
[buttonleads form_title =”コードのダウンロード” redirect_url = https://edureka.wistia.com/medias/st5gg7rp15course_id = 44 button_text =”コードのダウンロード”]

質問がありますか?コメント欄にご記入ください。折り返しご連絡いたします。

関連記事: