簡體   English   中英

XmlPullParser返回太多對象

[英]XmlPullParser returning too many objects

我正在嘗試解析XML文檔並返回一個名為System的對象。 相反,對於XML文檔中的每個結束標記,都會返回新的System。 我嘗試將創建系統的位置移到代碼的各個部分,但是System對象只能是null,或者會出現關於沒有return語句的錯誤。 這是我嘗試移至創建系統位置之前的原始代碼:

    private System readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
        //TODO Make it return one system per time through, not multiple after every end tag
        parser.require(XmlPullParser.START_TAG, ns, null);
        String systemName = null;
        String rightAscension = null;
        String declination = null;
        String distance = null;
        while (parser.getEventType() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                Log.i("String", "Start Tag Added");
                continue;
            }
            String name = parser.getName();
            if (name.equalsIgnoreCase("name")) {
                Log.i("Name:", "Name added to parser");
                systemName = readName(parser);
            } else if (name.equalsIgnoreCase("rightascension")) {
                Log.i("RAscen:", "Right Ascension added to parser");
                rightAscension = readRightAscension(parser);
            } else if (name.equalsIgnoreCase("declination")) {
                Log.i("Dec:", "Declination added to parser");
                declination = readDeclination(parser);
            } else if (name.equalsIgnoreCase("distance")) {
                Log.i("Distance:", "Distance added to parser");
                distance = readDistance(parser);
            } else {
                Log.i("Skip: ", "String Skipped");
                skip(parser);
            }
        }
        Log.i("Parser", "New System Added to be displayed");
        return new System(systemName, rightAscension, declination, distance);
    }

如何更改代碼,以便在代碼末尾僅返回一個系統? 謝謝! 這是我的更多代碼,其中的readSystem稱為:

  public List<System> parse(InputStream is) throws XmlPullParserException, IOException {
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(true);
    XmlPullParser parser = factory.newPullParser();
    Log.i("Parser", "Parser created");
    try {
        //factory = XmlPullParserFactory.newInstance();
       // factory.setNamespaceAware(true);
       // parser = factory.newPullParser();

        parser.setInput(is, null);
        parser.nextTag();
        Log.i("System:", "readSystem called");
        return readSystem(parser);
    } finally {
        is.close();
        Log.i("InputStream", "InputStream Closed");
    }
}
    private List readSystem(XmlPullParser parser) throws XmlPullParserException, IOException {
    List systems = new ArrayList();
        parser.require(XmlPullParser.START_TAG, ns, "system");
        Log.i("Parser", "Passed parser.require");
    String name = parser.getName();
    Log.i("parser", "getName() Called");
    while (parser.next() != XmlPullParser.END_TAG) {
       if (parser.getEventType() != XmlPullParser.START_TAG) {
           Log.i("readSystem", "Start Tag Continue called");
            continue;
       }
        if (name.equalsIgnoreCase("system")) {
            Log.i("String", "System added to parser");
            systems.add(readEntry(parser));
        } else {
           Log.i("String", "No system to add, skipped, no readEntry called");
           skip(parser);
        }

    }
    return systems;
}

好吧,在XML中可以有很多結束標記。 例如:

    <foo>
        <bar></bar>
        <baz></baz>
    </foo>

在這里,我們有3個結束標記。 如果我們正在解析foo元素,則使用您當前的代碼,您將在到達bar結束標記后立即停止解析。

當標記是結束標記時,您需要檢查節點的名稱,並且只有當它是系統標記時,才需要完成解析。

如果整個文檔中只有一個“ System”元素,則還可以使用XmlPullParser.END_DOCUMENT常量檢查是否已完成解析。 您在這里有一個很好的例子:

http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM