DOM.SAX.PULL.JDOM.DOM4J多种方式解析xml文件

387 阅读4分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

DOM:

原理:基于文档驱动,先把dom文件全部读到内存中,构建一个主流内存的树结构,使用DOM的API遍历所有数据,调用API检索想要的数据和操作数据。

优点:整个文档树存在内存中,可对XML文档进行操作,删除、修改等,可多次访问已解析的文档,由于在内存中以树形结构存放,因此检索和更新效率会更高。

缺点:解析XML文件时会将整个XML文件的内容解析成树形结构存放在内存中并创建新对象,比较消耗时间和内存。

使用场景:对于内存有限的设备,XML文档比较小,需要对解析文档进行一定的操作且一旦解析了文档需要多次访问这些数据的情况下可以考虑使用DOM方式,因为其检索和解析效率较高。

SAX:

原理:基于事件驱动,在读取XML文档内容时,事件源顺序地对文档进行扫描,当扫描到文档的开始与结束(Document)标签,节点元素的开始与结束(Element)标签时,直接调用对应的方法,并将状态信息以参数的形式传递到方法中,然后我们可以依据状态信息来执行相关的自定义操作。

优点:解析效率高,占存少,灵活性高

缺点: 解析方法复杂(API接口复杂),代码量大,可扩展性差,无法对XML树内容进行任何修改。

使用场景:适用于处理大型XML文档,性能要求较高,不需要对解析文档进行修改且不需要对解析文档多次访问的场合。

PULL

原理:PULL的解析方式与SAX解析类似,都是基于事件的模式。PULL提供了开始元素和结束元素,当某个元素开始时,我们可以调用parser,nextText从XML文档中提取所有字符数据,与SAX不同的是,在PULL解析过程中触发相应的事件调用方法返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不香SAX那样由处理器触发一种事件的方法而执行代码,当解析到一个文档结束时,自动生成EndDocument事件。

优点:SAX的优点PULL都有,而且解析方法比SAX更加简单

缺点:可扩展性差,无法对XML树内容结构进行任何修改

使用场景:适用于需要处理大型XML文档,性能要求较高,不需要对解析文档进行修改且不需要对解析文档多次访问的场合。

同样的使用场景,在SAX和PULL解析方法中,更加推荐PULL方法。

JDOM

原理:它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入),它包含一些转换器以将JDOM表示输出为SAX2事件流,DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。

优点:JDOM仅使用具体类而不适用接口,这在某些方面简化了API,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

缺点:灵活性较差,自身包含解析器,通常使用SAX2解析器来解析和验证输入XML文档。

DOM4J

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

优点:大量使用了API中的Collections类,在许多情况下,它还提供了一些替代方法以允许更好的性能或更直接的编码方法,相比于JDOM来说,有更好的灵活性。

缺点:有着更为复杂的API。

整体来说,当前使用DOM4J最多,也是最方便的,当然,也需要根据实际情况进行实际分析。