繁体   English   中英

Android中使用XMLPullParser遇到XML嵌套标签的困难

[英]Difficulty with XML nested tags with XMLPullParser in Android

我正在尝试获取名称并读取type =“ alpha”。

我是初学者,英语不是我的母语,请原谅我。 我已经阅读了有关DOM,SAX,Simple,其他StackOverflow帖子,其他示例的信息,但我不理解,并且希望在这种情况下了解XMLPullParser。

下面的示例XML:

<feed>
    <title>Title</title>
    <item>

    <entry>
        <name>Name1</name>
        <record date="20001231">
            <reading type="alpha" value="100"/>
            <reading type="beta" value="200"/>
        </record>
    </entry>

    <entry>
        <name>Name2</name>
        <record date="20001231">
            <reading type="alpha" value="300"/>
            <reading type="beta" value="400"/>
        </record>
    </entry>

    </item>
</feed>

我读过这篇文章: http : //developer.android.com/training/basics/network-ops/xml.html该示例代码适用于上面的示例XML,而没有<item>标记来获取名称和记录日期。

private List<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
    List<Entry> entries = new ArrayList<Entry>();

    parser.require(XmlPullParser.START_TAG, ns, "feed");
    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }

        if (parser.getName().equals("entry")) {
            entries.add(readEntry(parser));
        } else {
            skip(parser);
        }
    }
    return entries;
}

我尝试使用<item>标记(但不起作用)的原因是:

private List<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
    List<Entry> entries = new ArrayList<Entry>();

    parser.require(XmlPullParser.START_TAG, ns, "feed");
    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }

        if (parser.getName().equals("item")) {

            parser.next();

            while (parser.next() != XmlPullParser.END_TAG) {
                if (parser.getEventType() != XmlPullParser.START_TAG) {
                    continue;
                }

                if (parser.getName().equals("entry")) {
                    entries.add(readEntry(parser));
                } else {
                    skip(parser);
                }
            }

        } else {
            skip(parser);
        }
    }
    return entries;
}

如果可以解决,我将能够读取名称和记录日期,但是我想要获取的是名称读取type =“ alpha” ,我不知道如何获取嵌套的读取类型= “阿尔法”。

提前谢谢了。

你不断循环,何时

parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("name")

您可以使用getText()检索标记名称的值:

你会打电话给

parser.next();
String name = parser.getText();

什么时候

parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("reading")

您想读取属性,例如。 <reading type="alpha" value="300"/>

String type = parser.getAttributeValue(null, "type");
String value = parser.getAttributeValue(null, "value");

编辑:

private void readFeed(XmlPullParser parser) throws IOException, XmlPullParserException {
    int eventType = parser.getEventType();
    while (eventType != XmlPullParser.END_DOCUMENT) {
        if (eventType == XmlPullParser.START_TAG) {
            String name = parser.getName();
            if (name == null) {
                continue;
            }
            if (name.equals("reading")) {
                Log.e(getClass().getSimpleName()," " + parser.getAttributeValue(null, "type"));
                Log.e(getClass().getSimpleName(), " " + parser.getAttributeValue(null, "value"));
            }
        }
        eventType = parser.next();
    }
}

你可以试试这个功能

 private List readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
    List entries = new ArrayList();

    parser.require(XmlPullParser.START_TAG, ns, "feed");
    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        // Starts by looking for the item tag
        if (name.equals("item")) {
            parser.require(XmlPullParser.START_TAG, ns, "item");
            while (parser.next() != XmlPullParser.END_TAG) {
                if (parser.getEventType() != XmlPullParser.START_TAG) {
                    continue;
                }
                // and then get the entry here
                if (name.equals("entry")) {
                    entries.add(readEntry(parser));
                }
            }
        } else {
            skip(parser);
        }
    }  
    return entries;
}

其中readEntry函数为:

private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, ns, "entry");
    String name = null;
    Record record = null;
    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        if (name.equals("name")) {
            parser.require(XmlPullParser.START_TAG, ns, "name");
            String title = readText(parser);
            parser.require(XmlPullParser.END_TAG, ns, "name");
        } else if (name.equals("record")) {
            // Try to figure it out by yourself for practice ;)
        } else {
            skip(parser);
        }
    }
    return new Entry(title, summary, link);
}

我也遇到同样的错误,我的解决方案很简单,只需检查正确

字符串名称= parser.getName();

parser.require(XmlPullParser.START_TAG,nameSpace,first_tag_key);

如果name和first_tag_right不相同,则将出现此异常。

如果任何用户遇到此错误,这是一个通用的答案。

可接受的答案仅适用于您,因为您仅具有嵌套标签,但是如果您具有未嵌套的标签,而您只想要嵌套的标签,该怎么办?

一种方法是:

    while (eventType != XmlPullParser.END_DOCUMENT ) {

        // check for the parent tag
        if (eventType == XmlPullParser.START_TAG && "item".equals(xpp.getName())) {
            eventType = xpp.next();

            // loop the parent tag elements until we reach the end of the parent tag
            while (eventType != XmlPullParser.END_TAG && !"item".equals(xpp.getName())) {

                // check the children tags
                if ("title".equals(xpp.getName()))
                    // do something
                else if ("link".equals(xpp.getName()))
                    // do something
                xpp.next();
            }
        }
        eventType = xpp.next();
    }

基本思想是为每个父标记提供一个while循环,并为每个子标记提供相应的ifs。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM