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、アプリケーションが XML ドキュメントを解析するための SAX ベースのパーサーを構成および取得できるようにするファクトリ API を定義します。

  • SAXParserXMLReader 実装クラスをラップする API を定義します。

  • パッケージorg.xml.saxは、基本的な SAX API を定義します。

  • Java ランタイムにはデフォルトの実装が付属していますXMLReader

SAXParserFactory(SAX1) ParserFactory / (SAX2) XMLReaderFactory などの詳細を非表示にします。

JAXPデフォルトのパーサーを別のJAXPパーサー (デフォルトの実装には既知の非互換性/バグがある可能性があります)に置き換えたい場合は、ベンダー ニュートラルを使用する必要がありますSAXParserFactory

アプリケーションが常に を使用することがわかっている場合は、SAX2 XMLReaderを使用できますXMLReaderFactory

于 2012-05-14T14:28:42.040 に答える
2

JavaでのXML処理に関する本を書いたElliotteRustyHaroldは、かつて次のように書いています。

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の他の部分と一貫性があるという理由だけで、パーサーインスタンスを取得するデフォルトの方法として使用します。

歴史的に、2つは並行して開発されました。JAXPは元々SAX1に不足している機能を追加しようとしましたが、並行してSAX2が登場し、いくつかのギャップを埋めていたため、この特定のギャップは2回埋められました。

于 2012-05-14T16:25:17.770 に答える