• 技术文章 >后端开发 >XML/RSS教程

    java中使用sax解析xml的解决方法

    高洛峰高洛峰2017-01-11 12:56:12原创1034
    在java中,原生解析xml文档的方式有两种,分别是:Dom解析和Sax解析

    Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档

    Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档

    本文主要讲解Sax解析,其余放在后面

    Sax采用事件驱动的方式解析文档。简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取)

    在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或处理这些信息

    同样,在Sax的解析过程中,读取到文档开头、结尾,元素的开头和结尾都会触发一些回调方法,你可以在这些回调方法中进行相应事件处理

    这四个方法是:startDocument() 、 endDocument()、 startElement()、 endElement

    此外,光读取到节点处是不够的,我们还需要characters()方法来仔细处理元素内包含的内容

    将这些回调方法集合起来,便形成了一个类,这个类也就是我们需要的触发器

    一般从Main方法中读取文档,却在触发器中处理文档,这就是所谓的事件驱动解析方法

    java中使用sax解析xml的解决方法

    如上图,在触发器中,首先开始读取文档,然后开始逐个解析元素,每个元素中的内容会返回到characters()方法

    接着结束元素读取,所有元素读取完后,结束文档解析

    现在我们开始创建触发器这个类,要创建这个类首先需要继承DefaultHandler

    创建SaxHandler,并覆写相应方法:

    import org.xml.sax.Attributes; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.helpers.DefaultHandler; 
    
      
    public class SaxHandler extends DefaultHandler { 
    
        /* 此方法有三个参数 
           arg0是传回来的字符数组,其包含元素内容 
           arg1和arg2分别是数组的开始位置和结束位置 */ 
        @Override 
        public void characters(char[] arg0, int arg1, int arg2) throws SAXException { 
            String content = new String(arg0, arg1, arg2); 
            System.out.println(content); 
            super.characters(arg0, arg1, arg2); 
        } 
    
        @Override 
        public void endDocument() throws SAXException { 
            System.out.println("\n…………结束解析文档…………"); 
            super.endDocument(); 
        } 
    
        /* arg0是名称空间 
           arg1是包含名称空间的标签,如果没有名称空间,则为空 
           arg2是不包含名称空间的标签 */ 
        @Override 
        public void endElement(String arg0, String arg1, String arg2) 
                throws SAXException { 
            System.out.println("结束解析元素  " + arg2); 
            super.endElement(arg0, arg1, arg2); 
        } 
    
        @Override 
        public void startDocument() throws SAXException { 
            System.out.println("…………开始解析文档…………\n"); 
            super.startDocument(); 
        } 
    
        /*arg0是名称空间 
          arg1是包含名称空间的标签,如果没有名称空间,则为空 
          arg2是不包含名称空间的标签 
          arg3很明显是属性的集合 */
        @Override
        public void startElement(String arg0, String arg1, String arg2, 
                Attributes arg3) throws SAXException { 
            System.out.println("开始解析元素 " + arg2); 
            if (arg3 != null) { 
                for (int i = 0; i < arg3.getLength(); i++) { 
                     // getQName()是获取属性名称, 
                    System.out.print(arg3.getQName(i) + "=\"" + arg3.getValue(i) + "\""); 
                } 
            } 
            System.out.print(arg2 + ":"); 
            super.startElement(arg0, arg1, arg2, arg3); 
        } 
    }

    XML文档:

    <?xml version="1.0" encoding="UTF-8"?>  
    <books>  
       <book id="001">  
          <title>Harry Potter</title>  
          <author>J K. Rowling</author>  
       </book>  
       <book id="002">  
          <title>Learning XML</title>  
          <author>Erik T. Ray</author>  
       </book>  
    </books>

    TestDemo测试类:

    import java.io.File; 
    
    import javax.xml.parsers.SAXParser; 
    import javax.xml.parsers.SAXParserFactory; 
    
      
    public class TestDemo { 
    
        public static void main(String[] args) throws Exception { 
            // 1.实例化SAXParserFactory对象 
            SAXParserFactory factory = SAXParserFactory.newInstance(); 
            // 2.创建解析器 
            SAXParser parser = factory.newSAXParser(); 
            // 3.获取需要解析的文档,生成解析器,最后解析文档 
            File f = new File("books.xml"); 
            SaxHandler dh = new SaxHandler(); 
            parser.parse(f, dh); 
        } 
    }

    输出结果:

    …………开始解析文档………… 
    
    开始解析元素 books 
    books:  
    
    开始解析元素 book 
    id="001"book:  
    
    开始解析元素 title 
    title:Harry Potter 
    结束解析元素  title 
    
            
    开始解析元素 author 
    author:J K. Rowling 
    结束解析元素  author 
    
         
    结束解析元素  book 
    
         
    开始解析元素 book 
    id="002"book:  
    
    开始解析元素 title 
    title:Learning XML 
    结束解析元素  title 
    
            
    开始解析元素 author 
    author:Erik T. Ray 
    结束解析元素  author 
    
         
    结束解析元素  book 
    
      
    结束解析元素  books 
    
    …………结束解析文档…………

    上面的虽然正确显示了执行流程,但是输出却很乱

    为了更加清晰的执行此流程,我们还可以重写SaxHandler,使其将原先的xml文档还原一遍

    重写的SaxHandler类:

    import org.xml.sax.Attributes; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.helpers.DefaultHandler; 
    
      
    public class SaxHandler extends DefaultHandler { 
    
        @Override
        public void characters(char[] arg0, int arg1, int arg2) throws SAXException { 
            System.out.print(new String(arg0, arg1, arg2)); 
            super.characters(arg0, arg1, arg2); 
        } 
    
        @Override
        public void endDocument() throws SAXException { 
            System.out.println("\n结束解析"); 
            super.endDocument(); 
        } 
    
        @Override
        public void endElement(String arg0, String arg1, String arg2) 
                throws SAXException { 
            System.out.print("</"); 
            System.out.print(arg2); 
            System.out.print(">"); 
            super.endElement(arg0, arg1, arg2); 
        } 
    
        @Override
        public void startDocument() throws SAXException { 
            System.out.println("开始解析"); 
            String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; 
            System.out.println(s); 
            super.startDocument(); 
        } 
    
        @Override
        public void startElement(String arg0, String arg1, String arg2, 
                Attributes arg3) throws SAXException { 
    
            System.out.print("<"); 
            System.out.print(arg2); 
    
            if (arg3 != null) { 
                for (int i = 0; i < arg3.getLength(); i++) { 
                    System.out.print(" " + arg3.getQName(i) + "=\"" + arg3.getValue(i) + "\""); 
                } 
            } 
            System.out.print(">"); 
            super.startElement(arg0, arg1, arg2, arg3); 
        } 
    
    }

    更多java中使用sax解析xml的解决方法相关文章请关注PHP中文网!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:sax解析xml
    上一篇:Java生成和解析XML格式文件和字符串的实例代码 下一篇:java使用xpath解析xml示例分享
    20期PHP线上班

    相关文章推荐

    精选22门好课,价值3725元,开通VIP免费学习!• Java中构造、生成XML简明教程• 四种XML解析方式详解• XML教程-XML的用途介绍• 详细介绍xml的语法的使用和学习• 浅谈WEB页面工具语言XML(六)展望
    1/1

    PHP中文网