8

它们似乎都有相同的目的(创建一个 XMLReader)。一些教程包含一个,一些包含另一个。

SAXParserFactory:

示例代码:

// SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.parse(new InputSource("document.xml"));

XMLReaderFactory:

示例代码:

// XMLReaderFactory
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.parse(new InputSource("document.xml"));

问题:

这些是主要区别还是我监督过的一些区别。

你应该选择哪一个?

4

2 回答 2

4

主要JAXP APIsjavax.xml.parsers包中定义。该包包含供应商中立的工厂类,例如SAXParserFactory给你一个 S AXParser

SAXParserFactory定义了一个工厂 API,使应用程序能够配置和获取基于 SAX 的解析器来解析 XML 文档。

  • SAXParser定义了包装 XMLReader 实现类的 API 。

  • org.xml.sax定义了基本的 SAX API。

  • Java 运行时带有一个默认实现XMLReader

SAXParserFactory您隐藏 (SAX1) ParserFactory / (SAX2) XMLReaderFactory, ... 的详细信息。

如果您希望能够用JAXP不同的解析器替换默认解析器JAXP(默认实现中可能存在已知的不兼容/错误)实现,您应该使用供应商中立SAXParserFactory

如果您知道您的应用程序将始终使用 aSAX2 XMLReader您可以使用XMLReaderFactory.

于 2012-05-14T14:28:42.040 回答
2

Elliotte Rusty Harold 曾写过一本关于用 Java 处理 XML 的书,他曾经写道:

SAXParserFactory [is] a hideous, evil monstrosity of a class that should 
be hung, shot, beheaded, drawn and quartered, burned at the stake, 
buried in unconsecrated ground, dug up, cremated, and the ashes tossed 
in the Tiber while the complete cast of Wicked sings "Ding dong, the 
witch is dead."  --Elliotte Rusty Harold on xml-dev 

我实际上不会走那么远(如果我这样做了,我会尝试使其符合语法)。像很多 JAXP 一样,它不是最美妙的设计;但我确实使用它作为获取解析器实例的默认方式,只是因为它与 JAXP 的其他部分一致。

从历史上看,两者是并行发展的。JAXP 最初试图向 SAX1 添加缺少的功能,但与此同时,SAX2 出现并填补了一些空白,因此这个特殊的空白被填补了两次。

于 2012-05-14T16:25:17.770 回答