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

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

作为 XML 解析的新手,我正在尝试了解不同的技术。针对不同需求的不同技术令人困惑:

仅举几例。

DOM 和 SAX 似乎是解析和处理 XML 的低级方法,所以我决定关注那些在不同来源中被提及最多的低级方法-级别:

DOM、SAX、JAXP。

我在 Whosebug, JAXP-Tutorial from Oracle, XML-Parsing in general 上阅读了一般的解析器,等等。

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

我现在对 DOM 和 SAX 有了一点了解,但我仍然不明白使用 JAXP 的原因。内部使用DOM、SAX、……似乎更像是一个接口,但为什么不直接使用DOM或SAX呢?

通俗地说,使用JAXP有什么好处?

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

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

至于其他解析接口,分为两类:event-based API和tree-based API。 Tree-based APIs 更易于使用,但在处理大型文档时会占用大量内存。

两个主要的 event-based API 是 SAX(推)和 StAX(拉)。许多程序员发现拉式解析更容易,因为您可以使用程序堆栈来维护状态信息;不幸的是,尽管 StAX API 有点问题 - 不同的实现以不同的方式修复了它的差距。 StAX 最完整、最可靠的实现是 Woodstox 解析器; SAX 最完整、最可靠的实现是 Apache Xerces。但是不要尝试使用 event-based 解析方法,除非您的应用程序确实需要该级别的性能(并且除非您具有避免在应用程序级别失去所有性能收益所需的经验级别。)

对于 tree-based API 而言,DOM 仍然占主导地位,仅仅是因为它由 W3C 定义并在 JDK 中实现,因此被视为 "standard";这也是所有关于该主题的书籍中提到的那个。然而,在所有树模型中,它无疑是设计最差的(主要是因为它早于名称空间的引入)。备选方案包括 JDOM2、DOM4J、XOM 和 AXIOM。我倾向于推荐 JDOM2 或 XOM.

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

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