zoukankan      html  css  js  c++  java
  • Sax解析xml文档

    测试的xml数据:

    <?xml version="1.0" encoding="utf-8" ?>
    <note>
        <to>George</to>
        <from>John</from>
        <heading>Reminder</heading>
        <body>Don't forget the meeting!</body>
    </note>

    新建SaxTest类继承至DefaultHandle

    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParserFactory;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    
    public class SaxTest extends DefaultHandler {
        @Override
        public void startDocument() throws SAXException {
            System.out.println("开始解析文档");
        }
    
        @Override
        public void endDocument() throws SAXException {
            System.out.println("解析文档结束");
        }
    
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            System.out.println(qName);//每个标签开始都会触发该事件,attributes是标签的属性
        }
    
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            System.out.println(qName);//每个标签结束都会触发该事件
        }
    
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            System.out.println(new String(ch, start, length));//标签开始到标签结束之间的内容
        }
    
        static public void main(String[] args) throws IOException, ParserConfigurationException, SAXException {
            String textXml = SaxTest.class.getResource("/").getPath() + "test.xml";
            FileInputStream inputStream = new FileInputStream(textXml);
            SAXParserFactory.newInstance().newSAXParser().parse(inputStream, new SaxTest());
        }
    }

    解析结果截图:

    其中characters方法需要特别注意,开始标签到结束标签的内容可能不止会触发一次characters事件,也就是说标签中的内容可能会多次触发characters事件,所以如果要获取标签内的完整内容需要特别小心,一般使用StringBuilder,如下代码。

    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParserFactory;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    
    public class SaxTest extends DefaultHandler {
        StringBuilder stringBuilder = new StringBuilder();
    
        @Override
        public void startDocument() throws SAXException {
            System.out.println("开始解析文档");
        }
    
        @Override
        public void endDocument() throws SAXException {
            System.out.println("解析文档结束");
        }
    
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            System.out.println(qName);//每个标签开始都会触发该事件,attributes是标签的属性
        }
    
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            System.out.println(stringBuilder.toString().trim());
            stringBuilder.delete(0, stringBuilder.length());//输出内容,并清空stringBuilder
    
            System.out.println(qName);//每个标签结束都会触发该事件
        }
    
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            stringBuilder.append(ch, start, length);
        }
    
        static public void main(String[] args) throws IOException, ParserConfigurationException, SAXException {
            String textXml = SaxTest.class.getResource("/").getPath() + "test.xml";
            FileInputStream inputStream = new FileInputStream(textXml);
            SAXParserFactory.newInstance().newSAXParser().parse(inputStream, new SaxTest());
        }
    }
  • 相关阅读:
    tomcat安装配置
    Java的jdk环境变量配置
    我为什么在这里写博客
    函数
    java的内部类解析
    常用集合
    java数据类型总结
    Java总结基础知识
    线程的状态和方法
    java对象序列化的理解
  • 原文地址:https://www.cnblogs.com/jecyhw/p/4531049.html
Copyright © 2011-2022 走看看