差异SAXParserFactory XMLReaderFactory。哪一个选择?

时间:2012-05-14 12:40:35

标签: java xml sax jaxp

它们似乎都有相同的目的(创建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"));

问题:

这些是主要的差异,还是有一些我已经监督过。

您应该选择哪一个?

2 个答案:

答案 0 :(得分:4)

JAXP APIsjavax.xml.parsers包中定义。该软件包包含供应商中立的工厂类,如SAXParserFactory,它们为您提供S AXParser

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

  • SAXParser定义包装XMLReader的API 实施班。

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

  • Java Runtime附带一个默认实现XMLReader

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

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

如果您知道您的应用程序将始终使用SAXParserFactory SAX2,则可以使用XMLReader

答案 1 :(得分: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正在出现并填补了一些空白,因此这个特殊的差距被填补了两次。