我正在使用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;
}我的问题是,我只想要<space>中的<name></name>,而不是<song>中的,并且使用上面的代码可以同时获得两者。
我看了Parsing XML XmlPullParser android,但没有得到我的解决方案。
请回复。谢谢。
发布于 2011-11-05 13:21:53
在解析START_TAG时,当您解析<space>标签时,获取一个计数器变量并将其赋值为1,然后每当您获得<name>标签时,就将其递增1。
现在,在解析<name>标签时,只需检查<name>标签是否第一次出现,如果是,则解析所需的值。
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;发布于 2011-11-05 13:33:29
您可以使用标志并将其值初始化为false。当您第一次输入name标记时,检查false,当您进入标记时,将其值设置为true。那么它就不会再次进入。
https://stackoverflow.com/questions/8018305
复制相似问题