zoukankan      html  css  js  c++  java
  • Java操作XML(2)--SAX方式处理XML

    SAX是一个用于处理XML事件驱动的“推”模型,虽然它不是W3C标准,但它却是一个得到了广泛认可的API。本文主要介绍Java SAX方式处理XML,文中所使用到的软件版本:Java 1.8.0_191。

    1、SAX简介

          SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

    1.1、SAX的优点

    1、顺序读入文档并产生相应事件,可以处理任何大小的XML文档。
    2、适用于只需要文档的部分内容,或者只需要从文档中得到特定信息。

    1.2、SAX的缺点

    1、只能对文档按顺序解析一遍,不支持对文档的随意访问。
    2、只能读取XML文档内容,而不能修改。
    3、开发上比较复杂,需要自己来实现事件处理器。

    2、Java SAX方式操作XML

    2.1、XML文件

    <?xml version="1.0" encoding="utf-8" ?>
    <school:class xmlns:school="http://www.w3.org/TR/html4/school/">
        <school:student rollno="1" school:testattr="test">
            <school:firstname>cxx1</school:firstname>
            <lastname>Bob1</lastname>
            <nickname>stars1</nickname>
            <marks>85</marks>
        </school:student>
        <student rollno="2">
            <firstname>cxx2</firstname>
            <lastname>Bob2</lastname>
            <nickname>stars2</nickname>
            <marks>85</marks>
        </student>
        <student rollno="3">
            <firstname>cxx3</firstname>
            <lastname>Bob3</lastname>
            <nickname>stars3</nickname>
            <marks>85</marks>
        </student>
    </school:class>

    2.2、Java代码例子

    该例子演示如何使用SAX方式解析XML以及使用SAX方式来生成XML。

    package com.abc.demo.general.xml;
    
    import org.junit.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.AttributesImpl;
    import org.xml.sax.helpers.DefaultHandler;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    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 java.io.ByteArrayOutputStream;
    
    public class SaxCase {
        private static Logger logger = LoggerFactory.getLogger(DomCase.class);
    
        /**
         * 解析xml
         * @throws Exception
         */
        @Test
        public void parse() throws Exception {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            SaxHandler handler = new SaxHandler(logger);
            parser.parse(DomCase.class.getResourceAsStream("student.xml"), handler);
        }
    
        /**
         * 生成xml
         * @throws Exception
         */
        @Test
        public void toXml() throws Exception {
            //创建SAX转换工厂
            SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
            TransformerHandler handler = factory.newTransformerHandler();
    
            //创建handler转换器
            Transformer transformer = handler.getTransformer();
            //换行
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
    
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            StreamResult streamResult = new StreamResult(out);
            handler.setResult(streamResult);
    
            AttributesImpl attributes = new AttributesImpl();
            //打开doc对象
            handler.startDocument();
            handler.startElement("http://www.w3.org/TR/html4/school/", "", "school:class", null);
    
            //第一个学生
            attributes.clear();
            attributes.addAttribute("", "", "rollno", "", "1");
            attributes.addAttribute("", "", "school:testattr", "", "test");
            handler.startElement("", "", "student", attributes);
            handler.startElement("", "", "school:firstname", null);
            handler.characters("cxx1".toCharArray(), 0, 4);
            handler.endElement("", "", "school:firstname");
            handler.startElement("", "", "lastname", null);
            handler.characters("Bob1".toCharArray(), 0, 4);
            handler.endElement("", "", "lastname");
            handler.startElement("", "", "nickname", null);
            handler.characters("stars1".toCharArray(), 0, 6);
            handler.endElement("", "", "nickname");
            handler.startElement("", "", "marks", null);
            handler.characters("85".toCharArray(), 0, 2);
            handler.endElement("", "", "marks");
            handler.endElement("", "", "student");
            //第二个学生
            attributes.clear();
            attributes.addAttribute("", "", "rollno", "", "2");
            handler.startElement("", "", "student", attributes);
            handler.startElement("", "", "firstname", null);
            handler.characters("cxx2".toCharArray(), 0, 4);
            handler.endElement("", "", "firstname");
            handler.startElement("", "", "lastname", null);
            handler.characters("Bob2".toCharArray(), 0, 4);
            handler.endElement("", "", "lastname");
            handler.startElement("", "", "nickname", null);
            handler.characters("stars2".toCharArray(), 0, 6);
            handler.endElement("", "", "nickname");
            handler.startElement("", "", "marks", null);
            handler.characters("85".toCharArray(), 0, 2);
            handler.endElement("", "", "marks");
            handler.endElement("", "", "student");
            //第三个学生
            attributes.clear();
            attributes.addAttribute("", "", "rollno", "", "3");
            handler.startElement("", "", "student", attributes);
            handler.startElement("", "", "firstname", null);
            handler.characters("cxx3".toCharArray(), 0, 4);
            handler.endElement("", "", "firstname");
            handler.startElement("", "", "lastname", null);
            handler.characters("Bob3".toCharArray(), 0, 4);
            handler.endElement("", "", "lastname");
            handler.startElement("", "", "nickname", null);
            handler.characters("stars3".toCharArray(), 0, 6);
            handler.endElement("", "", "nickname");
            handler.startElement("", "", "marks", null);
            handler.characters("85".toCharArray(), 0, 2);
            handler.endElement("", "", "marks");
            handler.endElement("", "", "student");
    
            handler.endElement("", "", "school:class");
    
            handler.endDocument();
            logger.info(out.toString());
        }
    }
    
    class SaxHandler extends DefaultHandler {
        private String value;
    
        private Logger logger;
        public SaxHandler(Logger logger) {
            this.logger = logger;
        }
    
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            logger.info("SAX解析开始");
        }
    
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
            logger.info("SAX解析结束");
        }
    
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            if (qName.equals("student") || qName.equals("school:student")) {
                logger.info("学生编号" + attributes.getValue("rollno"));
                if (attributes.getValue("school:testattr") != null) {
                    logger.info("testattr=" + attributes.getValue("school:testattr"));
                }
            } else if (qName.equals("firstname") || qName.equals("lastname") || qName.equals("nickname") || qName.equals("marks")) {
                //logger.info(qName + "开始");
            }
        }
    
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            super.endElement(uri, localName, qName);
            if (qName.equals("firstname") || qName.equals("school:firstname") || qName.equals("lastname") || qName.equals("nickname") || qName.equals("marks")) {
                logger.info(qName + ":" + value);
            }
        }
    
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            value = new String(ch, start, length);
            if (!value.trim().equals("")) {
    //            logger.info("节点值是:" + value);
            }
        }
    }
  • 相关阅读:
    JVM活学活用——GC算法 垃圾收集器
    JVM活学活用——类加载机制
    JVM活学活用——Jvm内存结构
    优化springboot
    Java基础巩固计划
    Java自定义注解
    记一次内存溢出的分析经历
    redis学习笔记-redis的安装
    记一次线程池调优经历
    Python中关于split和splitext的差别和运用
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/14268108.html
Copyright © 2011-2022 走看看