在 Android 中使用 XMLPullParser 的 XML 嵌套标签有困难
Difficulty with XML nested tags with XMLPullParser in Android
我正在尝试获取姓名和阅读类型="alpha"。
我是初学者,英语不是我的第一语言,请原谅。我已经阅读了 DOM、SAX、Simple、其他 Whosebug 帖子和其他示例,但我不明白并且想在这种情况下了解 XMLPullParser。
示例 XML 下面:
<feed>
<title>Title</title>
<item>
<entry>
<name>Name1</name>
<record date="20001231">
<reading type="alpha" value="100"/>
<reading type="beta" value="200"/>
</record>
</entry>
<entry>
<name>Name2</name>
<record date="20001231">
<reading type="alpha" value="300"/>
<reading type="beta" value="400"/>
</record>
</entry>
</item>
</feed>
我读过这个:http://developer.android.com/training/basics/network-ops/xml.html
示例代码适用于上面的示例 XML,没有 - 标签来获取名称和记录日期。
private List<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
List<Entry> entries = new ArrayList<Entry>();
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<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
List<Entry> entries = new ArrayList<Entry>();
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;
}
如果我能解决这个问题,我将能够读取姓名和记录日期,但我想要得到的是 姓名 和 reading type="alpha",不知道嵌套的reading type="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")
您想读取您的属性,例如。 <reading type="alpha" value="300"/>
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();
}
}
你可以试试这个功能
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);
}
我也遇到了同样的错误,我的解决方法很简单,正确检查即可
字符串名称=parser.getName();
parser.require(XmlPullParser.START_TAG, 名称空间, first_tag_key);
如果名称和 first_tag_right 不相同,那么您将得到此异常。
如果用户遇到此错误,这是对任何用户的通用回答。
接受的答案之所以有效,只是因为您只有嵌套标签,但如果您有未嵌套标签而您只想要嵌套标签怎么办?
您可以这样做的一种方法是:
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。
我正在尝试获取姓名和阅读类型="alpha"。
我是初学者,英语不是我的第一语言,请原谅。我已经阅读了 DOM、SAX、Simple、其他 Whosebug 帖子和其他示例,但我不明白并且想在这种情况下了解 XMLPullParser。
示例 XML 下面:
<feed>
<title>Title</title>
<item>
<entry>
<name>Name1</name>
<record date="20001231">
<reading type="alpha" value="100"/>
<reading type="beta" value="200"/>
</record>
</entry>
<entry>
<name>Name2</name>
<record date="20001231">
<reading type="alpha" value="300"/>
<reading type="beta" value="400"/>
</record>
</entry>
</item>
</feed>
我读过这个:http://developer.android.com/training/basics/network-ops/xml.html
示例代码适用于上面的示例 XML,没有
private List<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
List<Entry> entries = new ArrayList<Entry>();
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<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
List<Entry> entries = new ArrayList<Entry>();
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;
}
如果我能解决这个问题,我将能够读取姓名和记录日期,但我想要得到的是 姓名 和 reading type="alpha",不知道嵌套的reading type="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")
您想读取您的属性,例如。 <reading type="alpha" value="300"/>
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();
}
}
你可以试试这个功能
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);
}
我也遇到了同样的错误,我的解决方法很简单,正确检查即可
字符串名称=parser.getName();
parser.require(XmlPullParser.START_TAG, 名称空间, first_tag_key);
如果名称和 first_tag_right 不相同,那么您将得到此异常。
如果用户遇到此错误,这是对任何用户的通用回答。
接受的答案之所以有效,只是因为您只有嵌套标签,但如果您有未嵌套标签而您只想要嵌套标签怎么办?
您可以这样做的一种方法是:
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。