XmlPullParser - 解析嵌套的标签 [英] XmlPullParser - Parse nested tag
问题描述
我有这样的XML:
<菜单>
<天名=星期一>
<饭后名=早餐>
<反向NAME =面包>
<菜>
<名称>普通面包圈< /名称>
< /皿>
<反向/>
<豆粕/>
<天/>
<天名=星期二>
<饭后名=午餐>
<反向NAME =其他>
<菜>
<名称>奶酪百吉饼< /名称>
< /皿>
<反向/>
<豆粕/>
<天/>
<菜单/>
现在,这里就是我想要做什么,如果哪天标签的属性等于星期一。然后吃饭的标签属性等于早餐
,那么我想获取计数器的属性。 面包。
我已经建立了XML拉式解析器,但我在努力得到这个值。以下是我已经尽力了,我现在我看到,它不能也无法正常工作......所以,我怎么能设置它这样做的任何帮助将是巨大的。
而(EVENTTYPE!= XmlResourceParser.END_DOCUMENT){
字符串标记名= xmlData.getName();
开关(事件类型){
案例XmlResourceParser.START_TAG:
如果(tagName.equalsIgnoreCase(日)){
如果(xmlData.getAttributeValue(NULL,名)。equalsIgnoreCase(天)){
如果(tagName.equalsIgnoreCase(饭)){
mealArray.add(xmlData.getAttributeValue(NULL,名字));
Log.i(TAG,xmlData.getAttributeValue(NULL,名字));
}
}
}
打破;
案例XmlResourceParser.TEXT:
打破;
案例XmlPullParser.END_TAG:
打破;
}
EVENTTYPE = xmlData.next();
}
您将需要添加逻辑解析嵌套的标签:
有一个非常简单的例子,以帮助你前进:
我分析这个字符串:
<菜单><天名= \周一\><饭后名= \早餐\><豆粕/><天/>&LT ; /菜单>
code:
尝试{
工厂= XmlPullParserFactory.newInstance();
factory.setNamespaceAware(真正的);
XmlPullParser XPP = factory.newPullParser();
xpp.setInput(新StringReader(<菜单><天名= \周一\><饭后名= \早餐\><豆粕/><天/>< /菜单>));
INT EVENTTYPE = xpp.getEventType();
而(EVENTTYPE!= XmlResourceParser.END_DOCUMENT){
字符串标记名= xpp.getName();
开关(事件类型){
案例XmlResourceParser.START_TAG:
如果(tagName.equalsIgnoreCase(日)){
如果(xpp.getAttributeValue(NULL,名)。equalsIgnoreCase(星期一)){
INT eventType2 = xpp.next();
而(eventType2!= XmlResourceParser.END_DOCUMENT){
串tagName2 = xpp.getName();
开关(eventType2){
案例XmlResourceParser.START_TAG:
如果(tagName2.equalsIgnoreCase(饭)){
Log.i(标记,吃饭+ xpp.getAttributeValue(NULL,名字));
}
打破;
案例XmlResourceParser.TEXT:
打破;
案例XmlPullParser.END_TAG:
打破;
}
eventType2 = xpp.next();
}
}
}
打破;
案例XmlResourceParser.TEXT:
打破;
案例XmlPullParser.END_TAG:
打破;
}
EVENTTYPE = xpp.next();
}
}赶上(XmlPullParserException E){
e.printStackTrace();
}赶上(IOException异常E){
e.printStackTrace();
}赶上(例外五){
e.printStackTrace();
}
您看到区别了吧?
我加了这个,基本上,刚开始我想以后的日子。 (在我的情况下,很难codeD字符串星期一
)
INT eventType2 = xpp.next();
和基于该 eventType2
,检索 tagName2
这将是食品
一个更好的例子来帮你写你的逻辑在一个不错的方式。
希望这有助于。
I have this XML:
<menu>
<day name="monday">
<meal name="BREAKFAST">
<counter name="Bread">
<dish>
<name>Plain Bagel</name>
</dish>
<counter/>
<meal/>
<day/>
<day name="tuesday">
<meal name="LUNCH">
<counter name="Other">
<dish>
<name>Cheese Bagel</name>
</dish>
<counter/>
<meal/>
<day/>
<menu/>
Now here is what I am trying to do, if the day tag's attribute is equal to monday. And then meals tag attribute is equal to BREAKFAST
, then I want to get the counter's attribute. "Bread".
I have set up xml pull parser, but I am struggling getting this value. Here is what I have tried, I now I see that it can't and won't work... So any help on how I could set it up to do this would be great.
while (eventType != XmlResourceParser.END_DOCUMENT) {
String tagName = xmlData.getName();
switch (eventType) {
case XmlResourceParser.START_TAG:
if (tagName.equalsIgnoreCase("day")) {
if (xmlData.getAttributeValue(null, "name").equalsIgnoreCase(day)) {
if (tagName.equalsIgnoreCase("meal")) {
mealArray.add(xmlData.getAttributeValue(null, "name"));
Log.i(TAG, xmlData.getAttributeValue(null, "name"));
}
}
}
break;
case XmlResourceParser.TEXT:
break;
case XmlPullParser.END_TAG:
break;
}
eventType = xmlData.next();
}
You would need to add logic for parsing nested tags:
A very simple example to help you move ahead:
I parsed this String:
<menu><day name=\"monday\"><meal name=\"BREAKFAST\"><meal/><day/></menu>
Code:
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(new StringReader("<menu><day name=\"monday\"><meal name=\"BREAKFAST\"><meal/><day/></menu>"));
int eventType = xpp.getEventType();
while (eventType != XmlResourceParser.END_DOCUMENT) {
String tagName = xpp.getName();
switch (eventType) {
case XmlResourceParser.START_TAG:
if (tagName.equalsIgnoreCase("day")) {
if (xpp.getAttributeValue(null, "name").equalsIgnoreCase("MONDAY")) {
int eventType2 = xpp.next();
while (eventType2 != XmlResourceParser.END_DOCUMENT) {
String tagName2 = xpp.getName();
switch (eventType2) {
case XmlResourceParser.START_TAG:
if (tagName2.equalsIgnoreCase("meal")) {
Log.i("tag", "meal: " + xpp.getAttributeValue(null, "name"));
}
break;
case XmlResourceParser.TEXT:
break;
case XmlPullParser.END_TAG:
break;
}
eventType2 = xpp.next();
}
}
}
break;
case XmlResourceParser.TEXT:
break;
case XmlPullParser.END_TAG:
break;
}
eventType = xpp.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
You see the difference, right?
I added this, basically, just after getting the day what I wanted. (In my case, hard coded String "Monday"
.)
int eventType2 = xpp.next();
And based upon that eventType2
, retrieved tagName2
which would be for "meal"
A better example to help you write your logic in a nice manner.
Hope this helps.
这篇关于XmlPullParser - 解析嵌套的标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!