2017/4/25-SAX解析XML文件
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

浙公网安备 33010602011771号