web-dev-qa-db-ja.com

SAXパーサーとXMLPullパーサー

SAXパーサーとXMLPullパーサーの動作の違いを理解しています。実際、ここにはかなり良い説明があります:

http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm この記事は少し.NET中心ですが、概念が適用されます。

プルパーサーの方が扱いやすいという著者の意見には同意しますが、どのタイプのパーサーがどの状況で優れているかについてはかなり混乱しています。誰かが何か光を当てて、私にもう少し読んでもらうことができれば、私はそれをいただければ幸いです。

ありがとうございました。

21
Nelson Ramirez

私は彼らが両方とも吸うことがわかります。 (そして私は提案するより良い解決策を持っています)

単純な注釈ベースのXMLライブラリ を使用する必要があります。私はそれが大好きで、すべてのプロジェクトに使用しています。もしあなたが チュートリアルを読んでください なら、あなたはそれがあなたが望むすべてをそしてはるかに速くそしてより少ないコードで行うことができるだろうと思うでしょう。 (したがって、バグが発生しにくくなります)内部的には、ライブラリは、手間のかかる作業を行うように要求していたパーサーを使用します。

必要に応じて、私の Androidプロジェクトへの組み込みに関するブログ投稿 を読むことができます。 (これは、少なくとも1.5以降のAndroidのすべてのバージョンで機能します。これは、基本的にすべての人にとって意味があります)

18

それは状況に完全に依存します。たとえば、xmlファイルが本当に大きい場合、DOMパーサーを選択できない場合、最初にファイルがメモリに取り込まれ、次に解析され、サイズnのファイルを解析することがわかりました。 7nのメモリスペースが必要です。この場合、SAXパーサーを選択する必要があり、その軽量でメモリの消費量が少なくなります。

2番目のケースは、ファイルがそれほど大きくない場合です。この場合、XMLプルパーサーを使用できます。これは、xmlを完全に制御できるため、SAXでは不可能な場合は解析サイクルをスキップできます。したがって、探しているタグがファイルの最初のタグである場合、なぜファイル全体を検索するのでしょうか。

私の知る限り、小さいファイルでの速度のみを考慮する場合はXMLプルパーサーを使用し、ファイルが大きくてすべてを解析する場合はSAXを使用します。

11
varun bhardwaj

両方のパーサーは、基本的に同じメモリ/時間です。唯一のことは、プルパーサーを使用すると、startelementやendelementなどのイベントを引き出して、必要なイベントだけに注意を払うことができるということです。

Android saxパーサーの場合と同様に、選択の余地はありません。必要な場所にコードを配置するだけですが、すべてのイベントを含める必要があります。

ここ は、さらに読むために参照できるリンクです。

3
user590849

SAXモデルは、特定の状況で作業しやすいと思います。カスタムデータ構造を使用して、ドキュメント全体(または少なくともその大部分)の独自のメモリ内表現を構築する場合です。 (データ構造にこだわらない場合は、DOMパーサーがすでにこれを行っています。)

2
Ted Hopp

プルとサックスは、どちらもDOMよりも高速でメモリ効率の高い低レベルのストリーミングアプローチであるという点で似ていますが、プルにはSAXに比べていくつかの利点があります。

パーサーの状態を維持する必要がないため、プルはSAXよりも実装が簡単です(追加の変数を使用して、パーサーが現在XMLツリーのどの場所にあるかを知ることができます)。プルパーサーコードのネストされたループは、ドキュメントのXML階層とほぼ一致するため、プルパーサーコードはSAXパーサーコードよりも読みやすいと思います。

プルパーサーコードを使用すると、解析したくないブロック全体をスキップできるため、常にすべてのノードの主要な情報を抽出するSAXよりも効率的です。プルパーサーを使用すると、必要な情報を取得した場合、いつでも解析を停止できます。これは、SAXでは不可能です。

また、プルパーサーを使用してSAXパーサーを実装することもできます。逆は不可能です。

これらすべての理由から、プルパーサーはすべての状況でSAXより優れていると思いますが、SAXのように適切に実装するのは簡単ではなく、注意する必要があります。プルとSAXの低レベルの速度の利点が不要で、XMLがクリーンな場合は、 Simple のような高レベルの解析ライブラリをいつでも使用してハードワークを実行できます。

2
BladeCoder

XMLPullParserではなくSAXを使用していると、より適切で効率的な出力が見つかりました...私のシナリオはXMLタグの下の属性を解析することです。これは簡単に実行でき、データベースにスムーズに挿入できます...状況によって異なると思います。 XMLファイルに書き込む必要があります。DOMパーサーが好きです。

public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        currentElement = true;
        db = new DatabaseHelper(thecontext);
        if (qName.equals("Asa.Amms.Data.Entity.User")) {
            int length = attributes.getLength();
            for (int i = 0; i < length; i++) {
                String name = attributes.getQName(i);
                if (name.equals("Id")) {
                    id = Integer.parseInt(attributes.getValue(i));
                }
                if (name.equals("Login")) {
                    LoginID = attributes.getValue(i).toString();
                }
                if (name.equals("Name")) {
                    Name = attributes.getValue(i).toString();
                }
                if (name.equals("Password")) {
                    Password = attributes.getValue(i).toString();
                }
                if (name.equals("ProgramOfficerId")) {
                    user_ProgramOfficerId = Integer.parseInt(attributes.getValue(i).toString());
                }
            }
            Log.i("Baal dhukbe", id + LoginID + Name + Password);

            db.insertUser(id, LoginID, Name, Password, user_ProgramOfficerId);
        }
}
0
Miral Sarwar