转自:http://blog.csdn.net/zgf19930504/article/details/49506567
java 解析XML 的方法有很多, 常见的解析技术有 SAX 解析, DOM 解析, JDOM 解析, DOM4J 解析, JAXB解析等,其中SAX 解析采用的是流式解析,一遍过,不能折回解析,占用内存少; 而DOM ,JDOM,DOM4J,JAXB 解析采用的是将整个XML 文档全部加载到内存中,然后进行解析,此种解析方式占用内存大,解析效率相对较慢。 接下来笔者就简单地做一下性能对比分析。
【1. 对比SAX、DOM、JDOM、DOM4J、JAXB 在解析XML 方面的速度对比】
【students_bigfile.xml 格式, 大小82.6M 】
- <?xml version="1.0" encoding="UTF-8"?>
- <Students>
- <!--这是第1个Student 元素-->
- <Student grade="2" index="1">
- <Name>zong_0</Name>
- <Age>20</Age>
- <Sex>boy</Sex>
- <Address>beijing No.0</Address>
- <Number>1000</Number>
- </Student>
- <!--这是第2个Student 元素-->
- <Student grade="1" index="2">
- <Name>zong_1</Name>
- <Age>21</Age>
- <Sex>girl</Sex>
- <Address>beijing No.1</Address>
- <Number>1001</Number>
- </Student>
- <!--这是第3个Student 元素-->
- <Student grade="2" index="3">
- <Name>zong_2</Name>
- <Age>22</Age>
- <Sex>boy</Sex>
- <Address>beijing No.2</Address>
- <Number>1002</Number>
- </Student>
- <!-- 省略, 共50 万个Student 片段 -->
- </Students>
【Student 类】由于涉及到JAXB 解析,所以用xjc 反转出的Student 类。
- //
- // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2
- // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
- // Any modifications to this file will be lost upon recompilation of the source schema.
- // Generated on: 2015.10.29 at 01:04:05 PM CST
- //
- package org.zgf.xml.jaxb.bean;
- import javax.xml.bind.annotation.XmlAccessType;
- import javax.xml.bind.annotation.XmlAccessorType;
- import javax.xml.bind.annotation.XmlAttribute;
- import javax.xml.bind.annotation.XmlElement;
- import javax.xml.bind.annotation.XmlRootElement;
- import javax.xml.bind.annotation.XmlType;
- /**
- * <p>
- * Java class for anonymous complex type.
- *
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- *
- * <pre>
- * <complexType>
- * <complexContent>
- * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- * <sequence>
- * <element ref="{}Name"/>
- * <element ref="{}Age"/>
- * <element ref="{}Sex"/>
- * <element ref="{}Number"/>
- * <element ref="{}Address"/>
- * </sequence>
- * <attribute name="index" type="{http://www.w3.org/2001/XMLSchema}string" />
- * <attribute name="grade" type="{http://www.w3.org/2001/XMLSchema}string" />
- * </restriction>
- * </complexContent>
- * </complexType>
- * </pre>
- *
- *
- */
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "", propOrder = { "name", "age", "sex", "number", "address" })
- @XmlRootElement(name = "Student")
- public class Student {
- @XmlElement(name = "Name", required = true)
- protected String name;
- @XmlElement(name = "Age", required = true)
- protected String age;
- @XmlElement(name = "Sex", required = true)
- protected String sex;
- @XmlElement(name = "Number", required = true)
- protected String number;
- @XmlElement(name = "Address", required = true)
- protected String address;
- @XmlAttribute(name = "index")
- protected String index;
- @XmlAttribute(name = "grade")
- protected String grade;
- /**
- * Gets the value of the name property.
- *
- * @return possible object is {@link String }
- *
- */
- public String getName() {
- return name;
- }
- /**
- * Sets the value of the name property.
- *
- * @param value
- * allowed object is {@link String }
- *
- */
- public void setName(String value) {
- this.name = value;
- }
- /**
- * Gets the value of the age property.
- *
- * @return possible object is {@link String }
- *
- */
- public String getAge() {
- return age;
- }
- /**
- * Sets the value of the age property.
- *
- * @param value
- * allowed object is {@link String }
- *
- */
- public void setAge(String value) {
- this.age = value;
- }
- /**
- * Gets the value of the sex property.
- *
- * @return possible object is {@link String }
- *
- */
- public String getSex() {
- return sex;
- }
- /**
- * Sets the value of the sex property.
- *
- * @param value
- * allowed object is {@link String }
- *
- */
- public void setSex(String value) {
- this.sex = value;
- }
- /**
- * Gets the value of the number property.
- *
- * @return possible object is {@link String }
- *
- */
- public String getNumber() {
- return number;
- }
- /**
- * Sets the value of the number property.
- *
- * @param value
- * allowed object is {@link String }
- *
- */
- public void setNumber(String value) {
- this.number = value;
- }
- /**
- * Gets the value of the address property.
- *
- * @return possible object is {@link String }
- *
- */
- public String getAddress() {
- return address;
- }
- /**
- * Sets the value of the address property.
- *
- * @param value
- * allowed object is {@link String }
- *
- */
- public void setAddress(String value) {
- this.address = value;
- }
- /**
- * Gets the value of the index property.
- *
- * @return possible object is {@link String }
- *
- */
- public String getIndex() {
- return index;
- }
- /**
- * Sets the value of the index property.
- *
- * @param value
- * allowed object is {@link String }
- *
- */
- public void setIndex(String value) {
- this.index = value;
- }
- /**
- * Gets the value of the grade property.
- *
- * @return possible object is {@link String }
- *
- */
- public String getGrade() {
- return grade;
- }
- /**
- * Sets the value of the grade property.
- *
- * @param value
- * allowed object is {@link String }
- *
- */
- public void setGrade(String value) {
- this.grade = value;
- }
- @Override
- public String toString() {
- return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", number=" + number + ", address=" + address + ", index=" + index + ", grade=" + grade + "]";
- }
- }
【解析一个 82.6M 的xml 文档,所消耗的时间】
【所消耗的内存占用比】
【为了防止同一个测试用例中,不同的解析器占用内存相互影响,笔者将不同的解析器分为单独的测试用例进行测试,测试的xml 文档依然是这个xml 文档】【SAX(170M) < DOM4J(410M) < JAXB(690M) < JDOM(750M) < DOM(950M);
【1. SAX 解析】
【2. DOM 解析】
【3. JDOM 解析】
【4. DOM4J 解析】
【5. JAXB 解析】
【综合对比分析】
1. 解析速度对比:SAX > DOM4J > JAXB > JDOM > DOM
2. 解析内存对比: SAX < DOM4J < JAXB < JDOM < DOM
3. 编程复杂对比:SAX > DOM > JDOM > DOM4J > JAXB
综上所述,笔者推荐使用JAXB,DOM4J,SAX解析三种技术:
SAX: 解析速度最快,占用内存最小,编程难度大,处理业务逻辑比较复杂。
DOM4J:解析速度较,占用内存较大,编程较简单,处理业务逻辑稍简单。
JAXB: 解析速度稍慢,占用内存较大,编程最简单,处理语无逻辑最简单。
【注】
1. 项目源代码下载地址:下载
2. 项目示例运行时,需要调整JVM 内存,方法参见:《修改jvm 虚拟机内存方法》
3. JVM 内存监控,方法参见: 《jvm 内存监控工具》
相关推荐
本文将深入探讨几种不同的XML解析方法,并通过实际的“Java解析XML性能对比分析Demo”来展示它们的性能差异。我们将讨论DOM、SAX、JDOM、DOM4J和JAXB这五种解析器,以及它们各自的特点和适用场景。 1. DOM(文档...
本篇文章将深入探讨四种主要的XML解析技术——DOM、SAX、StAX以及JAXB,并进行详细的分析与对比。 1. DOM(Document Object Model) DOM解析器将整个XML文档加载到内存中,形成一个树形结构,即DOM树。这种解析方式...
本文将深入探讨四种主要的XML解析技术及其工具,并通过对比分析,帮助你选择适合项目需求的XML处理方式。 1. DOM(Document Object Model) DOM是W3C推荐的一种XML和HTML的标准API,它将XML文档视为一个树形结构,...
本文将深入探讨几种常见的XML解析框架,并对比它们的特点与适用场景。 一、DOM解析器 DOM(Document Object Model)是W3C制定的一种标准,它将XML文档视为一个树形结构,允许开发者通过节点操作来读取和修改XML内容...
在提供的文档中,如"XML解析技术研究.doc"、"DOM和SAX概念的总结.doc"等,可以深入探讨XML解析的细节,包括解析过程、性能比较、错误处理等。"stu_XML_34_1"和"tea_XML2"可能包含XML解析的实例代码,帮助理解实际...
在嵌入式系统中,由于资源限制,往往需要轻量级且高效的XML解析器。"minixml"就是这样一个专为嵌入式系统设计的开源XML解析器,它提供DOM(Document Object Model)支持,使得开发者能够方便地处理XML文档。 mini...
JavaScript中的XML解析器是用于处理XML数据的关键工具,它允许开发者在浏览器环境中解析XML文档或者XML字符串,从而在Web应用中有效地使用这些数据。XML(eXtensible Markup Language)是一种结构化数据语言,常用于...
这里我们将深入探讨四种主要的XML解析器:DOM、SAX、JDOM和DOM4J,以及它们的原理和性能特点。 1. DOM(文档对象模型) DOM是W3C的标准解析器,它将XML文档转化为一棵在内存中持久化的树形结构。每个XML元素、属性...
6. **性能比较** DOM解析器适合小规模、结构复杂的XML文件,便于直接操作;SAX解析器适用于大规模文件,节省内存;JAXB适合于数据绑定场景,简化了数据交换;StAX则在内存效率和灵活性间找到了平衡。 7. **注意...
### 基于Android的XML解析技术的分析 #### 摘要 本文详细探讨了在Android平台上解析XML文件的几种主流技术:DOM(Document Object Model)、SAX(Simple API for XML)及XMLPull。通过对这些技术的具体实现过程进行...
### XML解析器原理及性能比较 #### DOM:文档对象模型 DOM是一种官方W3C标准,旨在以一种与平台和语言无关的方式表示XML文档。它采用了一种层次化的结构,组织文档为节点或信息片段的集合,使得XML文档能够被看作...
总结,这个压缩包中的内容可能包含详细的代码示例和解析方法的比较,旨在帮助开发者更好地理解和应用XML解析技术在Android项目中,提高开发效率和应用性能。通过学习这些通用的解析方法,开发者可以根据不同场景选择...
XML 解析器原理及性能比较 XML 解析器是指将 XML 文档转换为计算机可以理解的格式的软件组件。常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和...
标题和描述中提到的“基于多核处理器的VTD-XML解析性能优化”是指在处理XML文档时,利用多核处理器的优势,通过多线程技术和内存访问优化来提升XML解析器的性能。XML(可扩展标记语言)是用于数据交换和结构化数据...
本资源"iPhone iOS XML解析源代码"提供了一个深入学习和比较XML解析技术的实例,包含两种不同的解析方法,旨在帮助开发者了解它们的性能差异。 首先,我们来探讨第一种解析方式:NSXMLParser。这是Apple提供的内置...