package com.test;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
/**
*
* @Description:SAX解析
* SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。
* 而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
* 这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;
* 它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,
当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,
SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据
*
*/
public class SaxXmlReader {
public void test()
{
try {
//创建sax工厂
SAXParserFactory saxFactory = SAXParserFactory.newInstance();
SAXParser saxParse = saxFactory.newSAXParser();
//产生一个事件监听器
MySaxHandler xmlHandler = new MySaxHandler();
//解析这个流,并注册监听器
saxParse.parse(new File("F:\\bb.xml"), xmlHandler);
System.out.println(xmlHandler.getPersons());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SaxXmlReader demo = new SaxXmlReader();
demo.test();
}
}
package com.test;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
*
* xml文件被Sax解析器载入,由于Sax解析是按照xml文件的顺序来解析,当读入<?xml.....>时,
* 会调用startDocument()方法,当读入<books>的时候,由于它是个ElementNode,
* 所以会调用startElement(String uri, String localName, String qName, Attributes attributes) 方法,
* 其中第二个参数就是节点的名称,注意:由于有些环境不一样,有时候第二个参数有可能为空,
* 所以可以使用第三个参数,因此在解析前,先调用一下看哪个参数能用,第4个参数是这个节点的属性
*/
public class MySaxHandler extends DefaultHandler{
private ArrayList<Person> persons;
private Person person;
private String tagName;
public ArrayList<Person> getPersons()
{
return persons;
}
@Override
public void startDocument() throws SAXException
{
this.persons = new ArrayList<Person>();
}
//开始读数据
@Override
public void startElement(String uri, String localName,String qName, Attributes attributes)
{
this.tagName = qName;
if(this.tagName.equals("person"))
{
person = new Person();
person.setId(Integer.parseInt(attributes.getValue(0)));
}
}
// 取出数据
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
if (this.tagName != null)
{
String data = new String(ch, start, length);
if (this.tagName.equals("name"))
{
this.person.setName(data);
}
else if (this.tagName.equals("age"))
{
this.person.setAge(Integer.parseInt(data));
}
}
}
@Override
public void endElement(String uri, String localName, String qName)throws SAXException
{
if (qName.equals("person"))
{
this.persons.add(person);
}
this.tagName = null;
}
}
public class Person {
private int id;
private String name;
private int age;
public Person() {
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = 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() {
return "姓名:" + this.name + ",年龄:" + this.age;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE RESULT>
<persons>
<person id="1">
<name>张三</name>
<age>24</age>
</person>
<person id="2">
<name>李四</name>
<age>25</age>
</person>
<person id="3">
<name>王五</name>
<age>26</age>
</person>
</persons>