zoukankan      html  css  js  c++  java
  • 6.jaxp的sax方式操作

    1.sax解析的原理

      (1)解析xml有两种技术 dom 和 sax

        dom:

          根据xml的层级结构在内存中分配一个树形结构,把xml中标签,属性,文本封装成对象

        sax:

          事件驱动,一行一行边读边解析(正确来说,是按照顺序,一个一个标签解析的)

      (2)所使用到的类和方法(javax.xml.parsers包里面)

        SAXParserFactory 抽象类

          实例 newInstance() 方法得到

        SAXParser 抽象类

          此类的实例从 SAXParserFactory.newSAXParser()方法获得

          - parse(File f,DefaultHandler dh) 执行此方法,每当获取一个标签的时候,会自动执行DefaultHandler类中的一些方法

            file       xml路径

            DefaultHandler  事件处理器

      (3)DefaultHandler(在org.xml.sax.helpers.DefaultHandler包)

        当解析到开始标签的时候,自动执行 startElement(String uri, String localName, String qName, Attributes attributes) 

          - qName 返回标签名,输出qName参数即可

        当解析到文本的时候,自动执行    characters(char[] ch, int start, int length)

          - 返回文本,输出ch即可

        当解析到结束标签的时候,自定执行 endElement(String uri, String localName, String qName)

          - 返回结束标签,输出qName即可

        注意:一般我们会定义一个类,并重写者三个方法,这样方便我们对xml文件操作,并不是直接实例化这个然后传递过去,其中qName表示返回的标签名

    注意:sax只能查询,不能进行增删改

    实例代码如下:

    需求1:获取所有的xml中的所有标签和文本

    xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <persion xmlns="http://www.example.org/one"
    xmlns:two="http://www.example.org/two"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/one one.xsd http://www.example.org/two two.xsd">
        <two:name>12</two:name>
        <name>张三</name>
        <age>180</age>
    </persion>
    package day2;
    
    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;
    
    public class Demo1 {
        public static void main(String[] args) throws Exception {
            //实例化解析器工厂
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            //实例化解析器
            SAXParser saxParser = saxParserFactory.newSAXParser();
            //调用parse方法,开始解析
            saxParser.parse("src/day2/1.xml", new myHandler());
        }
    }
    
    //自定义事件处理器
    class myHandler extends DefaultHandler{
    
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) 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));
        }
        
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            System.out.println(qName);
        }
    }

    需求2:按照xml格式进行输出(上面的输出我们可以知道,空格也会输出出来)

    package day2;
    
    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;
    
    public class Demo1 {
        public static void main(String[] args) throws Exception {
            //实例化解析器工厂
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            //实例化解析器
            SAXParser saxParser = saxParserFactory.newSAXParser();
            //调用parse方法,开始解析
            saxParser.parse("src/day2/1.xml", new myHandler());
        }
    }
    
    //自定义事件处理器
    class myHandler extends DefaultHandler{
    
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            System.out.print("<"+qName+">");
        }
        
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            System.out.print(new String(ch,start,length));
        }
        
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            System.out.print("<"+qName+">");
        }
    }

    需求3:查询name标签的文本

    package day2;
    
    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;
    
    public class Demo1 {
        public static void main(String[] args) throws Exception {
            //实例化解析器工厂
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            //实例化解析器
            SAXParser saxParser = saxParserFactory.newSAXParser();
            //调用parse方法,开始解析
            saxParser.parse("src/day2/1.xml", new myHandler());
        }
    }
    
    //自定义事件处理器
    class myHandler extends DefaultHandler{
    
        boolean flash = false;
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            //获取到name标签
            if("name".equals(qName)) {
                flash = true;
            }
        }
        
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            if(flash == true) {
                System.out.print(new String(ch,start,length));
            }
        }
        
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if("name".equals(qName)) {
                flash = false;
            }
        }
    }

     

  • 相关阅读:
    几个不错的网页载入页面
    .NET 中关于日期时间的格式化处理
    防止网站内容被人小偷和采集的ASP代码
    .Net学习资源集
    Net程序如何防止被注入(整站通用)
    一个采集入库生成本地文件的几个FUCTION
    网页数据采集小偷
    浅谈自动采集程序及入库
    网页图片处理JS代码整理
    spark导入工程后,出现一些错误
  • 原文地址:https://www.cnblogs.com/zjdbk/p/9168916.html
Copyright © 2011-2022 走看看