Android 使用XmlPullParser解析xml

Android 使用XmlPullParser解析xml,android,xmlpullparser,Android,Xmlpullparser,我正在使用android,并在android中使用xmlpullparser解析xml文档,如下所示: <spaces> <space> <name></name> <desc></desc> <songs> <song> <name></name> <thumb></thumb>

我正在使用android,并在android中使用xmlpullparser解析xml文档,如下所示:

<spaces>
  <space>
    <name></name>
    <desc></desc>
    <songs>
      <song>
        <name></name>
        <thumb></thumb>
      </song>
      <song>
        <name></name>
        <thumb></thumb>
      </song>
    </songs>
  </space>
</spaces>

我用这个:

public List<Space> parse(String xmlString) {
        List<Space> Spaces = null;
        XmlPullParser parser = Xml.newPullParser();
        try {
            parser.setInput(new StringReader(xmlString));
            int eventType = parser.getEventType();
            Space currentSpace = null;
            boolean done = false;
            while (eventType != XmlPullParser.END_DOCUMENT && !done) {
                String name = null;
                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    Spaces = new ArrayList<Space>();
                    break;
                case XmlPullParser.START_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase("space")) {
                        currentSpace = new Space();
                        System.out.println("space");

                    } else if (currentSpace != null) {

                        if (name.equalsIgnoreCase("name")) {
                            currentSpace.setName(parser.nextText());
                            System.out.println(":::"+currentSpace.getName());

                        } else if (name.equalsIgnoreCase("id")) {
                            if (currentSpace.getId() == null) {
                                currentSpace.setId(parser.nextText());
                            }

                        }

                    }

                    break;
                case XmlPullParser.END_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase("space") && currentSpace != null) {
                        Spaces.add(currentSpace);

                    } else if (name.equalsIgnoreCase("spaces")) {
                        done = true;

                    }
                    break;
                }
                eventType = parser.next();  
            }
        } catch (Exception e) {
            Log.e("Projects List", e.getMessage(), e);
            throw new RuntimeException(e);
        }
        return Spaces;
    }
公共列表解析(字符串xmlString){
列表空间=null;
XmlPullParser=Xml.newPullParser();
试一试{
setInput(新的StringReader(xmlString));
int eventType=parser.getEventType();
空间currentSpace=null;
布尔完成=假;
while(eventType!=XmlPullParser.END_文档&&!完成){
字符串名称=null;
开关(事件类型){
案例XmlPullParser.START_文档:
空格=新的ArrayList();
打破
case XmlPullParser.START_标记:
name=parser.getName();
if(name.equalsIgnoreCase(“空格”)){
currentSpace=新空间();
System.out.println(“空间”);
}else if(currentSpace!=null){
if(name.equalsIgnoreCase(“name”)){
currentSpace.setName(parser.nextText());
System.out.println(“:”+currentSpace.getName());
}else if(name.equalsIgnoreCase(“id”)){
if(currentSpace.getId()==null){
setId(parser.nextText());
}
}
}
打破
case XmlPullParser.END_标记:
name=parser.getName();
if(name.equalsIgnoreCase(“space”)和¤tSpace!=null){
空格。添加(currentSpace);
}else if(name.equalsIgnoreCase(“空格”)){
完成=正确;
}
打破
}
eventType=parser.next();
}
}捕获(例外e){
Log.e(“项目列表”,e.getMessage(),e);
抛出新的运行时异常(e);
}
返回空间;
}
我的问题是我只想要
中的
而不是
中的
,使用上面的代码我可以同时得到这两个

我看了看,但没能找到解决办法

请回复。
谢谢。

在解析START\u标记时,当您解析
标记时,取一个计数器变量并将其赋值为1,然后每当您得到
标记时,将其增量为1

现在,在解析
标记时,只需检查
标记是否第一次出现,如果是,则解析所需的值

case XmlPullParser.START_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase("space")) {
                        cnt=1;
                        currentSpace = new Space();
                        System.out.println("space");

                    } else if (currentSpace != null) {

                        if (name.equalsIgnoreCase("name")) 
                         {
                            currentSpace.setName(parser.nextText());
                            if(cnt==1)
                            {
                                // you have <name> from <space>
                            }
                            System.out.println(":::"+currentSpace.getName());
                            cnt++;
                        } else if (name.equalsIgnoreCase("id")) {
                            if (currentSpace.getId() == null) {
                                currentSpace.setId(parser.nextText());
                            }

                        }

                    }

                    break;
case XmlPullParser.START_标记:
name=parser.getName();
if(name.equalsIgnoreCase(“空格”)){
cnt=1;
currentSpace=新空间();
System.out.println(“空间”);
}else if(currentSpace!=null){
if(name.equalsIgnoreCase(“name”))
{
currentSpace.setName(parser.nextText());
如果(cnt==1)
{
//你从
}
System.out.println(“:”+currentSpace.getName());
cnt++;
}else if(name.equalsIgnoreCase(“id”)){
if(currentSpace.getId()==null){
setId(parser.nextText());
}
}
}
打破

在解析START\u标记时,当解析
标记时,取一个计数器变量并将其赋值为1,然后每当得到
标记时,以该增量将其赋值为1

现在,在解析
标记时,只需检查
标记是否第一次出现,如果是,则解析所需的值

case XmlPullParser.START_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase("space")) {
                        cnt=1;
                        currentSpace = new Space();
                        System.out.println("space");

                    } else if (currentSpace != null) {

                        if (name.equalsIgnoreCase("name")) 
                         {
                            currentSpace.setName(parser.nextText());
                            if(cnt==1)
                            {
                                // you have <name> from <space>
                            }
                            System.out.println(":::"+currentSpace.getName());
                            cnt++;
                        } else if (name.equalsIgnoreCase("id")) {
                            if (currentSpace.getId() == null) {
                                currentSpace.setId(parser.nextText());
                            }

                        }

                    }

                    break;
case XmlPullParser.START_标记:
name=parser.getName();
if(name.equalsIgnoreCase(“空格”)){
cnt=1;
currentSpace=新空间();
System.out.println(“空间”);
}else if(currentSpace!=null){
if(name.equalsIgnoreCase(“name”))
{
currentSpace.setName(parser.nextText());
如果(cnt==1)
{
//你从
}
System.out.println(“:”+currentSpace.getName());
cnt++;
}else if(name.equalsIgnoreCase(“id”)){
if(currentSpace.getId()==null){
setId(parser.nextText());
}
}
}
打破

您可以使用标志并将其值初始化为false。首先输入名称标记时,检查是否为false,然后输入标记时,将其值设置为true。然后它将不再输入。

您可以使用标志并将其值初始化为false。首先输入名称标记时,检查是否为false,然后输入标记时,将其值设置为true。然后它就不会再进入了。

它实际上什么都没有。我把它搞砸了。非常感谢:)事实上,我使用了你们接受其他人的旗帜。并对此发表了评论:)其实什么都不是。我把它搞砸了。谢谢:事实上,我使用的标志是Y接受OTHR ANS,并对此进行评论:)你会考虑一个非基于拉力的答案吗?