2017/4/25-SAX解析XML文件

时间:2023-12-28 16:12:32

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