详解用Java解析XML的四种方法及XML相关知识介绍

XML如今已成为一种通用的数据交换格式。因其具有平台无关性,所以在很多场合都需用到XML。本文会详细介绍用Java解析XML的四种方法。

详解用Java解析XML的四种方法及XML相关知识介绍

XML如今已成为一种通用的数据交换格式。它具有平台无关性。它具有语言无关性。它具有系统无关性。这给数据集成与交互带来了极大便利。对于 XML 本身的语法知识和技术细节。需阅读相关技术文献。其中涵盖 DOM(文档对象模型)。还包括 DTD(文档类型定义)。以及 SAX(XML 简单 API)。还有 XSD(XML 模式定义)。另外有 XSLT(可扩展样式表语言转换)。具体可通过参阅 w3c 官方网站文档获取更多信息。

XML在不同语言里的解析方式相同,只是实现语法有差异。基本解析方式有两种。一种是SAX。另一种是DOM。SAX是基于事件流的解析。DOM是基于XML文档树结构的解析。

Java解析XML存在四种主要方法。分别是DOM。还有SAX。以及JDOM。另外是DOM4J。

一、DOM解析

DOM是表示XML文档的官方W3C标准。该标准与平台和语言无关。DOM是节点或信息片断的集合。这些节点或信息片断以层次结构组织。这个层次结构能让开发人员在树中找特定信息。通常要加载整个文档并构造层次结构后才能分析该结构并开展工作。DOM基于信息层次。所以DOM被认为基于树或基于对象。DOM以及广义的基于树的处理具备几个优点。首先,树在内存里是持久的,所以能够对其进行修改,进而让应用程序可对数据和结构作出更改。它还能够在树中随时进行上下导航,不像SAX那样是一次性处理。并且,DOM使用起来要简便得多。

另一方面 对于特别大的文档 解析整个文档可能很慢 加载整个文档可能很耗资源 因此使用其他手段处理这样的数据会更好 这些基于事件的模型 比如SAX

Bean文件:

package com.test; 
  import java.io.*; 
  import java.util.*; 
  import org.w3c.dom.*; 
  import javax.xml.parsers.*; 
  public class MyXMLReader{ 
公共静态无效主函数(字符串数组arge[]){
持久的 = 系统当前时间毫秒数;
    try{ 
该文件对象f指向名为data_10k.xml的文件
通过调用newInstance()方法来获取该对象
DocumentBuilder builder 由 factory 新建得到 它是一个 DocumentBuilder
文档doc等于构建器解析f得到的结果
NodeList nl获取文档中标签名为VALUE的所有元素组成的列表
对于整型变量i 初始化为0 当i小于nl的长度时 每次循环i自增1
加上doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()的结果
      } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
System.out.println((System.currentTimeMillis() - lasting)+" 毫秒");
    } 
  } 

10k消耗时间:265 203 219 172

100k消耗时间:9172 9016 8891 9000

1000k的消耗时间分别为:691719、675407、708375、739656

10000k消耗时间:OutOfMemoryError

二、SAX解析

这种处理优点与流媒体优点极为相似。分析可即刻开展,无需等待所有数据处理完毕。并且,因应用程序仅在读取数据时检查数据,所以无需将数据存储于内存。这对大型文档而言是极大优点。实际上,应用程序甚至不必解析整个文档,在某个条件满足时即可停止解析一般来说,SAX 还比它的替代者 DOM 快许多。

选择 DOM 还是选择 SAX ?

这是一个非常重要的设计决策

DOM 以建立树形结构的形式来访问 XML 文档。SAX 采用的是事件模型。

DOM解析器将XML文档转化成包含其内容的树。它能够对树进行遍历。使用DOM解析模型,编程容易。开发人员只需调用建树指令。接着利用navigation APIs访问所需树节点来完成任务。能轻松添加和修改树中的元素。然而使用DOM解析器时要处理整个XML文档。所以对性能和内存要求较高。尤其是遇到很大的XML文件时。因为其遍历能力。DOM解析器常用于XML文档需频繁改变的服务中。

SAX解析器采用基于事件的模型。解析XML文档时它能触发一系列事件。发现给定tag时。它会激活一个回调方法。告知该方法指定标签已找到。SAX对内存要求通常较低。因为它让开发人员自行决定要处理的tag。特别是在开发人员仅需处理文档所含部分数据的情况下,SAX的这种扩展能力体现得更为出色。然而,使用SAX解析器时,编码工作颇具难度。并且,同时访问同一文档中的多处不同数据也极为困难。

Bean文件:

package com.test; 
  import org.xml.sax.*; 
导入 org.xml.sax.helpers 包下的所有类
  import javax.xml.parsers.*; 
公共类MyXMLReader继承自DefaultHandler
其类型为java.util.Stack
  public MyXMLReader() { 
  super(); 
  } 
公共静态无效主函数(字符串参数数组) {
持久的 = 系统当前时间毫秒数;
  try { 
SAX解析器工厂sf通过newInstance方法创建实例
SAX解析器sp被创建 它是通过sf调用newSAXParser方法得到的
创建一个MyXMLReader对象并将其赋值给reader变量 即MyXMLReader reader = new MyXMLReader();
sp解析(新的输入源(“data_10k.xml”),读取器)
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
System.out.println((System.currentTimeMillis() - lasting) + " 毫秒");
  } 
公共的 无效的 方法 字符数组 参数 起始位置 参数 长度 抛出 SAX 异常
字符串标签等于(字符串)标签堆顶元素
  if (tag.equals("NO")) { 
  } 
  if (tag.equals("ADDR")) { 
  } 
  } 
  public void startElement( 
  String uri, 
  String localName, 
  String qName, 
  Attributes attrs) { 
  tags.push(qName); 
  } 
  } 

10k消耗时间:110 47 109 78

100k消耗时间:344 406 375 422

1000k消耗时间:3234 3281 3688 3312

10000k的消耗时间分别为:32578、34313、31797、31890、30328

三、JDOM解析

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%)。对多数Java/XML应用程序而言JDOM当然有用。多数开发者发现其API比DOM容易理解得多。JDOM包含对程序行为的广泛检查。其目的是防止用户做出在XML中无意义的事。不过,要做一些超出基本的工作。甚至理解某些情况下的错误。仍需要您充分理解XML。这或许是比学习DOM或JDOM接口更有意义的工作。

JDOM本身没有解析器。它一般借助SAX2解析器来解析与验证输入的XML文档(虽说它也能够把之前构造的DOM表示当作输入)。它含有一些转换器。这些转换器能把JDOM表示输出为SAX2事件流、DOM模型或者XML文本文档。JDOM是以Apache许可证变体发布的开源代码。

Bean文件:

package com.test; 
  import java.io.*; 
  import java.util.*; 
  import org.jdom.*; 
  import org.jdom.input.*; 
  public class MyXMLReader { 
公共静态无效主函数(字符串数组arge) {
  long lasting = System.currentTimeMillis(); 
  try { 
创建一个SAXBuilder对象 命名为builder
文档doc由builder构建,构建依据为一个文件,该文件路径是"data_10k.xml"
元素foo等于文档获取根元素。
列出所有子项 子项等于foo获取的子项
i自增1
输出该子元素的文本内容
   } 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒"); 
  } 
  } 

10k消耗时间:125 62 187 94

100k消耗时间:704 625 640 766

1000k消耗的时间分别为:27984、30750、27859、30656

10000k消耗时间:OutOfMemoryError

四、DOM4J解析

虽然DOM4J是完全独立开发成果,但最初它是JDOM的智能分支。它合并了许多功能,这些功能超出基本XML文档表示。包括集成的XPath支持。还有XML Schema支持。以及用于大文档或流化文档的基于事件的处理。它提供了构建文档表示的选项。它借助DOM4J API和标准DOM接口具备并行访问功能。从2000年下半年起它就一直在开发。

以实现更好性能或更直接编码方式直接好处是,DOM4J 付出了更复杂 API 的代价。但它提供了比 JDOM 大得多的灵活性。

添加灵活性、XPath集成以及大文档处理目标时,DOM4J的目标和JDOM相同。其目标是让Java开发者使用起来更方便,操作更直观。它还致力于成为比JDOM更完整的解决方案,目标是从本质上处理所有Java/XML问题完成该目标时 它比JDOM更少注重防止不正确的应用程序行为 它对防止不正确的应用程序行为的强调更少

DOM4J是极为出色的Java XML API,性能卓越,功能强大,极易使用,且是开源软件。如今越来越多Java软件用DOM4J读写XML,尤其Sun的JAXM也在使用DOM4J。

Bean文件:

package com.test; 
  import java.io.*; 
  import java.util.*; 
  import org.dom4j.*; 
  import org.dom4j.io.*; 
  public class MyXMLReader { 
  public static void main(String arge[]) { 
  long lasting = System.currentTimeMillis(); 
  try { 
该文件对象f指向data_10k.xml文件
创建一个SAXReader对象并将其赋值给reader变量 即SAXReader reader = new SAXReader();
文档doc等于读取器reader读取f的结果
元素根 = 文档获取根元素
   Element foo; 
对于(迭代器 i = 根元素.元素迭代器(“VALUE”);i 有下一个元素;) {
    foo = (Element) i.next(); 
输出“ 车主地址:”加上foo元素中ADDR标签的文本内容
   } 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒"); 
  } 
  } 

10k消耗时间:109 78 109 31

100k消耗时间:297 359 172 312

1000k消耗时间:2281 2359 2344 2469

10000k的消耗时间分别为:20938、19922、20031、21078

五、XML解析总结

1、【DOM】

DOM基于树结构。通常要加载整个文档。还要构造DOM树。之后才能开始工作。

优点:

a、由于整棵树在内存中,因此可以对xml文档随机访问

b、可以对xml文档进行修改操作

c、较sax,dom使用也更简单。

缺点:

a、整个文档必须一次性解析完

a、由于整个文档都需要载入内存,对于大文档成本高

2、【SAX】

SAX类似流媒体。它基于事件驱动。所以无需将整个文档载入内存。使用者只需要监听自己感兴趣的事件就行。

优点:

a、无需将整个xml文档载入内存,因此消耗内存少

b、可以注册多个ContentHandler

缺点:

a、不能随机的访问xml中的节点

b、不能修改文档

3、【JDOM】

JDOM是用于处理XML的纯Java API 该API大量运用Collections类

优点:

a、DOM方式的优点

b、具有SAX的Java规则

缺点

a、DOM方式的缺点

4、【DOM4J】

这4中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中什么是冒泡,冒泡算法

2026年09月06日

26阅读

java中冒号,java双冒号

2026年09月06日

23阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

27阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

23阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

24阅读