在Java中直接使用JAXP而不是DOM / SAX有什么好处?

时间:2016-01-05 09:55:48

标签: java xml dom sax jaxp

成为XML解析的新手我试图理解不同的技术。针对不同的需求存在大量不同的技术:

  • W3C-DOM
  • XOM
  • JDOM
  • JAXP
  • JAXB
  • DOM
  • SAX
  • StAX的
  • 了TrAX
  • Woodstox
  • DOM4J
  • 深红
  • VTD-XML
  • 的Xerces-J
  • 蓖麻
  • XStream的
  • ...

仅举几例。

DOM和SAX似乎是解析和处理XML的低级方式,因此我决定专注于那些在不同来源中被提及最多并且是低级别的方法:

DOM,SAX,JAXP。

我已经在stackoverflowJAXP-Tutorial from OracleXML-Parsing in general上阅读了一般解析器,等等。

我还尝试了一些教程,例如this german one和其他教程。

我现在正在掌握一些关于DOM和SAX的内容,但使用JAXP的原因仍然超出我的意思。它似乎更像是一个在内部使用DOM,SAX,...的接口,但为什么不直接使用DOM或SAX呢?

在外行人的条款中使用JAXP有什么好处?

2 个答案:

答案 0 :(得分:9)

(虽然你没有这么明确地说过,但你的问题似乎只与Java世界有关,而这个答案反映了这一点。)

JAXP是一组接口,涵盖XML解析,XSLT转换和XML模式验证。如果我们只关注XML解析方面,它的主要贡献是提供一种定位XML解析器实现的机制,因此您的源代码不会被锁定到特定产品中。坦率地说,这些日子价值有限;常用的两个SAX / DOM解析器是JDK中嵌入的解析器和Apache Xerces。除了需要单独下载之外,Apache Xerces在各个方面都更好。

对于其他解析接口,它们分为两类:基于事件的API和基于树的API。基于树的API更易于使用,但在处理大型文档时可能会占用大量内存。

两个主要的基于事件的API是SAX(推送)和StAX(拉动)。拉解析是许多程序员更容易找到的东西,因为你可以使用程序堆栈来维护状态信息;不幸的是,虽然StAX API有点儿错误 - 不同的实现已经以不同的方式修复了它的差距。 StAX最完整可靠的实现是Woodstox解析器; SAX最完整可靠的实现是Apache Xerces。但是,不要尝试使用基于事件的解析方法,除非您的应用程序确实需要该级别的性能(除非您具有避免在应用程序级别丢失所有性能增益所需的经验水平。)

对于基于树的API,DOM仍然占主导地位,因为它由W3C定义并在JDK中实现,因此被视为“标准”;这也是关于这个主题的所有书籍中提到的那个。然而,在所有树模型中,毫无疑问它是最糟糕的设计(主要是因为它早于名称空间的引入)。替代方案包括JDOM2,DOM4J,XOM和AXIOM。我倾向于推荐JDOM2或XOM。

答案 1 :(得分:1)

JAXP只是Sun(现在是Oracle的)名称,它们是与JDK捆绑在一起的SAX和DOM类的集合。如果您正在使用JAXP,那么您也使用SAX和/或DOM。这不是一回事。

JAXP还在javax.xml.parsers包中添加了一些辅助类,它们填补了SAX 1和DOM 1中的空白,即15年前这些库的旧版本。然而,对于今天使用的SAX2 / DOM3,这些不是必需的。更糟糕的是,诸如DocumentBuilderFactory和SAXParserFactory之类的javax.xml.parsers类以令人困惑的方式设计(默认情况下它们不能识别名称空间),因此它们几乎总是被错误地使用。然后开发人员来到这里询问为什么他们的计划没有做他们认为应该做的事情。只需忽略这些类并使用XMLReaderFactory(SAX 2)或DOMImplementationLS(DOM 3)。