Java解析XML的原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuquan0071/article/details/50290629

在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组织实现的好。

目前Java XML解析器有十多种之多,解析原理有二:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。但并不是所有的Java XML解析工具都实现了SUN提供的接口。DOM4J就没有遵循SUN的JAXP规范,但非常优秀。

DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。

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

SAX是由XML_DEV邮件列表的成员开发的,它不是某个官方机构的标准,也不由W3C组织或其他任何官方机构维护,但它是XML社区事实上的标准。虽然SAX只是“民间”标准,但是它在XML中的应用丝毫不比DOM少,几乎所有的XML解析器都支持它。SAX 解析器采用了基于事件的模型,它在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

DOM和SAX只是定义了一些接口,以及某些接口的默认实现,一个应用程序要想利用DOM或SAX访问XML文档,还需要一个实现了DOM或SAX的解析器(实现DOM和SAX中定义的接口,提供DOM和SAX定义的功能)。

Apache的Xerces是一个使用非常广泛的解析其,它提供了DOM和SAX的调用接口,并有多种语言的实现版本,要利用Xerces访问XML文档,只需要在应用程序中构造一个解析器实现类的对象。

这里面还存在一个问题,虽然使用的是标准的DOM和SAX接口,由于不同的XML解析器的实现类是不同的,如果使用另外一种解析器,仍然需要修改应用程序,只不过修改的代码量较小,需要更改XML解析器实现类的类名,然后重新编译、发布。

然而,对于兼容JAXP的XML解析器,我们可以选用JAXP API,这样在更换兼容JAXP解析器的时候,就不用对已发布的程序做任何的改动。

JAXP开发包由javax.xml包、org.w3c.dom包、org.xml.sax包及其子包组成。在javax.xml.parsers包中,定义了几个工厂类,用于加载DOM和SAX的实现类。

阅读更多

没有更多推荐了,返回首页