Java中XML的解析方式

 XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。(不仅仅适用于java)

    XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,是java语言特有的解析方式。SAX解析编程相对而言最为复杂,以下为四种解析方式做详细介绍。


1、DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。

  DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。

  DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。(JavaScript解析方式就是dom解析)

优点:

 1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。

 2、解析过程中,树结构保存在内存中,方便修改。

缺点:

 1、由于文件是一次性读取,所以对内存的耗费比较大。

 2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

核心代码:

//创建一个DocumentBuilderFactory的实例DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();        //通工厂实例创建DocumentBuilder对象DocumentBuilder db = dbf.newDocumentBuilder();            
//通过DocumentBuilder实例的parser方法加载books.xml文件到当前项目下
Document document = db.parse("books.xml");

2、SAX解析

  SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口,基于事件模型。

优点:

 1、采用事件驱动模式,对内存耗费比较小。

 2、适用于只处理XML文件中的数据时。

缺点:

 1、编码比较麻烦,既要创建解析器,又要创建处理器。

 2、很难同时访问XML文件中的多处不同数据。

核心代码:

//创建一个SAXParserFactory的对象
SAXParserFactory factory = SAXParserFactory.newInstance();        
//通过factory获取SAXParser实例    
SAXParser parser = factory.newSAXParser();           
//创建对象SAXParserHandler的实例,该类实现了DefaultHandler接口
SAXParserHandler handler = new SAXParserHandler();
//加载文件,传入解析处理器
parser.parse("books.xml", handler);

3、JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快,JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

核心代码:

//1.直接创建解析器
SAXBuilder saxBuilder = new SAXBuilder();
 // 2.创建一个输入流,将xml文件加载到输入流
InputStream in = new FileInputStream("src/books.xml");
// 3.通过saxBuilder的build方法,将输入流加载到saxBuilder中
InputStreamReader isr = new InputStreamReader(in, "UTF-8");            
 Document document = saxBuilder.build(isr); //加载流

 


4、DOM4J

    虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。

    为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。

核心代码:

SAXReader reader = new SAXReader(); 
// 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。Document document = reader.read(new File("src/books.xml"));            
// 通过document对象获取根节点bookstoreElement bookStore = document.getRootElement();

总结:

    DOM4J性能最好,目前许多开源项目中大量采用DOM4J,JDOM和DOM在性能测试时表现不佳,适合解析小文件。

    SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存。

    DOM JDOM DOM4J都是基于element的操作,而SAX是基于Handler的操作,核心操作都在Handler中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值