一、sax简介
SAX是事件驱动型的XML解析方式。顺序读取XML文件,生成事件,传播到用户定义的回调方法中来处理XML文件。
优点:
分段处理xml,而不是将整个xml一次加载进内存,内存占用少,速度快。
缺点:
顺序访问,不能回退。编码复杂,需要用户把控数据结构。
二、使用流程
1.创建工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
2.设置工厂属性(可选)
saxParserFactory.setValidating(true); // 是否验证xml,默认false saxParserFactory.setNamespaceAware(true); // 是否展示命名空间 默认false
3.生成解析器
SAXParser parser = saxParserFactory.newSAXParser();
4.设置解析器属性(可选)
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); // 验证模式下必须
5.获取XMLReader(可选)
XMLReader reader = parser.getXMLReader();
6.设置XMLReader属性(可选)
reader.setContentHandler(new MyDefalutHandler()); // 内容处理器 reader.setEntityResolver(new MyEntityResolver()); // schama解析器 reader.setErrorHandler(new MyErrorHandler()); // 异常处理器
7.解析xml文件
reader.parse(SaxDemo.class.getResource("/").getPath() + "/saxDemo.xml");
或者 parser.parse(SaxDemo.class.getResource("/").getPath() + "/saxDemo.xml", new DefaultHandler());
SAXParser和XMLReader都可以对xml进行解析,但是SAXParser将异常处理、内容处理和schema解析放到一个handler中进行重载,个人觉得职责划分不是很清晰,建议使用XMLReader。
三、常规使用代码示例
saxDemo.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd" default-autowire="byName"> <aop:annotation-driven></aop:annotation-driven> <util:map key-type="java.lang.String" value-type="java.lang.String"> <entry key="key" value="value"></entry> </util:map> <bean id="commonMap" class="java.util.HashMap"> <constructor-arg> <map> <entry key="key" value="value"></entry> </map> </constructor-arg> </bean> </beans>
MyDefalutHandler
public class MyDefalutHandler extends DefaultHandler{ @Override public void startDocument() throws SAXException { System.out.println("startDocument()"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { StringBuilder builder = new StringBuilder(); int length = attributes.getLength(); if (length > 0) { for (int i = 0; i < length; i++) { builder.append(attributes.getLocalName(i).trim()) .append(":") .append(attributes.getValue(i).trim()) .append(" "); } } System.out.println(String.format("startElement uri=%s localName=%s qname=%s attributes=%s", uri, localName, qName, builder)); } @Override public void characters(char[] ch, int start, int length) throws SAXException { String content = new String(ch, start, length); if (StringUtils.isNotBlank(content)) { System.out.println("characters=" + content); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println(String.format("startElement uri=%s localName=%s qname=%s", uri, localName, qName)); } @Override public void endDocument() throws SAXException { System.out.println("endDocument()"); } }
测试类
public class SaxDemo { public static void main(String[] args) throws Exception { SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); SAXParser parser = saxParserFactory.newSAXParser(); XMLReader reader = parser.getXMLReader(); reader.setContentHandler(new MyDefalutHandler()); // 内容处理器 reader.parse(SaxDemo.class.getResource("/").getPath() + "/saxDemo.xml"); } }
测试结果
startDocument() startElement uri= localName= qname=beans attributes=xmlns:http://www.springframework.org/schema/beans xmlns:xsi:http://www.w3.org/2001/XMLSchema-instance xmlns:util:http://www.springframework.org/schema/util xmlns:aop:http://www.springframework.org/schema/cache xsi:schemaLocation:http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd default-autowire:byName startElement uri= localName= qname=aop:annotation-driven attributes= startElement uri= localName= qname=aop:annotation-driven startElement uri= localName= qname=util:map attributes=key-type:java.lang.String value-type:java.lang.String startElement uri= localName= qname=entry attributes=key:key value:value startElement uri= localName= qname=entry startElement uri= localName= qname=util:map startElement uri= localName= qname=bean attributes=id:commonMap class:java.util.HashMap startElement uri= localName= qname=constructor-arg attributes= startElement uri= localName= qname=map attributes= startElement uri= localName= qname=entry attributes=key:key value:value startElement uri= localName= qname=entry startElement uri= localName= qname=map startElement uri= localName= qname=constructor-arg startElement uri= localName= qname=bean startElement uri= localName= qname=beans endDocument()