Java SAX生成和解析XML

一)SAX介绍

API来源:在JDK中org.xml.*包下

 

使用场景:

1、从上往下线性读取XML时

2、解析比较大的XML文档时

 

优点:读取速度快,内存消耗小

缺点:只能知道当前节点的信息,如需知道其它信息,需要自己编码实现

 

二)SAX生成XML

第一步:创建一个SAX转换工厂

SAXTransformerFactory factory = (SAXTransformerFactory)SAXTransformerFactory.newInstance();

 

第二步:创建一个TransformerHandler实例

TransformerHandler handler = factory.newTransformerHandler();

 

第三步:创建一个handler转换器

Transformer transformer = handler.getTransformer();

transformer.setOutputProperty(OutputKeys.INDENT, "yes");//换行
transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");//设置字符集

 

第四步:创建一个Result实例连接到XML文件

Result result = new StreamResult(new FileOutputStream(new File("E:\\sax.xml")));

handler.setResult(result);

 

第五步:创建一个属性实例,每次创建时,最好清除一下,如attr.clean();

AttributesImpl attr = new AttributesImpl();

attr.clear();

attr.addAttribute("", "", "attr", "", "root");

 

第六步:打开doc对象

handler.startDocument();

 

第七步:创建元素节点,并构建XML内容

handler.startElement(uri, 命名空间, 元素名, 属性); //没有则填null

 

第八步:设置标签内容

characters(char ch[], int start, int length)

 

第九步:关闭doc对象,在指定的路径输出XML文件

 

实现源码:

package com.oysept.xml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

/**
 * SAX生成XML
 * @author ouyangjun
 */
public class CreateSAX {

    public static void main(String[] args) {
        // 执行SAX生成XML方法
        createSAX(new File("E:\\sax.xml"));
    }
	
    public static void createSAX(File file) {
        try {
            // 创建一个SAX转换工厂
            SAXTransformerFactory factory = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
			
            // 创建一个TransformerHandler实例
            TransformerHandler handler = factory.newTransformerHandler();
			
            // 创建一个handler转换器
            Transformer transformer = handler.getTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 换行
            transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); // 字符集
			
            // 创建一个Result实例连接到XML文件
            Result result = new StreamResult(new FileOutputStream(file));
            handler.setResult(result);
			
            // 创建一个属性实例, addAttribute(String uri, String localName, String qName, String type, String value)
            AttributesImpl attr = new AttributesImpl();
			
            // 打开doc对象
            handler.startDocument();
			
            // 创建元素: handler.startElement(uri, 命名空间, 元素名, 属性列表);//没有则填null
            handler.startElement("", "", "root", attr);
			
            // 每次创建节点前,先清空属性,放置一些属性错误
            attr.clear();
            // 设置属性
            attr.addAttribute("", "", "attr", "", "one");
            // 根节点第一个子节点person
            handler.startElement("", "", "person", attr);
				
                attr.clear();
                attr.addAttribute("", "", "attr", "", "one");
                // 第一个子节点的第一个子节点people
                handler.startElement("", "", "people", attr);
                handler.characters("one child people one".toCharArray(), 0, 14);
                handler.endElement("", "", "people");
				
                attr.clear();
                attr.addAttribute("", "", "attr", "", "two");
                // 第一个子节点的第二个子节点people
                handler.startElement("", "", "people", attr);
                handler.characters("one child people two".toCharArray(), 0, 14);
                handler.endElement("", "", "people");
			
            handler.endElement("", "", "person");
			
            // 每次创建节点前,先清空属性,放置一些属性错误
            attr.clear();
            // 设置属性
            attr.addAttribute("", "", "attr", "", "two");
            // 根节点第二个子节点person
            handler.startElement("", "", "person", attr);
				
                attr.clear();
                attr.addAttribute("", "", "attr", "", "one");
                // 第二个子节点的第一个子节点people
                handler.startElement("", "", "people", attr);
                handler.characters("two child people one".toCharArray(), 0, 14);
                handler.endElement("", "", "people");
				
                attr.clear();
                attr.addAttribute("", "", "attr", "", "two");
                // 第二个子节点的第二个子节点people
                handler.startElement("", "", "people", attr);
                handler.characters("two child people two".toCharArray(), 0, 14);
                handler.endElement("", "", "people");
			
            handler.endElement("", "", "person");
			
            // 结束hanlder.endElement("", "", 元素名)
            handler.endElement("", "", "root");
			
            // 关闭doc对象
            handler.endDocument();
            System.out.println("SAX CreateSAX success!");
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

XML效果图:

 

Java SAX生成和解析XML_第1张图片

 

三)SAX解析XML

实现步骤:

第一步:继承org.xml.sax.helpers.DefaultHandler类,重写几个方法

 

第二步:创建一个SAX解析工厂

SAXParserFactory factory = SAXParserFactory.newInstance();

 

第三步:创建一个SAX转换工具

SAXParser saxParser = factory.newSAXParser();

 

第四步:解析XML并打印到控制台

saxParser.parse(inputFile, new ParseSAX());

 

实现源码:

package com.oysept.xml;

import java.io.File;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * SAX解析XML
 * @author ouyangjun
 * 备注: SAX由于是事件驱动解析,相当于从上往下解析,所以继承DefaultHandler重写里面的解析方法
 */
public class ParseSAX extends DefaultHandler {

    public static void main(String[] args) {
        try {	
            File inputFile = new File("E:\\sax.xml");
			
            // 创建一个SAX解析工厂
            SAXParserFactory factory = SAXParserFactory.newInstance();
            // 创建一个SAX转换工具
            SAXParser saxParser = factory.newSAXParser();
            // 解析XML
            saxParser.parse(inputFile, new ParseSAX());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("<" + qName + ">");
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println("");
    }

    @Override
    public void characters(char ch[], int start, int length) throws SAXException {
        String str = new String(ch, start, length);
        if (!"\n".equals(str)) {
            System.out.print(str);
        }
    }
}

XML解析效果图打印:

 

Java SAX生成和解析XML_第2张图片

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

你可能感兴趣的:(XML)