2015年06月09日 Java XML 浏览(229) 收藏

Java如何使用SAX生成和解析XML详解

SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。

1. 首先下载依赖包,本例子使用的jar  sax-2.0.1.jar
下载地址:http://central.maven.org/maven2/sax/sax/2.0.1/sax-2.0.1.jar
maven 依赖如下:

<dependency>
    <groupId>sax</groupId>
    <artifactId>sax</artifactId>
    <version>2.0.1</version>
</dependency>

2. 使用Sax 创建XML文档的代码

/**
 * 创建Sax Xml文档
 */
public class XmlSAXCreateTester {
	public static void main(String[] args) throws Exception {
		createXml();
	}

	public static void createXml() throws Exception {
		String path = XmlSAXTester.class.getClassLoader().getResource("com/xml/student.xml").getPath();
		OutputStream out = new FileOutputStream(path);
		Result resultXml = new StreamResult(out);
		// StringWriter xmlWriter = new StringWriter();
		// Result resultXml = new StreamResult(xmlWriter);
		SAXTransformerFactory sff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
		TransformerHandler th = sff.newTransformerHandler();
		th.setResult(resultXml);

		Transformer transformer = th.getTransformer();
		transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); // 编码格式是UTF-8
		transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 换行
		th.startDocument(); // 开始xml文档
		AttributesImpl attr1 = new AttributesImpl();
		attr1.addAttribute("", "", "id", "", "1");
		attr1.addAttribute("", "", "group", "", "1");
		th.startElement("", "", "root", null);
		th.startElement("", "", "student", attr1);
		th.startElement("", "", "name", null);
		th.characters("张三".toCharArray(), 0, "张三".length());
		th.endElement("", "", "name");
		th.startElement("", "", "sex", null);
		th.characters("男".toCharArray(), 0, "男".length());
		th.endElement("", "", "sex");
		th.startElement("", "", "age", null);
		th.characters("18".toCharArray(), 0, "18".length());
		th.endElement("", "", "age");
		th.startElement("", "", "birthday", null);
		th.characters("1990-09-09".toCharArray(), 0, "1990-09-09".length());
		th.endElement("", "", "birthday");
		th.endElement("", "", "student");

		AttributesImpl attr2 = new AttributesImpl();
		attr2.addAttribute("", "", "id", "", "2");
		attr2.addAttribute("", "", "group", "", "2");
		th.startElement("", "", "student", attr2);
		th.startElement("", "", "name", null);
		th.characters("李四".toCharArray(), 0, "李四".length());
		th.endElement("", "", "name");
		th.startElement("", "", "sex", null);
		th.characters("女".toCharArray(), 0, "女".length());
		th.endElement("", "", "sex");
		th.startElement("", "", "age", null);
		th.characters("17".toCharArray(), 0, "17".length());
		th.endElement("", "", "age");
		th.startElement("", "", "birthday", null);
		th.characters("1990-10-10".toCharArray(), 0, "1990-10-10".length());
		th.endElement("", "", "birthday");
		th.endElement("", "", "student");
		th.endElement("", "", "root");
		th.endDocument(); // 结束xml文档
		// System.out.println(xmlWriter.toString());
	}
}

生成的XML文档格式如下:(这里有人工格式化)

<?xml version="1.0" encoding="UTF-8"?>  
<root>  
    <student id="1" group="1">  
        <name>张三</name>  
        <sex>男</sex>  
        <age>18</age>  
        <birthday>1990-09-09</birthday>   
    </student>  
    <student id="2" group="2">  
        <name>李四</name>  
        <sex>女</sex>  
        <age>17</age>  
        <birthday>1990-10-10</birthday>  
    </student>  
</root>

3. 使用Java SAX 解析XML文档的代码部分

/**
 * @from www.everycoding.com
 * @Description:Java SAX生成和解析XML详解
 */
public class XmlSAXTester {
	
	public static void main(String[] args) throws Exception {
		SAXParser parser = null;  
        try {  
            //构建SAXParser  
            parser = SAXParserFactory.newInstance().newSAXParser();  
            //实例化  DefaultHandler对象  
            StudentXmlParser parseXml=new StudentXmlParser();  
            //加载资源文件 转化为一个输入流  
            InputStream stream=XmlSAXTester.class.getClassLoader().getResourceAsStream("com/xml/student.xml"); 
            //InputStream stream= new FileInputStream(new File("C:/mydir/student.xml"));
            //调用parse()方法  
            parser.parse(stream, parseXml);  
            //遍历结果  
            Listlist=parseXml.getList();  
            for(Student student:list){  
                System.out.println("id:"+student.getId()+"\tgroup:"+student.getGroup()+"\tname:"+student.getName()+"\tsex:"+student.getSex()+"\tage:"+student.getAge()+"\tbirthday:"+student.getBirthday());  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }
	}
}

class Student {
	private Long id;
	private String group;
	private String name;
	private String sex;
	private Integer age;
	private String birthday;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getGroup() {
		return group;
	}
	public void setGroup(String group) {
		this.group = group;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
}

class StudentXmlParser extends DefaultHandler {
	// 存放遍历集合
	private Listlist;
	// 构建Student对象
	private Student student;
	// 用来存放每次遍历后的元素名称(节点内的属性名称)
	private String tagName;

	public ListgetList() {
		return list;
	}

	public void setList(Listlist) {
		this.list = list;
	}

	public Student getStudent() {
		return student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}

	public String getTagName() {
		return tagName;
	}

	public void setTagName(String tagName) {
		this.tagName = tagName;
	}

	/**
	 * 只调用一次 初始化list集合
	 */
	@Override
	public void startDocument() throws SAXException {
		list = new ArrayList();
	}

	/**
	 * 调用多次 开始解析
	 */
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		if (qName.equals("student")) {
			student = new Student();
			// 获取student节点上的id属性值
			student.setId(Long.parseLong(attributes.getValue(0)));
			// 获取student节点上的group属性值
			student.setGroup(attributes.getValue(1));
		}
		this.tagName = qName;
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		if (qName.equals("student")) {
			this.list.add(this.student);
		}
		this.tagName = null;
	}

	/**
	 * 只调用一次
	 */
	@Override
	public void endDocument() throws SAXException {
	}

	/**
	 * 调用多次
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		if (this.tagName != null) {
			String date = new String(ch, start, length);
			if (this.tagName.equals("name")) {
				this.student.setName(date);
			} else if (this.tagName.equals("sex")) {
				this.student.setSex(date);
			} else if (this.tagName.equals("age")) {
				this.student.setAge(Integer.parseInt(date));
			} else if (this.tagName.equals("birthday")) {
				this.student.setBirthday(date);
			}
		}
	}
}

解析XML执行的结果如下:

id:1	group:1	name:张三	sex:男	age:18	birthday:1990-09-09
id:2	group:2	name:李四	sex:女	age:17	birthday:1990-10-10


赞一下 0 人赞了本文