Java 差异SAXParserFactory XMLReaderFactory。选择哪一个?

Java 差异SAXParserFactory XMLReaderFactory。选择哪一个?,java,xml,sax,jaxp,Java,Xml,Sax,Jaxp,两者似乎有相同的目的(创建一个XMLReader)。 有些教程包含一个,有些包含另一个 SAXParserFactory: 似乎更易于配置 更多锅炉板代码 官方支持的api 示例代码: // SAXParserFactory SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader reader = parser.getXML

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

SAXParserFactory:

  • 似乎更易于配置
  • 更多锅炉板代码
  • 官方支持的api
示例代码:

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

  • 少两行代码
  • 不太可配置
  • comunity得到了支持,而且毫无戒心
示例代码:

// SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.parse(new InputSource("document.xml"));
// XMLReaderFactory
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.parse(new InputSource("document.xml"));
问题:

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


您应该选择哪一个?

主要的
JAXP API
javax.xml.parsers
包中定义。该包包含与供应商无关的工厂类,如
SAXParserFactory
,它为您提供了一个S
AXParser

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

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

  • org.xml.sax
    定义了基本的SAXAPI

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

SAXParserFactory
隐藏了(SAX1)ParserFactory/(SAX2)XMLReaderFactory。。。从你这里

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


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

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出现并填补了一些空白,因此这个特殊的空白被填补了两次。

SAXParserFactory是JAXP,而XMLReaderFactory是“官方”SAXAPI。我记得O'Reilly的老SAX2书推荐了官方API,因为它处理名称空间的方式。我不知道这是否还相关。但是,我想我会使用XMLReaderFactory,除非出于某种原因需要JAXP。也许其他人可以提供更多的电流输入。