Android中xml解析的三种方式Pull、Sax、Dom

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值