实现思路:
- 在工程中引入Xerces-J具体解析器实现类jar包
- 自定义事件监听器继承自DefaultHandler
- 通过SAXparseFactory的newInstance()方法创建SAX解析器工厂对象
- 通过SAXparseFactory对象的newSAXparser()方法创建SAXParser对象
- 调用SAXParser对象的parse()方法解析XML文档
package com.muke.sax;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;import com.muke.sax.handler.Handler;public class SAXParse { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { // TODO Auto-generated method stub // 1、获取sax解析器的工厂对象 SAXParserFactory factory = SAXParserFactory.newInstance(); // 2、通过工厂对象SAXPArser创建解析器 SAXParser saxParser = factory.newSAXParser(); // 3、通过解析saxParser的parse()方法设定解析的文件和自己定义的事件处理对象 saxParser.parse("C://Users/admin/Desktop/data.xml", new Handler()); }}复制代码
自定义监听器
package com.muke.sax.handler;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class Handler extends DefaultHandler { // 定义一个变量来保存当前正在处理的tag private String currentTag; // 每当处理文本数据时将触发该方法 @Override public void characters(char[] ch, int start, int length) throws SAXException { String content = new String(ch,start,length); if(content.trim().length()>0){ System.out.println("<"+currentTag+">元素的值是:"+content); } } // 解析文档结束时触发该方法 @Override public void endDocument() throws SAXException { System.out.println("解析文档结束"); } // 每当解析元素时结束该方法 @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("处理元素结束:"+qName); } // 解析文档开始时 @Override public void startDocument() throws SAXException { System.out.println("解析文档开始"); } // 每当解析元素开始时触发该方法 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("开始处理元素:"+qName); currentTag=qName; if(attributes.getLength()>0){ System.out.println("<"+currentTag+">元素的属性如下:"); for(int i=0;i"+attributes.getValue(i)); } } } }复制代码
SAX生成XML文档
实现思路:
- 创建保存XML的结果流对象
- 获取sax生产工厂对象实例
- 获取sax生产处理者对象实例
- 获取sax生产器
- 生产文档以及文档中的元素
package com.muke.sax;import java.io.File;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.sax.SAXTransformerFactory;import javax.xml.transform.sax.TransformerHandler;import javax.xml.transform.stream.StreamResult;import org.xml.sax.helpers.AttributesImpl;public class SaxCreateXML { public static void main(String[] args) throws Exception{ // 1、创建保存XML的结果流对象 StreamResult resultXML = new StreamResult(new File("C://Users/admin/Desktop/datas.xml")); // 2、获取sax生成工厂实例 SAXTransformerFactory saxTransformerFactory=(SAXTransformerFactory)SAXTransformerFactory.newInstance(); // 3、获取SAX生产处理对象实例 TransformerHandler transformerHandler=saxTransformerFactory.newTransformerHandler(); transformerHandler.setResult(resultXML); //获取SAX生成器 Transformer transformer=transformerHandler.getTransformer(); // 设置参数,允许设置空格 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //因为默认生成的文档字符编码为utf-8,故不多做设置 // 生成文档开始 transformerHandler.startDocument(); // 生成属性,此处生成空属性,设置属性可以使用AttributesImpl.add方式来设置 AttributesImpl attributesImpl=new AttributesImpl(); //生成元素开始 transformerHandler.startElement("", "", "书籍列表", attributesImpl); transformerHandler.startElement("", "", "计算机书籍", attributesImpl); transformerHandler.startElement("", "", "书名", attributesImpl); transformerHandler.characters("Java思想".toCharArray(), 0, "Java思想".length()); transformerHandler.endElement("", "", "书名"); transformerHandler.endElement("", "", "计算机书籍"); transformerHandler.startElement("", "", "计算机书籍", attributesImpl); transformerHandler.startElement("", "", "书名", attributesImpl); transformerHandler.characters("Spring指南".toCharArray(), 0, "Spring指南".length()); transformerHandler.endElement("", "", "书名"); transformerHandler.endElement("", "", "计算机书籍"); transformerHandler.endElement("", "", "书籍列表"); transformerHandler.endDocument(); System.out.println("生成文档成功!"); }}复制代码