微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml的两种解析方式sax和dom解析的区别

现在被广泛使用的XML的解析器主要有DOM和SAX两种

1,首先了解一下xml作为一种可扩展的标记语言,它主要包括几部分

i. xml声明、1.version encoding2.<?xmlversion=”1.0” encoding=”UTF-8”?>

ii. Xml:根目录(根元素)

iii. Xml:子元素

iv. Xml:注释 <!-- 注释的内容 -- >

下面就是一种简单的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student stuId="001">
		<stuName>公主</stuName>
		<stuAge>19</stuAge>
	</student>
	<student stuId="002">
		<stuName>王子</stuName>
		<stuAge>20</stuAge>
	</student>
	<student stuId="003">
		<stuName>灰姑娘</stuName>
		<stuAge>19</stuAge>
	</student>
</students>
<p>2、 SAX解析</p><p>a)事件驱动的解析:根元素出发的事件、结束的事件、子元素开始出发的事件、结束的事件、文本解析触发的事件</p><p>b) 解析器:ContentHandler</p><p>c)使用其子类:DefaultHandler</p><p>i.主要使用的方法:startDocument、endDocument、startElement、endElement、charachters</p>   使用的方法可以参考jdk-api文档可以参考:http://download.csdn.net/detail/zhangvalue/9203511
接下来首先将这个student类进行一个封装 
public class Student {
	private int id;
	private String name;
	private int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		// Todo Auto-generated method stub
		return "id:"+id+",name:"+name+";age:"+age;
	}
}
接下来就是对这个xml文件进行解析
import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MySax extends DefaultHandler{

	List<Student> list = null;//使用一个list来装Student这个类
	Student stu = null;
	
	String tag;<pre name="code" class="java" style="font-size: 14px; line-height: 26px;">//--存储xml解析到哪个标签上了
public List<Student> getList(){return list;//返回的是Student这个对象中的属性,在student的类中已经写了对应的方法}@Overridepublic void characters(char[] arg0,int arg1,int arg2) throws SAXException {//接收元素中字符数据的通知,同时将异常总的异常抛出// Todo Auto-generated method stubsuper.characters(arg0,arg1,arg2);String info = new String(arg0,arg2);if(tag!=null){if(tag.equals("stuName")){stu.setName(info);}if(tag.equals("stuAge")){stu.setAge(Integer.parseInt(info.trim()));}}}@Overridepublic void endDocument() throws SAXException {// Todo Auto-generated method stubsuper.endDocument();}@Overridepublic void endElement(String arg0,String arg1,String arg2)throws SAXException {// Todo Auto-generated method stubsuper.endElement(arg0,arg2);if(arg2.equals("student")){list.add(stu);stu = null;//每一次访问完了一个根元素事件都将stu置空}tag = null;//同样将tag标签指定的位置置空}@Overridepublic void startDocument() throws SAXException {// Todo Auto-generated method stubsuper.startDocument();list = new ArrayList<Student>();//从list中开始访问}@Overridepublic void startElement(String arg0,String arg2,Attributes arg3) throws SAXException {// Todo Auto-generated method stubsuper.startElement(arg0,arg2,arg3);if(arg2.equals("student")){stu = new Student();String id_str = arg3.getValue("stuId");stu.setId(Integer.parseInt(id_str.trim()));}tag = arg2;}}
 在使用sax进行解析的时候用到了的方法可以参考jdk-api文档 

4,使用一个demo类进行测试
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class Demo {

	public static void main(String[] args) throws Exception{

		//--1、获得解析器的工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//--2、从工厂获得解析器
		SAXParser parser = factory.newSAXParser();
		//--3、实例化事件驱动对象
		MySax sax = new MySax();
		//--4、把xml文件与事件驱动绑定到解析器上
		parser.parse("Students.xml",sax);
		//--5、获得xml文件中的对象
		List<Student> list = sax.getList();
		for(Student stu:list){
			System.out.println(stu);
		}
		
		
		
	}

}
关于另一中dom解析已经编写可以去我的博客中找找
具体代码可以下载链接:http://download.csdn.net/download/zhangvalue/9204199

原文地址:https://www.jb51.cc/xml/295969.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。