sax解析xml,验证格式并支持自定义schema

一、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()

  

  

猜你喜欢

转载自www.cnblogs.com/yangmengdx3/p/8947922.html
今日推荐