在Android中使用XMLPullParser的XML嵌套标记很困难

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

我是初学者,英语不是我的第一语言,请原谅我。 我已经阅读过DOM,SAX,Simple,其他StackOverflowpost,其他样本,但我不明白,并希望在这种情况下了解XMLPullParser。

以下示例XML:

 Title   Name1       Name2        

我读过这个: http : //developer.android.com/training/basics/network-ops/xml.html并且示例代码适用于上面的示例XML而没有标签来获取名称和记录日期。

 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; } if (parser.getName().equals("entry")) { entries.add(readEntry(parser)); } else { skip(parser); } } return entries; } 

我尝试使用标签(但不起作用)的是:

 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; } 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; } 

如果我可以解决这个问题,我将能够读取名称和记录日期,但我想要的是名称阅读类型=“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") 

你想读你的属性,例如。

 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(); } } 

你可以试试这个function

  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); } 

我也有同样的错误,我的解决方案很简单,只需检查一下

String name = parser.getName();

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

如果name和first_tag_right不相同,那么您将获得此exception。

如果出现这种错误,这是任何用户的通用答案。

接受的答案只是因为你只有嵌套标签,但如果你有unnested标签而你只想要嵌套标签怎么办?

你可以这样做的一种方法是:

  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。