XML構文解析は、XML文書を、「ノード」、「属性」、「文書」、「名前空間」、またはこれらの構文に関連するイベントのような分かりやすい構文を使用して操作するためのものです。
Javaには、 JAXPと呼ばれるXML文書処理用のネイティブAPI 、またはXML処理用のJava APIがあります 。 JAXPとリファレンス実装は、Java 1.4(JAXP v1.1)以降のすべてのJavaリリースにバンドルされて以来進化を遂げています。 Java 8には、JAXPバージョン1.6が付属しています。
APIは、XML文書と相互作用するさまざまな方法を提供します。
DOMインタフェースは、XMLを解釈するW3C DOM準拠の方法を提供することを目的としています。 JAXPのさまざまなバージョンでは、さまざまなDOMレベルの仕様(レベル3まで)がサポートされています。
ドキュメントオブジェクトモデルインタフェースの下では、XMLドキュメントはツリーとして表され、「ドキュメント要素」から始まります。 APIの基本型があるNode
タイプ、それから移動することを可能にするNode
ではないすべて、が(親、子、または兄弟をNode
Sは子供を持つことができ、例えば、 Text
ノードは、ツリー中の最終であり、子供を持つことはない)。 XMLタグはElement
として表され、特に属性関連のメソッドでNode
を拡張します。
DOMインタフェースは、XMLドキュメントをツリーとして「1行」解析し、構築されたツリー(ノードの追加、抑制、コピーなど)の簡単な変更を可能にし、最後にそのシリアル化(ディスクに戻す)後の変更。しかし、これは価格がかかります:ツリーはメモリに常駐しているため、DOMツリーは膨大なXML文書には必ずしも実用的ではありません。さらに、ツリーの構築は、特にXML文書のすべての部分に興味がない場合に、XMLコンテンツを処理する最速の方法であるとは限りません。
SAX APIは、XMLドキュメントを処理するイベント指向のAPIです。このモデルでは、XMLドキュメントのコンポーネントはイベントとして解釈されます(たとえば、「タグが開かれた」、「タグが閉じられた」、「テキストノードに遭遇しました」、「コメントが発生しました」など)。 ..
SAX APIは、「プッシュ・パース」アプローチを使用します。このアプローチでは、SAX Parser
がXMLドキュメントの解釈を担当し、デリゲート( ContentHandler
)のメソッドを呼び出してXMLドキュメント内のイベントを処理します。通常、パーサを書くことはありませんが、XMLドキュメントから必要な情報をすべて収集するハンドラが用意されています。
SAXインターフェイスは、パーサーレベル(たとえば、名前空間のコンテキスト、検証状態)で必要最小限のデータのみを保持することによってDOMインターフェイスの制限を克服します。したがって、開発者が責任を負うContentHandler
によって保持される情報のみメモリに保持される。このようなアプローチでは、「時間を遡って/ XML文書に戻る」方法がないというトレードオフがあります。DOMではNode
が親に戻ることができますが、SAXにはそのような可能性はありません。
StAX APIは、SAX API(つまりイベント駆動型)と同様にXML処理に似たアプローチを採用していますが、StAXはプル・パーサー(SAXはプッシュ・パーサー)です。 SAXでは、 Parser
は制御され、 ContentHandler
コールバックを使用します。 Staxでは、パーサを呼び出し、次のXML "イベント"を取得するかどうかを制御します。
APIはXMLStreamReader (またはXMLEventReader )で始まります。これは、開発者がイテレータースタイルの方法でnextEvent()
ことができるゲートウェイです。