java文档操作之—— SAX解析

作者:叁念

java文档操作之—— SAX解析


1.相关概念略解

【序列化】把一个对象的状态信息转化为可以存储或者传输的形式的过程

  • 序列化: 把对象转化成二进制信息的过程
  • 反序列化:把二进制信息转回对象的过程

    序列化的目的:

    1. 以某种形式使自定义对象永久保存
    2. 将对象从一个地方传输到另一个地方

【XML】 可拓展标记语言

XML的作用
将数据格式转化成XML格式之后,真正实现了跨平台的数据共享
在不同语言中,XML的解析方式都是一样的

SAX 解析优缺点
优点:占用内存小
缺点:只读只进,一次读取

XML语法规则
1. 所有元素必须有关闭标签
2. 大小写敏感
3. 必须正确的嵌套
4. 必须有根元素
5. 属性值必须加引号
6. 空格会被保留

xml文件举例:

<?xml version="1.0" encoding="utf-8"?>
<fruits>
  <fruit id="1">
    <name>苹果</name>
    <price>3.0</price>
    <count>51</count>
  </fruit>
  <fruit id="2">
    <name>香蕉</name>
    <price>3.5</price>
    <count>17</count>
  </fruit>
  <fruit id="3">
    <name>生梨</name>
    <price>2.5</price>
    <count>15</count>
  </fruit>
  <fruit id="4">
    <name>桃子</name>
    <price>5.0</price>
    <count>10</count>
  </fruit>
  <fruit id="5">
    <name>西瓜</name>
    <price>10.0</price>
    <count>20</count>
  </fruit>
</fruits>

2.代码实例

本文章共有两种方式解析,第一章是使用相关jar包来操作,第二种是使用java原生代码实现(反射)
关于jar包的下载请百度


import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * SAX解析(jar包) 方式一
 * @author yujie
 *
 */
public class SN_9IO_SAX_JAR {
    public static void main(String[] args) {
        parse();
    }
    public static void parse() {

        //1.获取SAXReader对象
        SAXReader saxReader = new SAXReader();
        //2.获取需要解析的文件
        File file = new File("person.xml");
        //3.解析文件获取Document对象
        Document read =null;
        try {
            read = saxReader.read(file);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        //4.解析文件获取文件中的根节点
        Element rootElement = read.getRootElement();
        //获取所有的节点属性
        List<Element> elements = rootElement.elements();
        for (Element element:elements) {
            System.out.println(element.attributeValue("name"));
        }
    }
}


import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * SAX解析(反射) 方式二(繁琐,不需要导入 jar包 提供参考)
 * @author yujie
 *
 */
public class SN_9IO_SAX {
    private static ArrayList<Person> list;
    public static void main(String[] args) {
        parse();
    }

    /**
     * SAXParserFactory ——> SAXParser
     */
    public static void parse() {
        try {
            FileInputStream fis = new FileInputStream("person.xml");

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();

            //解析
            parser.parse(fis, new MyHandler());
            //打印
            for(Person p:list) {
                System.out.println(p);
            }

        } catch (ParserConfigurationException | SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static class MyHandler extends DefaultHandler {
        private static Person person;
        private static String upTag;//上一次读到的标签

        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            list = new ArrayList<>();
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes)
                throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            if("person".equals(qName)) {
                person = new Person();
                person.setName(attributes.getValue(0));
            }else {
                upTag = qName;
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            String c = new String(ch, start, length);
            switch (upTag) {
            case "age":
                person.setAge(Integer.parseInt(c));
                break;
            case "job":
                person.setJob(c);
                break;
            default:
                break;
            }
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if("person".equals(qName)) {
                list.add(person);
                person = null;
            }
            upTag = null;
        }

        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
            list.trimToSize();
            System.out.println("解析完成");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36868342/article/details/79016677