Pull和Sax类似,都是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Pull和Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Pull比Sax更简明,而且不需要扫描完整个流,PULL是个开源的项目, Android系统中和Pull方式相关的包为org.xmlpull.v1. PULL是个开源的项目
创建XmlPullParser,可以使用两个解析方式进行解析,通过XmlPullParserFactory创建
XmlPullParserFactory xpf = XmlPullParserFactory.newInstance();//构造工厂实例
sp; XmlPullParser parser = xpf.newPullParser();//创建解析对象
解析XML,
?xml version="1.0" encoding="utf-8"?>
<rivers>
<river name="解析" length="605">
<introduction>
阿桑
</introduction>
<imageurl>
http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg
</imageurl>
</river>
<river name="学习" length="200">
<introduction>
今天的PULL
</introduction>
<imageurl>
http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg
</imageurl>
</river>
<river name="山东" length="168">
<introduction>
时尚的风格
</introduction>
<imageurl>
http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg
</imageurl>
</river>
</rivers>
解析
private List<River> parserXMLPULL(InputStream is)
{
List<River> list = null;
River river = null;
// XmlPullParserException
// XmlSerializer
// 方式一:
// XmlPullParser parser = Xml.newPullParser();
// 方法二:
XmlPullParserFactory xpf = null;
XmlPullParser parser = null;
try {
xpf = XmlPullParserFactory.newInstance();
parser = xpf.newPullParser();
// 将XML文件以流的形式加入,并设置XML文件的编码方式
// parser.setInput(InputStrean inputStream, String inputEncoding)
// parser.setInput(Reader reader)
parser.setInput(is, "UTF-8");
// 此时文档刚初始化,所以解析的位置在文档的开头
int type = parser.getEventType();//此时返回0,也就是在START_DOCUMENT
// 返回类型START_DOCUMENT,END_DOCUMENT,START_TAG,END_TAG,TEXT
while(type!= XmlPullParser.END_DOCUMENT)
{
switch(type)
{
case XmlPullParser.START_DOCUMENT:
//做一些初始化工作
list = new ArrayList<River>();
break;
case XmlPullParser.START_TAG:
//rivers
String name = parser.getName();
if(name.equals("river"))
{
String attrName = parser.getAttributeValue(0);
int attrLen = Integer.parseInt(parser.getAttributeValue(1));
river = new River();
river.setName(attrName);
river.setLength(attrLen);
}
if(parser.getName().equals("introduction")&&river!=null)
{
String intro = parser.nextText();
river.setIntro(intro);
}
if("imageurl".equals(parser.getName())&&river!=null)
{
String url = parser.nextText();
river.setUrl(url);
}
break;
case XmlPullParser.END_TAG:
String value = parser.getName();
if(value.equals("river")&&river!=null&&list!=null)
{
// 添加对象到list中
list.add(river);
river = null;
}
break;
}
type = parser.next();//当前解析位置结束,指向下一个位置
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
实体化类。
XmlSerializer类
public String createXML(Writer writer ,List<River> list) throws Exception
{
XmlSerializer serial =Xml.newSerializer();
//设置输出流的位置,本句会抛出异常
serial.setOutput(writer);
//以下开始创建XML文件
serial.startDocument("utf-8", true);//对应之前解析时出现的事件
serial.startTag("", "rivers");
//将list的内容写入XML文件
if(list!=null)
{
for(River river : list)
{
//创建river标签
serial.startTag("", "river");
//为river标签添加属性 name 和length
serial.attribute("", "name",river.getName());
serial.attribute("", "length",""+river.getLength());
serial.startTag("", "introduction");
serial.text(river.getIntro());
serial.endTag("", "introduction");
serial.startTag("", "imageurl");
serial.text(river.getUrl());
serial.endTag("", "imageurl");
serial.endTag("","river");
}
}
serial.endTag("", "rivers");
serial.endDocument();
刷新输出的缓冲区
writer.flush();
//关闭输出流
writer.close();
return writer.toString();
}