深入浅出如何解析xml文件---下篇

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:     在上篇博文中,小编主要介绍xml的两种解析方式,分别是dom4j和dom,今天这篇博文,小编主要来简单介绍一下xml的其她两种解析方式sax和jdom。

    在上篇博文中,小编主要介绍xml的两种解析方式,分别是dom4j和dom,今天这篇博文,小编主要来简单介绍一下xml的其她两种解析方式sax和jdom。

    sax解析xml文件

    sax,全称是Simple API for XML ,即是一种接口,也是一种软件包,她也是一种xml解析的替代方法,sax不同于dom解析,她逐行扫描文档,一边扫描一边解析,由于应用程序只是在读取数据时检查数据,因为不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。

    sax这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。如下deom所示:

    <?xml version="1.0" encoding="UTF-8"?>  
    <root>  
        <student id="1" group="1">  
            <name>张三</name>  
            <sex>男</sex>  
            <age>18</age>  
            <email>zhangsan@163.com</email>  
            <birthday>1987-06-08</birthday>  
            <memo>好学生</memo>  
        </student>  
        <student id="2" group="2">  
            <name>李四</name>  
            <sex>女</sex>  
            <age>18</age>  
            <email>lisi@163.com</email>  
            <birthday>1987-06-08</birthday>  
            <memo>好学生</memo>  
        </student>  
        <student id="3" group="3">  
            <name>小王</name>  
            <sex>男</sex>  
            <age>18</age>  
            <email>xiaowang@163.com</email>  
            <birthday>1987-06-08</birthday>  
            <memo>好学生</memo>  
        </student>  
        <student id="4" group="4">  
            <name>小张</name>  
            <sex>男</sex>  
            <age>18</age>  
            <email>xiaozhang@163.com</email>  
            <birthday>1987-06-08</birthday>  
            <memo>好学生</memo>  
        </student>  
        <student id="5" group="5">  
            <name>小明</name>  
            <sex>男</sex>  
            <age>18</age>  
            <email>xiaoming@163.com</email>  
            <birthday>1987-06-08</birthday>  
            <memo>好学生</memo>  
        </student>  
    </root>  
      使用sax解析如下所示:
    import java.util.ArrayList;  
    import java.util.List;  
      
      
    import org.xml.sax.Attributes;  
    import org.xml.sax.SAXException;  
    import org.xml.sax.helpers.DefaultHandler;  
      
      
      
    /**  
     * 功能描述:采用sax方式解析XML<br>  
     *   
     * @author 丁国华
     *  
     */  
    public class SaxParseXml extends DefaultHandler{  
      
        //存放遍历集合  
        private List<Student> list;  
        //构建Student对象  
        private Student student;  
        //用来存放每次遍历后的元素名称(节点名称)  
        private String tagName;  
          
          
        public List<Student> getList() {  
            return list;  
        }  
      
      
        public void setList(List<Student> list) {  
            this.list = list;  
        }  
      
      
        public Student getStudent() {  
            return student;  
        }  
      
      
        public void setStudent(Student student) {  
            this.student = student;  
        }  
      
      
        public String getTagName() {  
            return tagName;  
        }  
      
      
        public void setTagName(String tagName) {  
            this.tagName = tagName;  
        }  
      
      
        //只调用一次  初始化list集合    
        @Override  
        public void startDocument() throws SAXException {  
            list=new ArrayList<Student>();  
        }  
          
          
        //调用多次    开始解析  
        @Override  
        public void startElement(String uri, String localName, String qName,  
                Attributes attributes) throws SAXException {  
            if(qName.equals("student")){  
                student=new Student();  
                //获取student节点上的id属性值  
                student.setId(Integer.parseInt(attributes.getValue(0)));  
                //获取student节点上的group属性值  
                student.setGroup(Integer.parseInt(attributes.getValue(1)));  
            }  
            this.tagName=qName;  
        }  
          
          
        //调用多次    
        @Override  
        public void endElement(String uri, String localName, String qName)  
                throws SAXException {  
            if(qName.equals("student")){  
                this.list.add(this.student);  
            }  
            this.tagName=null;  
        }  
          
          
        //只调用一次  
        @Override  
        public void endDocument() throws SAXException {  
        }  
          
        //调用多次  
        @Override  
        public void characters(char[] ch, int start, int length)  
                throws SAXException {  
            if(this.tagName!=null){  
                String date=new String(ch,start,length);  
                if(this.tagName.equals("name")){  
                    this.student.setName(date);  
                }  
                else if(this.tagName.equals("sex")){  
                    this.student.setSex(date);  
                }  
                else if(this.tagName.equals("age")){  
                    this.student.setAge(Integer.parseInt(date));  
                }  
                else if(this.tagName.equals("email")){  
                    this.student.setEmail(date);  
                }  
                else if(this.tagName.equals("birthday")){  
                    this.student.setBirthday(date);  
                }  
                else if(this.tagName.equals("memo")){  
                    this.student.setMemo(date);  
                }  
            }  
        }  
    }  

    使用sax解析xml文件,有哪些优点和缺点呢?如下所示:

    优点:

    a、不需要等待所有数据都被处理,分析就能立即开始;

    b、只在读取数据时检查数据,不需要保存在内存中;

    c、可以在某个条件得到满足时停止解析,不必解析整个文档;

    d、效率和性能较高,能解析大于系统内存的文档。

    缺点:

    a、需要应用程序自己负责TAG的处理逻辑,使用起来比较麻烦;

    b、单向导航,很难同时访问同一文档的不同部分数据,不支持XPath。

    jdom解析xml文件

    接着,来介绍jdom解析xml的方式,jdom是一种使用xml的独特java工具包,她的设计包含java语言的语法乃至语言。  jdom的目的是成为 java特定文档模型,它简化与xml的交互并且比使用 dom实现更快。由于是第一个 java特定模型,jdom一直得到大力推广和促进。正在考虑通过“java 规范请求 JSR-102”将它最终用作“Java 标准扩展”。从 2000 年初就已经开始了 jdom开发。
    jdom 与 dom 主要有两方面不同。首先,jdom仅使用具体类而不使用接口。这在某些方面简化了 API,但是也限制了灵活性。第二,API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 Java 开发者的使用。
    jdom文档声明其目的是“使用 20%(或更少)的精力解决 80%(或更多)Java/XML 问题”(根据学习曲线假定为 20%)。jdom 对于大多数 Java/XML 应用程序来说当然是有用的,并且大多数开发者发现 API 比dom 容易理解得多。jdom 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而,它仍需要您充分理解 xml以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习 dom 或 jdom 接口都更有意义的工作。
    jdom自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 dom表示作为输入)。它包含一些转换器以将 jdom表示输出成 SAX2 事件流、dom模型或 xml 文本文档。jdom 是在 Apache 许可证变体下发布的开放源码。看下面一个dome,xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<prop>
  <mess>
    <property name="sSize" value="52"></property>
    <property name="cSize" value="23"></property>
    <property name="pSize" value="15"></property>
    <property name="aSize" value="25"></property>
  </mess>
</prop>
     使用jdom解析如下所示:
package com.fancy.util;

import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

public class XmlDom {

    public static String obtainValue(String name){
        try {
            //创建一个SAXBuilder对象
              SAXBuilder saxBuilder = new SAXBuilder();            
            //读取prop.xml资源
              Document doc = saxBuilder.build("prop.xml");
            //获取根元素(prop)
            Element root = doc.getRootElement();
            //获取根元素下面的所有子元素(mess)
            List<Element> messList = root.getChildren("mess");
            //子根元素(mess)
            Element childrenRoot = null;
            //property元素集合
              List<Element> propertyList = null;
            //遍历根元素的子元素集合(即遍历mess元素)
            for(int i = 0; i < messList.size(); i++){
                 //将根元素prop下的mess子元素作为一个新的子根元素
                   childrenRoot = messList.get(i);
                //获取子根元素mess下的所有property子元素
                   propertyList = childrenRoot.getChildren("property");
                //遍历子根元素的子元素集合(即遍历property元素)
                for(int j = 0; j < propertyList.size(); j++){
                    //获取property元素
                       Element element = propertyList.get(j);
                    //element.getAttributeValue("name"):获取property中name属性的值
                       if(element.getAttributeValue("name").equals(name)){        //如果name的值一致
                          return element.getAttributeValue("value");            //取得name对应的value属性值
                       }
                }
            }
            //遍历完没有查找到结果返回null
            return null;
        } catch (Exception e) {e.printStackTrace();} 
        return null;
    }
}
复制代码

   使用jdom解析xml文件的方式,具有以下优缺点:      

   优点:

   a、使用具体类而不是接口,简化了dom的api;

   b、大量使用java集合类,方便了java开发人员。

   缺点:

   a、没有较好的灵活性;

   b、性能较差。

   小编寄语:博文介绍到这里,小编已经把四种解析xml文件的方式介绍完了, JDOM 和 DOM 在性能测试时表现不佳,在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础,因为它正式获得 W3C 推荐(与基于非标准的 Java 模型相对),所以在某些类型的项目中可能也需要它(如在 javascript 中使用 DOM)。
    SAX表现较好,这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
    无疑,DOM4J是最好的,目前许多开源项目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性,可以采用dom4j,java之路,未完待续。

目录
相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
92 2
|
8天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
61 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
6天前
|
自然语言处理 文字识别 数据处理
多模态文件信息抽取:技术解析与实践评测!
在大数据和人工智能时代,企业和开发者面临的挑战是如何高效处理多模态数据(文本、图像、音频、视频)以快速提取有价值信息。传统方法效率低下,难以满足现代需求。本文将深度评测阿里云的多模态文件信息抽取解决方案,涵盖部署、应用、功能与性能,揭示其在复杂数据处理中的潜力。通过自然语言处理(NLP)、计算机视觉(CV)、语音识别(ASR)等技术,该方案助力企业挖掘多模态数据的价值,提升数据利用效率。
20 4
多模态文件信息抽取:技术解析与实践评测!
|
5天前
|
文字识别 自然语言处理 算法
从多模态到精准洞察:深度解析多模态文件信息提取解决方案!
阿里云推出《多模态数据信息提取》解决方案,涵盖文本、图像、音频、视频等多种数据形式的自动化处理。本文从部署体验、功能验证到实际应用,全面解析该方案的能力与潜力,帮助开发者高效提取和整合复杂数据,提升工作效率...
24 3
从多模态到精准洞察:深度解析多模态文件信息提取解决方案!
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
46 3
|
2月前
|
XML Android开发 数据格式
Eclipse 创建 XML 文件
Eclipse 创建 XML 文件
33 2
|
2月前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
201 8
|
2月前
|
存储
文件太大不能拷贝到U盘怎么办?实用解决方案全解析
当我们试图将一个大文件拷贝到U盘时,却突然跳出提示“对于目标文件系统目标文件过大”。这种情况让人感到迷茫,尤其是在急需备份或传输数据的时候。那么,文件太大为什么会无法拷贝到U盘?又该如何解决?本文将详细分析这背后的原因,并提供几个实用的方法,帮助你顺利将文件传输到U盘。
|
3月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
3月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器

推荐镜像

更多