StAX API は XML 文書の入出力を行うクラス群ですが、入出力それぞれに『ストリーム・ベース』と『イベント・ベース』の2種類のアプローチがあります。
イベント・ベース
SAX を説明したときに「SAX イベント」という言葉を(勝手に)使っていました。 これは、説明の為に持ち出した概念 (?) でしたが、「イベント・ベース」のアプローチでは、XML 文書の解析時に実際にこのようなイベント javax.xml.stream.events.XMLEvent のオブジェクトを生成します。 XMLEvent オブジェクトを生成する分、SAX や「ストリーム・ベース」に比べてパフォーマンス的には悪いですが、オブジェクト指向にそっている分、プログラミングはしやすいかと思います。 また、「ストリーム・ベース」のコーディングをする際にも、考え方は「イベント・ベース」の場合と大体同じなので、「イベント・ベース」のコーディング方法も知っておいた方がよいかと思います。
ストリーム・ベース
パフォーマンスが要求される場合には「ストリーム・ベース」のアプローチを用いましょう。 「ストリーム・ベース」のアプローチでは、プログラムにもよりますが、SAX と同程度のパフォーマンスが出せるそうです。
XMLInputFactory, XMLOutputFactory クラス
『ストリーム・ベース』と『イベント・ベース』のどちらのアプローチでも、入力は javax.xml.stream.XMLInputFactory クラスから作成し、出力は javax.xml.stream.XMLOutputFactory クラスから作成します:

XMLInputFactory, XMLOutputFactory クラスの使い方、特にこれらのファクトリ・クラスのインスタンスを取得する方法は javax.xml.parsers パッケージにあったファクトリ・クラスと殆ど同じです:
// 1. XMLInputFactory オブジェクトを取得する XMLInputFactory factory = XMLInputFactory.newInstance(); // 2. (必要なら)XMLInputFactory の設定をする factory.setProperty("some-property", propObj); // 3. XMLStreamReader または XMLEventReader のインスタンスを取得する factory.createXMLStreamReader(new FileReader("sample.xml"));
XMLOutputFactory の使い方も同様です。 XMLInputFactory オブジェクトから XMLStreamReader や XMLEventReader のインスタンスを取得する方法はまたもう少し詳しくやります。