java SAX生成和解析xml

SAX解析

场景:从上往下线性读取xml时

          解析比较大的xml文档时

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

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

SAX解析步骤

第一步:创建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");//设置字符集

扫描二维码关注公众号,回复: 3195080 查看本文章

第四步:创建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();

第七步:创建元素节点

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

第八步:设置标签内容

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

第九步:关闭doc对象

SAX生成xml

package com.xm.xml.sax;

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;

/**
 * java 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效果图:

SAX解析xml

package com.xm.xml.sax;

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;

/**
 * java 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("</" + qName + ">");
	}

	@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);
		}
	}

}

控制台打印效果图:

本章完结,待续!

本文说明:该文章属于原创,如需转载,请标明文章转载来源

猜你喜欢

转载自blog.csdn.net/p812438109/article/details/81812012