1、Pull解析
private List<Student> parseXmlByPull(InputStream is){
List<Student> stus = new ArrayList<Student>();
//获取XmlPullParser解析器实例
XmlPullParser parser = Xml.newPullParser();
try {
//注入xml文件的数据源
parser.setInput(is, "utf-8");
//获取事件类型码,同时也是在触发第一次事件
int eventType = parser.getEventType();
//存储标签名称
String tagName = null;
//存储学生实例
Student stu = null;
//循环处理各种事件,终止条件是执行到文档结束
while(eventType!=XmlPullParser.END_DOCUMENT){
switch(eventType){
case XmlPullParser.START_DOCUMENT:
Log.d(TAG, "START_DOCUMENT");
break;
case XmlPullParser.START_TAG:
//getName()获取标签名称,此方式只适用于开始标签与结束标签事件
tagName = parser.getName();
Log.d(TAG, "START_TAG tagName: " + tagName);
if(STUDENT.equals(tagName)){
stu = new Student();
stu.setId(Integer.parseInt(parser.getAttributeValue(0)));
}
if(stu!=null){
if(NAME.equals(tagName)){
//nextText()获取标签中的文本结点的值,只适用于开始标签与结束标签
stu.setName(parser.nextText());
}else if(AGE.equals(tagName)){
stu.setAge(Integer.parseInt(parser.nextText()));
}else if(SEX.equals(tagName)){
stu.setSex(parser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
tagName = parser.getName();
Log.d(TAG, "END_TAG tagName: " + tagName);
if(STUDENT.equals(tagName)){
stus.add(stu);
stu = null;
}
//结束标签事件一定要给tagName清空,标签之前存在空白文本结点
tagName = null;
break;
case XmlPullParser.TEXT:
//getText()获取文本结点的值,只是用TEXT事件
String text = parser.getText();
Log.d(TAG, "TEXT text: " + text);
/*if(stu!=null){
if(NAME.equals(tagName)){
stu.setName(text);
}else if(AGE.equals(tagName)){
stu.setAge(Integer.parseInt(text));
}else if(SEX.equals(tagName)){
stu.setSex(text);
}
}*/
break;
}
//通过next(),触发下一次事件
eventType = parser.next();
}
} catch (XmlPullParserException e) {
Log.e(TAG, "" + e.getMessage());
e.printStackTrace();
}catch(IOException e){
Log.e(TAG, "" + e.getMessage());
e.printStackTrace();
}finally{
try {
if(is != null){
is.close();
is = null;
}
} catch (IOException e) {
Log.e("TAG", "" + e.getMessage());
e.printStackTrace();
}
}
return stus;
}
2、Sax解析
private List<Student> parseXmlBySax(InputStream is){
List<Student> stus = new ArrayList<Student>();
//获取Sax解析器工厂的实例 SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//根据工厂获取解析器实例 SAXParser
SAXParser parser = factory.newSAXParser();
//从解析器中获取事件源 XMLReader
XMLReader reader = parser.getXMLReader();
//构建事件处理器
StudentHandler stuHandler = new StudentHandler(stus);
//将事件处理器关联给事件源
reader.setContentHandler(stuHandler);
//通过parse方法注入xml数据源
reader.parse(new InputSource(is));
} catch (ParserConfigurationException e) {
Log.e("TAG", "" + e.getMessage());
e.printStackTrace();
} catch (SAXException e) {
Log.e("TAG", "" + e.getMessage());
e.printStackTrace();
} catch(IOException e){
Log.e("TAG", "" + e.getMessage());
e.printStackTrace();
} finally{
try {
if(is != null){
is.close();
is = null;
}
} catch (IOException e) {
Log.e("TAG", "" + e.getMessage());
e.printStackTrace();
}
}
return stus;
}
/**
* 事件处理器,需要重写5个方法分别代表五种事件回调
* @author luzi
* @date 2014-3-21
*/
class StudentHandler extends DefaultHandler{
private final String TAG = StudentHandler.class.getSimpleName();
private final String STUDENT = "student";
private final String ID = "id";
private final String NAME = "name";
private final String AGE = "age";
private final String SEX = "sex";
private List<Student> mStus;
private Student mStu;
//存储标签名称,适用于开始标签与结束标签
private String mTagName;
public StudentHandler(List<Student> stus){
mStus = stus;
}
// 文档开始---事件回调方法
@Override
public void startDocument() throws SAXException {
Log.d(TAG, "startDocument");
super.startDocument();
}
//开始标签---事件回调方法
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.d(TAG, "startElement localName: " + localName);
mTagName = localName;
if(STUDENT.equals(mTagName)){
mStu = new Student();
mStu.setId(Integer.parseInt(attributes.getValue(ID)));
}
super.startElement(uri, localName, qName, attributes);
}
//文本结点---事件回调方法
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String text = new String(ch, start, length);
Log.d(TAG, "characters text: " + text);
if(mStu!=null){
if(NAME.equals(mTagName)){
mStu.setName(text);
}else if(AGE.equals(mTagName)){
mStu.setAge(Integer.parseInt(text));
}else if(SEX.equals(mTagName)){
mStu.setSex(text);
}
}
super.characters(ch, start, length);
}
//结束标签---事件回调方法
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Log.d(TAG, "endElement localName: " + localName);
mTagName = localName;
if(STUDENT.equals(mTagName)){
mStus.add(mStu);
mStu = null;
}
//清空标签名称
mTagName = null;
super.endElement(uri, localName, qName);
}
//文档结束---事件回调方法
@Override
public void endDocument() throws SAXException {
Log.d(TAG, "endDocument");
super.endDocument();
}
}
3、Dom解析
//dom方式解析xml
private List<Student> parserXml(){
List<Student> students = new ArrayList<Student>();
// 获取工厂实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try{
//获取解析器实例
DocumentBuilder db = dbf.newDocumentBuilder();
// 用解析器解析Xml,xml置于assets
Document doc = db.parse(getResources().openRawResource(R.raw.students));
//获取Document根节点
Element root = doc.getDocumentElement();
//拿到某个标签的节点列表
NodeList nodeList = root.getElementsByTagName("student");
int length = nodeList.getLength();
Student student = null;
//遍历节点列表
for(int i=0; i<length; i++){
student = new Student();
Element studentNode = (Element)nodeList.item(i);
student.setId(Integer.valueOf(studentNode.getAttribute("id")));
//拿到<student>标签的子节点列表
NodeList childNode = studentNode.getChildNodes();
int childNodeLength = childNode.getLength();
//遍历子节点列表
for(int j=0; j<childNodeLength; j++){
Node node = childNode.item(j);
if(node.getNodeType()==Node.ELEMENT_NODE){
Element element = (Element)node;
if("name".equals(element.getNodeName())){
student.setName(element.getFirstChild().getNodeValue());
}else if("age".equals(element.getNodeName())){
student.setAge(Integer.valueOf(element.getFirstChild().getNodeValue()));
}else if("sex".equals(element.getNodeName())){
student.setSex(element.getFirstChild().getNodeValue());
}
}
}
students.add(student);
}
}catch(Exception e){
Log.e("TAG", "" + e.getMessage());
}
return students;
}