コンピューティングにおいて、Java XMLアプリケーションプログラミングインターフェース(API)の一つであるJava API for XML Processing(JAXP)(/ ˈdʒækspiː / JAKS -pee )は、 XMLドキュメントの検証と解析機能を提供します。JAXPには、 3つの基本的な解析インターフェースがあります。
APIは、解析インターフェースに加えて、XMLドキュメントに対するデータ変換や構造変換を行うためのXSLTインターフェースも提供します。
JAXPは、Javaコミュニティプロセスの下で、JSR 5(JAXP 1.0)、JSR 63(JAXP 1.1および1.2)、JSR 206(JAXP 1.3)として開発されました。
JAXPバージョン1.4.4は2010年9月3日にリリースされました。JAXP 1.3は2008年2月12日にサポート終了となりました。
DOMインターフェースは、XMLドキュメント全体を解析し、Document Object Model Level 2 Core Specificationに記載されているクラスと概念を用いて、ドキュメントの完全なメモリ内表現を構築します。
DOMパーサーは、メモリ内に表現を構築するため、と呼ばれます。はによって作成されます。[ 2 ]は、XMLドキュメント内のノードを含むツリー構造であるインスタンスを 作成します。構造内の各ツリーノードはインターフェースを実装します。XMLドキュメントに含まれるデータの種類を表すさまざまなタイプのツリーノードの中で、最も重要なものは次のとおりです。DocumentBuilderDocumentjavax.xml.parsers.DocumentBuilderjavax.xml.parsers.DocumentBuilderFactoryDocumentBuilderorg.w3c.dom.Documentorg.w3c.dom.Node
これによりjavax.xml.parsers.SAXParserFactory、SAXパーサーが作成されますSAXParser。DOMパーサーとは異なり、SAXパーサーはXMLドキュメントのメモリ内表現を作成しないため、実行速度が速く、メモリ使用量も少なくなります。代わりに、SAXパーサーはコールバックを呼び出すことによって、つまりパーサーに提供されたインスタンスのメソッドを呼び出すことによって、クライアントにXMLドキュメントの構造を通知します。このドキュメントへのアクセス方法は、ストリーミングXMLDefaultHandlerと呼ばれます。
このDefaultHandlerクラスはContentHandler、、、、およびインターフェースを実装します。ほとんどのクライアントはErrorHandler、 SAXパーサーがXMLドキュメント内の対応する要素を検出したときに呼び出される、インターフェースで定義されているメソッドに関心を持つでしょう。このインターフェースで最も重要なメソッドは次のとおりです。DTDHandlerEntityResolverContentHandler
startDocument()そして、endDocument()XMLドキュメントの開始時と終了時に呼び出されるメソッド。startElement()そして、endElement()ドキュメント要素の開始時と終了時に呼び出されるメソッド。characters()XMLドキュメント要素の開始タグと終了タグの間に含まれるテキストデータの内容を渡して呼び出されるメソッド。クライアントは、これらのメソッドをオーバーライドしてデータを処理するサブクラスを提供しますDefaultHandler。これには、データをデータベースに保存したり、ストリームに書き出したりすることが含まれます。
解析処理中に、パーサーは外部ドキュメントにアクセスする必要がある場合があります。XMLカタログを使用することで、頻繁に使用するドキュメントをローカルキャッシュに保存することが可能です。
これは2000年5月にJava 1.3で導入されました。[ 3 ]
StAXは、DOMとSAXインターフェースの中間的な役割を担うものとして設計されました。その比喩で言えば、プログラムによるエントリポイントは、ドキュメント内の特定の位置を表すカーソルです。アプリケーションはカーソルを前方に移動させ、必要に応じてパーサーから情報を「プル」します。これは、SAXのようなイベントベースのAPIとは異なります。SAXはデータをアプリケーションに「プッシュ」するため、アプリケーションはドキュメント内の位置を追跡するために、イベント間で状態を維持する必要があります。
XMLスタイルシート変換言語(XSLT )は、XMLドキュメントを他の形式のデータに変換することを可能にします。JAXPパッケージには、アプリケーションがXSLT変換を呼び出すためのインターフェースが用意されています。このインターフェースは元々TrAX(Transformation API for XML)と呼ばれ、複数のJava XSLTプロセッサの開発者による非公式な共同作業によって開発されました。javax.xml.transform
インターフェースの主な機能は以下のとおりです。
TransformerFactory、TransformerFactory.newInstance()、TransformerFactory.newInstance(String factoryClassName, ClassLoader classLoader)。Templates、スタイルシートのコンパイル済み形式を表すオブジェクトを作成します。これはスレッド セーフなオブジェクトであり、同じスタイルシートを複数のソース ドキュメント (または異なるパラメータを持つ同じソース ドキュメント) に適用するために、繰り返し、直列または並列で使用できます ( TransformerFactory.newTemplates(Source source)) 。また、TransformerFactory.newTransformer(Source source)、TransformerFactory.newTransformer()) オブジェクトのメソッドを使用して、スタイルシートの実行可能形式を表す を作成します( )。これはスレッド間で共有できませんが、直列に再利用できます。 は、スタイルシート パラメータとシリアル化オプション (たとえば、出力をインデントするかどうか) を設定するメソッドと、変換を実際に実行するメソッドを提供します ( )。Templatesjavax.xml.transform.TransformerTemplates.newTransformer()TransformerTransformerFactory.transformer(Source xmlSource, Result outputTarget)変換の入力と出力を表すために、2 つの抽象インターフェースSourceとが定義されています。これは Java インターフェースのやや非従来的な使用法です。なぜなら、プロセッサがインターフェースを実装するクラスをすべて受け入れるという想定はなく、各プロセッサはどの種類のまたはを処理するかを選択できるからです。実際には、すべての JAXP プロセッサは、いくつかの標準的な Source ( 、 ) の種類といくつかの標準的な Result ( 、 )の種類、および場合によっては独自のその他の実装をサポートしています。ResultSourceResultDOMSourceSAXSourceStreamSourceDOMResultSAXResultStreamResult
XSLT変換を実行する最も原始的でありながら完全な例は次のようになります。
/* ファイル src/examples/xslt/XsltDemo.java */パッケージexamples.xslt ;import java.io.StringReader ; import java.io.StringWriter ;import javax.xml.transform.Transformer ; import javax.xml.transform.TransformerException ; import javax.xml.transform.TransformerFactory ; import javax.xml.transform.TransformerFactoryConfigurationError ; import javax.xml.transform.stream.StreamResult ; import javax.xml.transform.stream.StreamSource ;public class XsltDemo { public static void main ( String [] args ) throws TransformerFactoryConfigurationError , TransformerException { //language=xslt String xsltResource = """ <?xml version='1.0' encoding='UTF-8'?> <xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:output method='xml' indent='no'/> <xsl:template match='/'> <reRoot><reNode><xsl:value-of select='/root/node/@val' /> world</reNode></reRoot> </xsl:template> </xsl:stylesheet> """ ; // language=XML String xmlSourceResource = """ <?xml version='1.0' encoding='UTF-8'?> <root><node val='hello'/></root> """ ;StringWriter xmlResultResource = new StringWriter ();Transformer xmlTransformer = TransformerFactory.newInstance (). newTransformer ( new StreamSource ( new StringReader ( xsltResource ) ) ) ;xmlTransformer.transform ( new StreamSource ( new StringReader ( xmlSourceResource )) , new StreamResult ( xmlResultResource ) ) ;System.out.println ( xmlResultResource.getBuffer ( ) . toString ( ) ) ; } }これは、以下のハードコードされたXSLT変換を適用します。
<?xml version='1.0' encoding='UTF-8'?> <xsl:stylesheet version= '2.0' xmlns:xsl= 'http://www.w3.org/1999/XSL/Transform' > <xsl:output method= 'xml' indent= 'no' /> <xsl:template match= '/' > <reRoot><reNode><xsl:value-of select= '/root/node/@val' /> world </reNode></reRoot> </xsl:template> </xsl:stylesheet>以下のハードコードされたXMLドキュメントへ:
<?xml version='1.0' encoding='UTF-8'?> <root><node val= 'hello' /></root>実行結果は
<?xml version="1.0" encoding="UTF-8"?> <reRoot><reNode> hello world </reNode></reRoot>