在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。