SAX解析XML
1、分析
SAX是按照XML文件的顺序执行,可以说是边扫描,边解析。所以无须将整个文件加载至内存中。
2、优点
1)占用内存少。
2)解析效率高。
3、缺点
1)只能进行读取。
2)无法修改xml中节点数据。
3)无法知道正在遍历的节点的上一节点的名称,并且无法任意访问某一节点。
4、使用场合
1)大型XML文件,并且只需要一次性读取xml文件的内容。
5、讲解
1)自定义解析类需继承DefaultHandler( org.xml.sax.helpers.DefaultHandler)。
2)重写父类中的多个方法即可。
a)startDocument() : 该方法是开始解析xml的方法。
b)startElement() : 该方法是解析某个标签(<name>),获取当前标签名称及属性。
c)characters() : 在解析到某个标签时,获取标签内容值的时候调用。
d)endElement() : 该方法为某个标签(</name>)解析完后调用。
e)endDocument() : 该方法为整个xml文件解析完时调用。
6、详解
1)XML文件示例
<?xml version="1.0" encoding="utf-8"?> <books>
<book>
<id>10001</id>
<name>JAVA BOOK</name>
<author>James Gosling</author>
<publishDate>2017-04-24</publishDate>
</book>
<book>
<id>10002</id>
<name>C BOOK</name>
<author>Dennis Ritchie</author>
<publishDate>2017-04-24</publishDate>
</book>
</books>
2)自定义SAXParserHandler类,继承DefaultHandler类,重写5个方法。
package com.mean.xml.sax.handler; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; /**
* SAX解析XML文件
* @author zhangjk
*/
public class SAXParserHandler extends DefaultHandler {
private boolean isUsefulElement; public SAXParserHandler() {
isUsefulElement = false;
} @Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("--------开始解析XML--------");
} @Override
public void startElement(String uri, String localName, String element, Attributes attributes) throws SAXException {
if (element.equals("books")) {
isUsefulElement = true;
} else if (element.equals("book")) {
System.out.println("--------开始解析本书--------");
isUsefulElement = true;
} else {
System.out.println("element:" + element);
isUsefulElement = false;
}
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (!isUsefulElement) {
String value = new String(ch, start, length).trim();
if (!value.isEmpty()) {
System.out.println("value:" + value);
}
}
} @Override
public void endElement(String uri, String localName, String element) throws SAXException {
if (element.equals("book")) {
System.out.println("--------书本解析完毕--------");
}
} @Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("--------XML解析完毕--------");
} public static SAXParserHandler getInstance() {
if (SAXParserHanderSingle.INSTANCE == null) {
SAXParserHanderSingle.INSTANCE = new SAXParserHandler();
}
return SAXParserHanderSingle.INSTANCE;
} private static class SAXParserHanderSingle {
private static SAXParserHandler INSTANCE = new SAXParserHandler();
}
}
7、步骤
1)首先获取SAXParserFactory(SAX解析工厂)对象。
2)从SAXParserFactory对象中获取SAXParser(SAX解析)对象。
3)创建自定义的SAXParserHandler类对象。
4)调用步骤2中SAX解析对象的parse()方法,参数分别为XML文件的输入流,自定义的SAX解析类。
String path = Class.class.getResource("/").getPath() + "Book.xml";
try {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
SAXParserHandler sax = SAXParserHandler.getInstance();
saxParser.parse(new FileInputStream(new File(path)), sax);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
注:本文部分参考引用
1、http://blog.csdn.net/ydxlt/article/details/50183693