Java处理XML的三种主流技术及介绍(1)

2012-08-15 10:44 顾彬/冯晨/乔彬 IBM developerWorks 我要评论(0) 字号:T | T

XML (eXtensible Markup Language) 意为可扩展标记语言,它已经是软件开发行业中大多数程序员和厂商用以选择作为数据传输的载体。本文作者对于 Java 处理 XML 的几种主流技术进行一些总结和介绍,希望帮助那些有不同需求的开发人员对于 XML 处理技术的作出最优的选择。

AD:51CTO 网+首届APP创新评选大赛火热启动——超百万资源等你拿!

XML (eXtensible Markup Language) 意为可扩展标记语言,它已经是软件开发行业中大多数程序员和厂商用以选择作为数据传输的载体。本文作者对于 Java 处理 XML 的几种主流技术进行一些总结和介绍,希望帮助那些有不同需求的开发人员对于 XML 处理技术的作出最优的选择。

最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容 存储和表现分离等等优势注定了该语言从诞生之日起就会走向辉煌。 XML 语言在成为 W3C 标准之后进入到了一个快速发展的时期,当然它本身所具有的一系列优点和优势也注定了各大技术厂商对它的偏爱,Java 作为软件行业的一种开发技术也迅速作出了反应,出现了多种对 XML 支持的工具,本文将会从这个角度对 Java 处理 XML 的几种主流技术进行介绍,希望能对您有所帮助。在这篇文章中,您将会得到以下信息:

Java 提供了哪些优秀的类库及工具便于程序员对 XML 进行处理 ?

有了 DOM 了,其它工具类库还有必要么 ?

几个小例程带你快速了解这三种解析方式

Java 有哪些优秀的类库及工具便于程序员对 XML 进行处理 ?

大名鼎鼎的 DOM

绿色环保的 SAX

默默无闻的 Digester

XML 三种解析方式简介

大名鼎鼎的 DOM

说它大名鼎鼎可是一点不为过,DOM 是 W3C 处理 XML 的标准 API,它是许多其它与 XML 处理相关的标准的基础,不仅是 Java,其它诸如 Javascript,PHP,MS .NET 等等语言都实现了该标准, 成为了应用最为广泛的 XML 处理方式。当然,为了能提供更多更加强大的功能,Java 对于 DOM 直接扩展工具类有很多,比如很多 Java 程序员耳熟能详的 JDOM,DOM4J 等等, 它们基本上属于对 DOM 接口功能的扩充,保留了很多 DOM API 的特性,许多原本的 DOM 程序员甚至都没有任何障碍就熟练掌握了另外两者的使用,直观、易于操作的方式使它深受广大 Java 程序员的喜爱。

绿色环保的 SAX

SAX 的应运而生有它特殊的需要,为什么说它绿色环保呢,这是因为 SAX 使用了最少的系统资源和最快速的解析方式对 XML 处理提供了支持。 但随之而来繁琐的查找方式也给广大程序员带来许多困扰,常常令人头痛不已,同时它对 XPath 查询功能的支持,令人们对它又爱又恨。

默默无闻的 Digester:XML 的 JavaBean 化

Digester 是 apache 基金组织下的一个开源项目,笔者对它的了解源于对 Struts 框架的研究,是否有很多程序员想要一解各大开源框架的设计甚至想要自己写一个功能强大的框架时会碰到这样一个难题: 这些形形色色的用 XML 语言标记的框架配置文件,框架底层是用什么技术来解析呢? DOM 解析耗费时间,SAX 解析又过于繁琐,况且每次解析系统开销也会过大, 于是,大家想到需要用与 XML 结构相对应的 JavaBean 来装载这些信息,由此 Digester 应运而生。它的出现为 XML 转换为 JavaBean 对象的需求带来了方便的操作接口,使得更多的类似需求得到了比较完美的解决方法, 不再需要程序员自己实现此类繁琐的解析程序了。与此同时 SUN 也推出了 XML 和 JavaBean 转换工具类 JAXB,有兴趣的读者可以自行了解。

三种解析方式比较

DOM

优缺点:实现 W3C 标准,有多种编程语言支持这种解析方式,并且这种方法本身操作上简单快捷,十分易于初学者掌握。其处理方式是将 XML 整个作为类似树结构的方式读入内存中以便操作及解析,因此支持应用程序对 XML 数据的内容和结构进行修改,但是同时由于其需要在处理开始时将整个 XML 文件读入到内存中去进行分析,因此其在解析大数据量的 XML 文件时会遇到类似于内存泄露以及程序崩溃的风险,请对这点多加注意。

适用范围:小型 XML 文件解析、需要全解析或者大部分解析 XML、需要修改 XML 树内容以生成自己的对象模型

SAX

SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用。支持 XPath 查询的 SAX 使得开发人员更加灵活,处理起 XML 来更加的得心应手。但是同时,其仍然有一些不足之处也困扰广大的开发人员:首先是它十分复杂的 API 接口令人望而生畏,其次由于其是属于类似流解析的文件扫描方式,因此不支持应用程序对于 XML 树内容结构等的修改,可能会有不便之处。

适用范围:大型 XML 文件解析、只需要部分解析或者只想取得部分 XML 树内容、有 XPath 查询需求、有自己生成特定 XML 树对象模型的需求

Digester/JAXB

优缺点 : 由于其是在上述两者的基础上衍生出来的工具类,为的是满足将 XML 转换为 JavaBean 的特殊需求,故而没有什么特别明显的优缺点。作为大名鼎鼎的开源框架 Struts 的 XML 解析工具 Digester,为我们带来了将 XML 转换为 JavaBean 的可靠方法。

适用范围 : 有将 XML 文档直接转换为 JavaBean 需求。

应用示例

下面给出一段用于解析的 XML 片段:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <books>
  3. <book id="001">
  4. <title>Harry Potter</title>
  5. <author>J K. Rowling</author>
  6. </book>
  7. <book id="002">
  8. <title>Learning XML</title>
  9. <author>Erik T. Ray</author>
  10. </book>
  11. </books>

DOM解析XML

Java 中的 DOM 接口简介: JDK 中的 DOM API 遵循 W3C DOM 规范,其中 org.w3c.dom 包提供了 Document、DocumentType、Node、NodeList、Element 等接口, 这些接口均是访问 DOM 文档所必须的。我们可以利用这些接口创建、遍历、修改 DOM 文档。

javax.xml.parsers 包中的 DoumentBuilder 和 DocumentBuilderFactory 用于解析 XML 文档生成对应的 DOM Document 对象。

javax.xml.transform.dom 和 javax.xml.transform.stream 包中 DOMSource 类和 StreamSource 类,用于将更新后的 DOM 文档写入 XML 文件。

下面给出一个运用 DOM 解析 XML 的例子:

  1. import java.io.File;
  2. import java.io.IOException;
  3. import javax.xml.parsers.DocumentBuilder;
  4. import javax.xml.parsers.DocumentBuilderFactory;
  5. import javax.xml.parsers.ParserConfigurationException;
  6. import org.w3c.dom.Document;
  7. import org.w3c.dom.Element;
  8. import org.w3c.dom.Node;
  9. import org.w3c.dom.NodeList;
  10. import org.xml.sax.SAXException;
  11. public class DOMParser {
  12. DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
  13. //Load and parse XML file into DOM
  14. public Document parse(String filePath) {
  15. Document document = null;
  16. try {
  17. //DOM parser instance
  18. DocumentBuilder builder = builderFactory.newDocumentBuilder();
  19. //parse an XML file into a DOM tree
  20. document = builder.parse(new File(filePath));
  21. } catch (ParserConfigurationException e) {
  22. e.printStackTrace();
  23. } catch (SAXException e) {
  24. e.printStackTrace();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. return document;
  29. }
  30. public static void main(String[] args) {
  31. DOMParser parser = new DOMParser();
  32. Document document = parser.parse("books.xml");
  33. //get root element
  34. Element rootElement = document.getDocumentElement();
  35. //traverse child elements
  36. NodeList nodes = rootElement.getChildNodes();
  37. for (int i=0; i < nodes.getLength(); i++)
  38. {
  39. Node node = nodes.item(i);
  40. if (node.getNodeType() == Node.ELEMENT_NODE) {
  41. Element child = (Element) node;
  42. //process child element
  43. }
  44. }
  45. NodeList nodeList = rootElement.getElementsByTagName("book");
  46. if(nodeList != null)
  47. {
  48. for (int i = 0 ; i < nodeList.getLength(); i++)
  49. {
  50. Element element = (Element)nodeList.item(i);
  51. String id = element.getAttribute("id");
  52. }
  53. }
  54. }
  55. }

在上面的例子中,DOMParser 的 Parse() 方法负责解析 XML 文件并生成对应的 DOM Document 对象。其中 DocumentBuilderFactory 用于生成 DOM 文档解析器以便解析 XML 文档。 在获取了 XML 文件对应的 Document 对象之后,我们可以调用一系列的 API 方便的对文档对象模型中的元素进行访问和处理。 需要注意的是调用 Element 对象的 getChildNodes() 方法时将返回其下所有的子节点,其中包括空白节点,因此需要在处理子 Element 之前对节点类型加以判断。

可以看出 DOM 解析 XML 易于开发,只需要通过解析器建立起 XML 对应的 DOM 树型结构后便可以方便的使用 API 对节点进行访问和处理,支持节点的删除和修改等。 但是 DOM 解析 XML 文件时会将整个 XML 文件的内容解析成树型结构存放在内存中,因此不适合用 DOM 解析很大的 XML 文件。

Java处理XML的三种主流技术及介绍(2)

2012-08-15 10:44 顾彬/冯晨/乔彬 IBM developerWorks 我要评论(0) 字号:T | T

XML (eXtensible Markup Language) 意为可扩展标记语言,它已经是软件开发行业中大多数程序员和厂商用以选择作为数据传输的载体。本文作者对于 Java 处理 XML 的几种主流技术进行一些总结和介绍,希望帮助那些有不同需求的开发人员对于 XML 处理技术的作出最优的选择。

AD:51CTO 网+首届APP创新评选大赛火热启动——超百万资源等你拿!

SAX解析XML

与 DOM 建立树形结构的方式不同,SAX 采用事件模型来解析 XML 文档,是解析 XML 文档的一种更快速、更轻量的方法。 利用 SAX 可以对 XML 文档进行有选择的解析和访问,而不必像 DOM 那样加载整个文档,因此它对内存的要求较低。 但 SAX 对 XML 文档的解析为一次性读取,不创建任何文档对象,很难同时访问文档中的多处数据。

下面是一个 SAX 解析 XML 的例子:

  1. import org.xml.sax.Attributes;
  2. import org.xml.sax.SAXException;
  3. import org.xml.sax.XMLReader;
  4. import org.xml.sax.helpers.DefaultHandler;
  5. import org.xml.sax.helpers.XMLReaderFactory;
  6. public class SAXParser {
  7. class BookHandler extends DefaultHandler {
  8. private List<String> nameList;
  9. private boolean title = false;
  10. public List<String> getNameList() {
  11. return nameList;
  12. }
  13. // Called at start of an XML document
  14. @Override
  15. public void startDocument() throws SAXException {
  16. System.out.println("Start parsing document...");
  17. nameList = new ArrayList<String>();
  18. }
  19. // Called at end of an XML document
  20. @Override
  21. public void endDocument() throws SAXException {
  22. System.out.println("End");
  23. }
  24. /**
  25. * Start processing of an element.
  26. * @param namespaceURI  Namespace URI
  27. * @param localName  The local name, without prefix
  28. * @param qName  The qualified name, with prefix
  29. * @param atts  The attributes of the element
  30. */
  31. @Override
  32. public void startElement(String uri, String localName, String qName,
  33. Attributes atts) throws SAXException {
  34. // Using qualified name because we are not using xmlns prefixes here.
  35. if (qName.equals("title")) {
  36. title = true;
  37. }
  38. }
  39. @Override
  40. public void endElement(String namespaceURI, String localName, String qName)
  41. throws SAXException {
  42. // End of processing current element
  43. if (title) {
  44. title = false;
  45. }
  46. }
  47. @Override
  48. public void characters(char[] ch, int start, int length) {
  49. // Processing character data inside an element
  50. if (title) {
  51. String bookTitle = new String(ch, start, length);
  52. System.out.println("Book title: " + bookTitle);
  53. nameList.add(bookTitle);
  54. }
  55. }
  56. }
  57. public static void main(String[] args) throws SAXException, IOException {
  58. XMLReader parser = XMLReaderFactory.createXMLReader();
  59. BookHandler bookHandler = (new SAXParser()).new BookHandler();
  60. parser.setContentHandler(bookHandler);
  61. parser.parse("books.xml");
  62. System.out.println(bookHandler.getNameList());
  63. }
  64. }

SAX 解析器接口和事件处理器接口定义在 org.xml.sax 包中。主要的接口包括 ContentHandler、DTDHandler、EntityResolver 及 ErrorHandler。 其中 ContentHandler 是主要的处理器接口,用于处理基本的文档解析事件;DTDHandler 和 EntityResolver 接口用于处理与 DTD 验证和实体解析相关的事件; ErrorHandler 是基本的错误处理接口。DefaultHandler 类实现了上述四个事件处理接口。上面的例子中 BookHandler 继承了 DefaultHandler 类, 并覆盖了其中的五个回调方法 startDocument()、endDocument()、startElement()、endElement() 及 characters() 以加入自己的事件处理逻辑。

Digester 解析 XML

为了满足将 XML 转换为 JavaBean 的特殊需求,Apache 旗下的一个名为 Digester 的工具为我们提供了这么一个选择。由于最终是将 XML 转化为 JavaBean 存储在内存当中, 故而解析性能等方面其实与使用者并没有多大关系。解析的关键在于用以匹配 XML 的模式以及规则等,由于该工具较为复杂,限于篇幅,作者只能给予简单的介绍。

下面是一个 Digester 解析 XML 的例子片段:

  1. // 定义要解析的 XML 的路径,并初始化工具类
  2. File input = new File("books.xml");
  3. Digester digester = new Digester();
  4. // 如果碰到了 <books> 这个标签,应该初始化 test.myBean.Books 这个 JavaBean 并填装相关内容
  5. digester.addObjectCreate("books", "test.myBean.Books");
  6. digester.addSetProperties("books");
  7. // 如果碰到了 <books/book> 这个标签,同上初始化 test.myBean.Book 这个 JavaBean
  8. digester.addObjectCreate("books/book", "test.myBean.Book");
  9. digester.addSetProperties("books/book");
  10. // 通过调用上面已经初始化过的 JavaBean 的 addBook() 方法来把多个 <books/book> 加到一个集合中
  11. digester.addSetNext("books/book", "addBook", "test.myBean.Book");
  12. // 定义好了上面的解析规则后,就可以开始进行解析工作了
  13. Books books = (Books) digester.parse(input);

上述代码简单的向读者展示了 Digester 处理 XML 的一些要点,主要是说明了一些模式以及规则的匹配。 简言之,Digester 就是一种用来把一个 XML 转化为一个与该 XML 结构类似的 JavaBean。你可以把 XML 根元素想象成一个 JavaBean, 该根元素的 attribute 就是这个 JavaBean 的各种 Field,当该根元素有其他子 tag 时,又要把这个子 tag 想象成一个个新的 XML,将其视为一个新的 JavaBean, 并作为一个 Field 加入到父 Bean 当中,然后以此类推,通过循环的方式将整个 XML 进行解析。

结束语

本文介绍了 Java 解析 XML 的三种常用技术,其中 DOM 易于上手,程序易于理解,但缺点在于占用内存大,不适合于解析较大的 XML 文件; SAX 基于事件模型占用系统资源少,能够胜任较大的 XML 文件解析,但解析过程较为繁琐查找元素不方便; Digester/JAXB 基于上述两种技术衍生而来。文中的实例向读者展示了三种 API 的基本使用方法, 在实际开发过程中使用那种技术解析 XML 更好要依据各自的优缺点视具体情况而定。

转载于:https://www.cnblogs.com/handsome1013/p/5144302.html

Java处理XML的三种主流技术及介绍相关推荐

  1. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax;import org.xml.sax.Attributes; import org.xml.sax.SAXEx ...

  2. Java解析Xml的三种方式总结

    转自:http://blog.csdn.net/zjf280441589/article/details/50613881 XML解析技术有两种 DOM SAX DOM方式  根据XML的层级结构在内 ...

  3. 三种主流深度相机介绍

    随着机器视觉,自动驾驶等颠覆性的技术逐步发展,采用 3D 相机进行物体识别,行为识别,场景 建模的相关应用越来越多,可以说深度相机就是终端和机器人的眼睛,那么什么是深度相机呢,跟之前的普通相机(2D) ...

  4. 零信任的三种主流技术【远航】

  5. 当前java web架构形式_关于三种主流WEB架构的思考

    关于三种主流WEB架构的思考Haohappy  haohappy AT msn.com转载请注明来源: 做WEB好几年了,各种语言和技术都稍有涉猎.今天心血来潮,突然想总结一下.其实不论什么技术,什么 ...

  6. 三种主流RIA技术之争,你该如何选型?

    前几天听说Adobe发布了用于Flash Player的RTMP(实时消息协议).乍一看,好像是一个不错的东东.号称有如下优点:支持高性能地把数据(主要是音频.视频)PUSH给Flash Player ...

  7. 三种主流无线同屏技术介绍(Miracast、DLNA与AirPlay技术)

    不知道大家对无线同屏技术有多少了解,当这种技术普及的时候,我想我们的工作与生活又会方便很多吧!下面是目前三种主流同屏技术的介绍: 目前这种将终端信号经由WiFi传输到电视.电视盒的技术有三种:DLNA ...

  8. BackSwap银行***利用三种全新技术清空银行帐户

    美国ESET公司的安全专家在最近发现了一种名为"BackSwap(由ESET检测为Win32/BackSwap.A)"的新型银行***,它采用了三种全新的技术从×××那里窃取资金, ...

  9. 详解Java解析XML的四种方法

    http://developer.51cto.com  2009-03-31 13:12  cnlw1985  javaeye  我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...

最新文章

  1. 深入浅出Unix IO模型
  2. 《高级软件测试》实践作业4学习记录12月25日
  3. GraphSAGE节点分类
  4. unity, 颜色随高度渐变shader
  5. ANSYS——相同模型不同创建方式的同载荷同约束下的比较
  6. VS 2008 生成操作中各个选项的差别
  7. python类的属性和对象属性_python 类属性、对象属性-阿里云开发者社区
  8. 如何下载Lucene.net源码
  9. 人工智能目标检测模型总结(三)——yolov1模型(2)
  10. 7. memcache 细节
  11. 金融标准化“十四五”规划突出数据安全
  12. 计算机网络:逆向工程(精细版)
  13. linux设置默认mbr,将默认 EC2 CentOS MBR 转换为 GPT 以绕过 2TiB 限制
  14. 别踩白块儿游戏代码html,别踩白块儿.html · 知足常乐大哥哥/not-step-on-white-block - Gitee.com...
  15. 乐客巴巴集团年会于2021年1月17日在广州举行
  16. pdf合并、生成目录大纲
  17. x1c 语言设置,创新经典平衡点 ThinkPad X1Carbon评测
  18. 希腊字母发音对照表(发音即对应latex表达式)
  19. Facebook和Heroku结成伙伴关系
  20. 字典生成----在线密码破解工具hydra和medusa的使用

热门文章

  1. mysql截取后八位_sql 截取字符串
  2. 移动端开发注意事项、需要注意的问题、特殊属性、精灵图、座固定有自适应的布局
  3. css 全屏显示一张图片_css3背景图片全屏显示的例子
  4. 机器学习基石 机器学习技法 林轩田 课件 ppt
  5. SpringBoot 入门---摘抄自【纯洁的微笑】大哥的文章,不胜感激!
  6. 教育机构招生小程序解决招生难题
  7. 瑞波三年长跑一朝胜诉
  8. 中国MDI市场深度调研与投资竞争策略分析报告2022-2028年
  9. Emotet银行***传播特制感恩节“祝福”
  10. python windows桌面程序开发_Python 零基础入门