sax parses xml, validates the format and supports custom schema

1. Introduction to sax

  SAX is an event-driven way of parsing XML. Sequentially reads XML files, generates events, and propagates them to user-defined callback methods to process XML files.

  advantage:

    Process xml in segments instead of loading the whole xml into memory at one time, with less memory usage and faster speed.

  shortcoming:

    Sequential access, no rollback. Coding is complex and requires users to control the data structure.

 

Second, the use process

  1. Create a factory

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

   2. Set factory properties ( optional )

saxParserFactory.setValidating(true); // Whether to validate xml, default false
saxParserFactory.setNamespaceAware(true); // Whether to display the namespace default false

   3. Generate the parser

SAXParser parser = saxParserFactory.newSAXParser();

  4. Set parser properties ( optional)

parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); // Required in validation mode

   5. Get XMLReader ( optional)

XMLReader reader = parser.getXMLReader();

   6. Set the XMLReader property ( optional)

reader.setContentHandler(new MyDefalutHandler()); // content handler
reader.setEntityResolver(new MyEntityResolver()); // schama解析器
reader.setErrorHandler(new MyErrorHandler()); // exception handler

   7. Parse the xml file

reader.parse(SaxDemo.class.getResource("/").getPath() + "/saxDemo.xml");
  或者 parser.parse(SaxDemo.class.getResource("/").getPath() + "/saxDemo.xml", new DefaultHandler());

   Both SAXParser and XMLReader can parse xml , but SAXParser overloads exception handling, content processing, and schema parsing into a single handler. Personally, I think the division of responsibilities is not very clear. It is recommended to use XMLReader.

3. Regular use of code examples

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()");
    }
}

 test class

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()); // content handler
        reader.parse(SaxDemo.class.getResource("/").getPath() + "/saxDemo.xml");
    }
}

 Test Results

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

 

 

  

  

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324853967&siteId=291194637