XML解析有三种方式,这里简单介绍pull解析
这里简单介绍下解析的机制:其实就是先获取到XmlPullParser对象 我这里是通过XmlPullParserFactory获取的
有了对象之后其实就是根据记录EventType(通过XmlPullParser对象获得)然后逐个扫描XML的所有标签
这里举个例子,假如我们有个最简单的XML <root><body>test</body></root> 那么他就会通过while(eventType != xmlPullParser.END_DOCUMENT){}扫描5次
注意中间的文字也是会扫描一次的,不是只有标签才会扫描。
这里要说下END_DOCUMENT,它指的是最后的标签也就是我们例子里的</root>,那么这个循环就是直到eventype记录到最后一个标签停止。
在这里先上部分代码
public void initLists(){
//实例化工厂对象
XmlPullParserFactory factory = null;
ConvenienceCheckModel convenienceCheckModel = null;
List<ConvenienceCheckModel> list = new ArrayList<ConvenienceCheckModel>();
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xmlPullParser = factory.newPullParser();
InputStream inputStream = this.getResources().openRawResource(R.raw.convenience_check_contents);
xmlPullParser.setInput(inputStream,"UTF-8");
int eventType = xmlPullParser.getEventType();
//如果不读到end标签就继续循环
while(eventType != xmlPullParser.END_DOCUMENT){
String tag = xmlPullParser.getName();
//如果是start标签
switch (eventType){
case XmlPullParser.START_TAG:
if(tag.equals("name")){
convenienceCheckModel = new ConvenienceCheckModel();
convenienceCheckModel.setName(xmlPullParser.nextText());
}else if(tag.equals("number")){
convenienceCheckModel.setNumber(xmlPullParser.nextText());
list.add(convenienceCheckModel);//2个属性都已经添加,将其加入list
}
break;
//如果是end标签
case XmlPullParser.END_TAG:
//如果end标签是categories按逻辑加入lists清除子list内容
if(tag.equals("categories")){
lists.add(list);
list = new ArrayList<ConvenienceCheckModel>();
// list.clear();
}
break;
}
eventType = xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
解析的xml是
<root>
<categories>
<category>
<name>民警、匪警</name>
<number>110</number>
</category>
<category>
<name>急救中心</name>
<number>120</number>
</category>
<category>
<name>火灾、火警</name>
<number>119</number>
</category>
<category>
<name>交通事故、交警</name>
<number>122</number>
</category>
</categories>
<categories>
<category>
<name>申通快递</name>
<number>0574-62820966</number>
</category>
<category>
<name>圆通快递</name>
<number>0574-62556567</number>
</category>
<category>
<name>中通快递</name>
<number>0574-62630488</number>
</category>
<category>
<name>顺丰快递</name>
<number>4008111111</number>
</category>
</categories>
</root>
要想解析xml其实无非就是根据逻辑判断你要在哪取数据,标签名是知道位置的途径,可以通过eventType 与xmlPullParser.START_TAG,END_TAG进行初步筛选,
START_TAG代表起始标签,END_TAG表示结束标签,然后像上面代码那样进入其中通过xmlPullParser.getName()这个方法获取标签名进一步判断如果是想要的可以通过
xmlPullParser.nextText()获取下一个位置的文字内容,当然我们都知道想要下1个位置有文字内容,
那这里必须是START_TAG.相信通过上面的代码和部分介绍你已经会使用
pull解析XML了吧。再提一下2个方法,一个是xmlPullParser.Text,代表是文本,也就是标签中放文字的地方。一个是getText(),如果你在START_TAG上使用这个方法的话
是不能获取文字的,因为标签上是没有值的,只能用上面提过的nextText(). 只有在xmlPullParser.Text下面可以用getText()获取到值。