API来源:在JDK中org.xml.*包下
使用场景:
1、从上往下线性读取XML时
2、解析比较大的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效果图:
实现步骤:
第一步:继承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("" + 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);
}
}
}
XML解析效果图打印:
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!