XmlPullParser - 解析嵌套的标签 [英] XmlPullParser - Parse nested tag

查看:979
本文介绍了XmlPullParser - 解析嵌套的标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的XML:

 <菜单>
    <天名=星期一>
        <饭后名=早餐>
            <反向NAME =面包>
               <菜>
                   <名称>普通面包圈< /名称>
               < /皿>
            <反向/>
        <豆粕/>
    <天/>
    <天名=星期二>
        <饭后名=午餐>
            <反向NAME =其他>
               <菜>
                   <名称>奶酪百吉饼< /名称>
               < /皿>
            <反向/>
        <豆粕/>
    <天/>
<菜单/>
 

现在,这里就是我想要做什么,如果哪天标签的属性等于星期一。然后吃饭的标签属性等于早餐,那么我想获取计数器的属性。 面包。

我已经建立了XML拉式解析器,但我在努力得到这个值。以下是我已经尽力了,我现在我看到,它不能也无法正常工作......所以,我怎么能设置它这样做的任何帮助将是巨大的。

 而(EVENTTYPE!= XmlResourceParser.END_DOCUMENT){
        字符串标记名= xmlData.getName();

        开关(事件类型){
            案例XmlResourceParser.START_TAG:
                如果(tagName.equalsIgnoreCase(日)){
                    如果(xmlData.getAttributeValue(NULL,名)。equalsIgnoreCase(天)){
                        如果(tagName.equalsIgnoreCase(饭)){
                            mealArray.add(xmlData.getAttributeValue(NULL,名字));
                            Log.i(TAG,xmlData.getAttributeValue(NULL,名字));
                        }
                    }


                }
                打破;
            案例XmlResourceParser.TEXT:
                打破;
            案例XmlPullParser.END_TAG:

                打破;
        }
        EVENTTYPE = xmlData.next();
    }
 

解决方案

您将需要添加逻辑解析嵌套的标签:

有一个非常简单的例子,以帮助你前进:

我分析这个字符串:

<菜单><天名= \周一\><饭后名= \早餐\><豆粕/><天/>&LT ; /菜单>

code:

 尝试{
    工厂= XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(真正的);
    XmlPullParser XPP = factory.newPullParser();

    xpp.setInput(新StringReader(&​​LT;菜单><天名= \周一\><饭后名= \早餐\><豆粕/><天/>< /菜单>));
    INT EVENTTYPE = xpp.getEventType();
    而(EVENTTYPE!= XmlResourceParser.END_DOCUMENT){
        字符串标记名= xpp.getName();

        开关(事件类型){
            案例XmlResourceParser.START_TAG:
                如果(tagName.equalsIgnoreCase(日)){
                    如果(xpp.getAttributeValue(NULL,名)。equalsIgnoreCase(星期一)){
                        INT eventType2 = xpp.next();
                        而(eventType2!= XmlResourceParser.END_DOCUMENT){
                            串tagName2 = xpp.getName();
                            开关(eventType2){
                            案例XmlResourceParser.START_TAG:
                                如果(tagName2.equalsIgnoreCase(饭)){
                                    Log.i(标记,吃饭+ xpp.getAttributeValue(NULL,名字));
                                }
                                打破;
                            案例XmlResourceParser.TEXT:
                                打破;
                            案例XmlPullParser.END_TAG:
                                打破;
                            }
                            eventType2 = xpp.next();
                        }
                    }
                }
            打破;
            案例XmlResourceParser.TEXT:
            打破;
            案例XmlPullParser.END_TAG:
            打破;
        }
        EVENTTYPE = xpp.next();
    }

}赶上(XmlPullParserException E){
    e.printStackTrace();
}赶上(IOException异常E){
    e.printStackTrace();
}赶上(例外五){
    e.printStackTrace();
}
 

您看到区别了吧?

我加了这个,基本上,刚开始我想以后的日子。 (在我的情况下,很难codeD字符串星期一

  INT eventType2 = xpp.next();
 

和基于该 eventType2 ,检索 tagName2 这将是食品

一个更好的例子来帮你写你的逻辑在一个不错的方式。

希望这有助于。

I have this XML:

<menu>
    <day name="monday">
        <meal name="BREAKFAST">
            <counter name="Bread">
               <dish>
                   <name>Plain Bagel</name>
               </dish>
            <counter/>
        <meal/>
    <day/>
    <day name="tuesday">
        <meal name="LUNCH">
            <counter name="Other">
               <dish>
                   <name>Cheese Bagel</name>
               </dish>
            <counter/>
        <meal/>
    <day/>
<menu/>

Now here is what I am trying to do, if the day tag's attribute is equal to monday. And then meals tag attribute is equal to BREAKFAST, then I want to get the counter's attribute. "Bread".

I have set up xml pull parser, but I am struggling getting this value. Here is what I have tried, I now I see that it can't and won't work... So any help on how I could set it up to do this would be great.

while (eventType != XmlResourceParser.END_DOCUMENT) {
        String tagName = xmlData.getName();

        switch (eventType) {
            case XmlResourceParser.START_TAG:
                if (tagName.equalsIgnoreCase("day")) {
                    if (xmlData.getAttributeValue(null, "name").equalsIgnoreCase(day)) {
                        if (tagName.equalsIgnoreCase("meal")) {
                            mealArray.add(xmlData.getAttributeValue(null, "name"));
                            Log.i(TAG, xmlData.getAttributeValue(null, "name"));
                        }
                    }


                }
                break;
            case XmlResourceParser.TEXT:
                break;
            case XmlPullParser.END_TAG:

                break;
        }
        eventType = xmlData.next();
    }

解决方案

You would need to add logic for parsing nested tags:

A very simple example to help you move ahead:

I parsed this String:

<menu><day name=\"monday\"><meal name=\"BREAKFAST\"><meal/><day/></menu>

Code:

try {
    factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(true);
    XmlPullParser xpp = factory.newPullParser();

    xpp.setInput(new StringReader("<menu><day name=\"monday\"><meal name=\"BREAKFAST\"><meal/><day/></menu>"));
    int eventType = xpp.getEventType();
    while (eventType != XmlResourceParser.END_DOCUMENT) {
        String tagName = xpp.getName();

        switch (eventType) {
            case XmlResourceParser.START_TAG:
                if (tagName.equalsIgnoreCase("day")) {
                    if (xpp.getAttributeValue(null, "name").equalsIgnoreCase("MONDAY")) {
                        int eventType2 = xpp.next();
                        while (eventType2 != XmlResourceParser.END_DOCUMENT) {
                            String tagName2 = xpp.getName();
                            switch (eventType2) {
                            case XmlResourceParser.START_TAG:
                                if (tagName2.equalsIgnoreCase("meal")) {
                                    Log.i("tag", "meal: " + xpp.getAttributeValue(null, "name"));
                                }
                                break;
                            case XmlResourceParser.TEXT:
                                break;
                            case XmlPullParser.END_TAG:
                                break;
                            }
                            eventType2 = xpp.next();
                        }
                    }
                }
            break;
            case XmlResourceParser.TEXT:
            break;
            case XmlPullParser.END_TAG:
            break;
        }
        eventType = xpp.next();
    }

} catch (XmlPullParserException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}

You see the difference, right?

I added this, basically, just after getting the day what I wanted. (In my case, hard coded String "Monday".)

int eventType2 = xpp.next();

And based upon that eventType2, retrieved tagName2 which would be for "meal"

A better example to help you write your logic in a nice manner.

Hope this helps.

这篇关于XmlPullParser - 解析嵌套的标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆