2

XmlPullParserを使用してXMLパーサーを作成しましたが、数百行のデータを解析するのに多くの時間がかかります。

コードを見て、私が間違っていることを教えてもらえますか?

    case ONE:
            buffer.clear();
            xpp.setInput(responseBuffer[ONE], "UTF_8");
            // Returns the type of current event: START_TAG, END_TAG, etc..
            eventType = xpp.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_TAG) {
                    if (xpp.getName().equalsIgnoreCase("firstTag")) {
                        bufferA = xpp.nextText();
                    } else if (xpp.getName().equalsIgnoreCase("secondTag")) {
                        bufferB = xpp.nextText();
                    } else if (xpp.getName().equalsIgnoreCase("thirdTag")) {
                        bufferC = xpp.nextText();
                    } else if (xpp.getName().equalsIgnoreCase("u")) {
                        bufferD = xpp.nextText();
                    } else if (xpp.getName().equalsIgnoreCase("n")) {
                        bufferE = xpp.nextText();
                    } else if (xpp.getName().equalsIgnoreCase("d")) {
                        bufferF = xpp.nextText();
                    } else if (xpp.getName().equalsIgnoreCase("so")) {
                        bufferG = xpp.nextText();
                    } else if (xpp.getName().equalsIgnoreCase("wei")) {
                        bufferH = xpp.nextText();
                    } else if (xpp.getName().equalsIgnoreCase("ter")) {
                        bufferI = xpp.nextText();
                    }
                } else if (eventType == XmlPullParser.END_TAG
                        && xpp.getName().equalsIgnoreCase("close")) {
                    buffer.add(new VisitInfo(
                            bufferA,
                            bufferB,
                            bufferC,
                            bufferD, bufferE,
                            bufferF, bufferG,
                            bufferH, bufferI));
                }
                eventType = xpp.next(); // move to next element
            }

            break;

この構造に基づいて、さらに3つのパーサーがあります。ありがとう。

4

1 に答える 1

1

XmlPullParser クラスは、大きな XML ファイルの処理が非常に遅くなります。この目標のために、私はVDT-XML ライブラリVTD-XML Benchmarkを使用することを好みます。

私の場合、66841 行の XML ファイルがあり、結果を確認できます。

Nexus 5 : 2055 ミリ秒

Galaxy Note 4:2498ミリ秒

XML ファイルの短い例

 <database name="products">
        <table name="category">
            <column name="catId">20</column>
            <column name="catName">Fruit</column>
        </table>
        <table name="category">
            <column name="catId">31</column>
            <column name="catName">Vegetables</column>
        </table>
        <table name="category">
            <column name="catId">45</column>
            <column name="catName">Rice</column>
        </table>
        <table name="category">
            <column name="catId">50</column>
            <column name="catName">Potatoes</column>
        </table>
</database>

「build.gradle」ファイルの構成

dependencies {
    compile files('libs/vtd-xml.jar')
}

ソースコードの例:

import com.ximpleware.AutoPilot;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;


String fileName = "products.xml";

VTDGen vg = new VTDGen();

if (vg.parseFile(fileName, true)) {

     VTDNav vn = vg.getNav();
     AutoPilot table = new AutoPilot(vn);
     table.selectXPath("database/table");

     while (table.iterate()) {
        String tableName = vn.toString(vn.getAttrVal("name"));

        if (tableName.equals("category")) {
            AutoPilot column = new AutoPilot(vn);
            column.selectElement("column");

            while (column.iterate()) {
                 String text = vn.toNormalizedString(vn.getText());
                 String name = vn.toString(vn.getAttrVal("name"));

                 if (name.equals("catId")) {
                    Log.d("Category ID = " + text);
                 } else if (name.equals("catName")) {
                    Log.d("Category Name = " + text);
                 } 

            }
        }
     }
}

結果

Category ID = 20
Category Name = Fruit

Category ID = 31
Category Name = Vegetables

Category ID = 45
Category Name = Rice

Category ID = 50
Category Name = Potatoes

それは私のために働き、それがあなたを助けることを願っています.

于 2015-04-09T15:41:41.587 に答える