-
-
XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据。当解析到一个文档结束时,自动生成EndDocument事件。
-
常用的XML pull的接口和类:XmlPullParser:该解析器是一个在org.xmlpull.v1中定义的解析功能的接口。XmlSerializer:它是一个接口,定义了XML信息集的序列。XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。XmlPullParserException:抛出单一的XML pull解析器相关的错误。PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码:读取到xml的声明返回 START_DOCUMENT; 结束返回 END_DOCUMENT ; 开始标签返回 START_TAG;结束标签返回 END_TAG; 文本返回 TEXT。
如代码:
import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
import com.itcast.domain.City;
public class XMLPullService
{
public static void writeXML(List<City> cities,Writer writer) throws Exception
{
XmlSerializer serizalizer = Xml.newSerializer();
serizalizer.setOutput(writer);
serizalizer.startDocument("UTF_8", true);//<?xml version="1.0" encoding="UTF-8"?>
serizalizer.startTag(null,"citys");
for(City city : cities){
serizalizer.startTag(null,"city");
serizalizer.attribute(null, "id", String.valueOf(city.getId()));
serizalizer.startTag(null,"citycode");
serizalizer.text(city.getCityCode());
serizalizer.endTag(null,"citycode");
serizalizer.startTag(null,"cityName");
serizalizer.text(city.getCityName());
serizalizer.endTag(null,"cityName");
serizalizer.endTag(null,"city");
}
serizalizer.endTag(null,"citys");
serizalizer.endDocument();
writer.flush();
writer.close();
}
/**
* 采用Pull解析器解析xml文件
* @param inStream
* @return
* @throws Exception
*/
public static List<City> readXml(InputStream inStream) throws Exception
{
List<City>cities = null ;
// 装载解析每一个city节点的内容
City city = null ;
// 创建一个xml解析的工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 获得xml解析类的引用
XmlPullParser parser = factory.newPullParser();
parser.setInput(inStream, "UTF-8");
// 获得事件的类型
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
cities = new ArrayList<City>();
break;
case XmlPullParser.START_TAG:
if ("city".equals(parser.getName())) {
city = new City();
// 取出属性值
int id = Integer.parseInt(parser.getAttributeValue(0));
city.setId(id);
}else if (city != null)
{
if ("citycode".equals(parser.getName())) {
String cityCode = parser.nextText();// 获取该节点的内容
city.setCityCode(cityCode);
} else if ("cityName".equals(parser.getName())) {
String cityName = parser.nextText();
city.setCityName(cityName);
}
}
break;
case XmlPullParser.END_TAG:
if ("city".equals(parser.getName()) && city != null) {
cities.add(city);
city = null;
}
break;
}
eventType = parser.next();//循环解析下一个元素
}
return cities;
}
}
//调用方法
private void getPullXml()
{
try
{
InputStream inStream = XmlActivity.this.getAssets().open("city.xml");
List<City> cities = XMLPullService.readXml(inStream);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < cities.size(); i++)
{
City city = cities.get(i);
builder.append("Pull :").append(city.getCityName()).append(" : ").append(city.getCityCode()).append("\n\r");
}
result.setText(builder.toString());
} catch (Exception e)
{
Toast.makeText(XmlActivity.this, "解析异常", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
xml 文件请参考 http://blog.csdn.net/onlywaitforyou/article/details/8647653
City就是一个bean类。