繁体   English   中英

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

[英]What is the advantage of using JAXP instead of DOM / SAX directly in Java?

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

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

仅举几个。

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

DOM,SAX,JAXP。

我已经在stackoverflowOracle的JAXP-Tutorial ,一般的XML-Parsing等一般性地阅读了解析器。

我也尝试了一些类似德语和其他的教程。

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

在外行术语中使用JAXP有什么好处?

(虽然你没有这么明确地说过,但你的问题似乎只与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。

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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM