[英]Difficulty with XML nested tags with XMLPullParser in Android
我正在嘗試獲取名稱並讀取type =“ alpha”。
我是初學者,英語不是我的母語,請原諒我。 我已經閱讀了有關DOM,SAX,Simple,其他StackOverflow帖子,其他示例的信息,但我不理解,並且希望在這種情況下了解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,而沒有<item>標記來獲取名稱和記錄日期。
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;
}
我嘗試使用<item>標記(但不起作用)的原因是:
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;
}
如果可以解決,我將能夠讀取名稱和記錄日期,但是我想要獲取的是名稱和讀取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,nameSpace,first_tag_key);
如果name和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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.