Android附带了一个pull解析器,pull解析器的运行方式与sax类似,都是基于事件模式。
pull提供了开始元素和结束元素,当某个元素开始时,我们可以调用parser.nextText从xml文档中提取所有字符数据。当一个文档结束时,自动生成EndDocument事件。
读取到xml的结束返回END_DOCUMENT;
读取到xml的结束返回START_TAG;
读取到xml的结束返回END_TAG;
读取到xml的结束返回TEXT;
PULL常用的接口和类
XmlPullParser:提供了定义解析功能的接口。
XmlSerializer:它是一个接口,定义了XML信息集的序列。
具体代码:
@Override
protected Object doInBackground(Object[] objects) {
final List<FQ> fqs=new ArrayList<>();
//获取网络数据
//01.定义获取网络的数据的路径
String path=getString(R.string.server_name)+"fqActiongetXML.action";
try {
//02.实例化Url
URL url=new URL(path);
//03.获取连接对象
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
//04.设置请求方式
conn.setRequestMethod("GET");
//05.设置请求连接超时的时间
conn.setConnectTimeout(5000);
//06.获取响应码
int code=conn.getResponseCode();
if(code==200){
//07.获取返回过来的数据(XML)
InputStream is =conn.getInputStream();
//08.测试(删除-注释)
//缓冲字符流
String str=null;
// BufferedReader br=new BufferedReader(new InputStreamReader(is));
// while((str=br.readLine())!=null){
// Log.i("test",str);
// }
try {
//03.使用PULL解析
XmlPullParser pullParser=Xml.newPullParser();
pullParser.setInput(is,"UTF-8");
int type=pullParser.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
//获取开始标签的名字
String startTagName=pullParser.getName();
if("fq".equals(startTagName)){
fq1 = new FQ();
String name=pullParser.getAttributeValue(0);
fq1.setName(name);
}else if("content".equals(startTagName)){
String content= pullParser.nextText();
fq1.setContent(content);
}else if("time".equals(startTagName)){
String time= pullParser.nextText();
fq1.setTime(time);
}
break;
case XmlPullParser.END_TAG:
//获取结束标签的名字
String endTagName=pullParser.getName();
if("fq".equals(endTagName)){
fqs.add(fq1);
}
break;
}
type=pullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fqs;
}