ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server 使用上の注意
Interstage

2.12.30 XML処理(JAXP)を使用する際の注意事項

V10以降のバージョンに同梱しているJDK/JREでは、Apache Xalan 2.7.1、および Apache Xerces 2.9.1に基づくJAXP実装(以降、「新しいJAXP実装」と表記します)を提供します。

V10より前のバージョンに同梱されているJDK/JRE 5.0、JDK/JRE 6 では、Apache Xalan 2.6.0、および、Apache Xerces 2.6.2に基づいたJAXP実装(以降、「従来のJAXP実装」と表記します)を提供してきました。JAXP実装のバージョン変更に伴い、以下の点で注意が必要です。

XSLTの処理中エラーについて

XSLTの処理中にエラーが発生した場合に、例外をスローしなくなります。
javax.xml.transform.ErrorListenerの仕様では、XSLTの処理中にエラーが発生しても、例外をスローしないことになっています。
詳細は、javax.xml.transform.ErrorListenerのJavaDocを参照してください。

しかし、従来のJAXP実装では、例外がスローされるようになっていました。新しいJAXP実装は、JAXPの仕様に従うため、例外をスローしないように変更されています。
このため、XSLTの処理中にエラーが発生した場合の動作が変わります。
XSLTの処理中にエラーが発生した場合のエラーハンドリング詳細についてはjavax.xml.transform.ErrorListener の JavaDocを参照してください。

javax.xml.parsers.SAXParser#setProperty()メソッド使用時の注意

javax.xml.parsers.SAXParser#setProperty()メソッドを使用してFeatureを設定できません。
従来のJAXP実装では、FeatureをsetProperty()メソッドで設定することが可能でした。しかし、新しいJAXP実装では、PropertyとFeatureを明確に区別するように変更されたため、setProperty()メソッドでFeatureを設定することができません。

setProperty()メソッドでFeatureを設定しようとした場合、以下の例外が発生する場合があります。

  org.xml.sax.SAXNotRecognizedException: Property 'XXXX' is not recognized.
    XXXXは、設定しようとしたFeature名

その場合は、SAXParserを取得するSAXParserFactoryのsetFeature()メソッドを使用しFeatureを設定するように変更してください。

XML文書のエンコーディング指定の解釈について

XML文書のエンコーディング指定の解釈が厳格になります。
新しいJAXP実装では、XML文書のxml宣言に指定するencoding属性の値を解釈する際に、XMLの仕様に沿ったチェックを行うようになります。
そのため、IANA(Internet Assigned Numbers Authority)で規定されていないエンコード名をencoding属性の値として指定した場合、以下の例外が発生する場合があります。

  org.xml.sax.SAXParseException: Invalid encoding name "XXXX".
    XXXXはencoding属性に指定したエンコーディング名

たとえば、IANAに規定されていない「Shift-JIS」というエンコーディング名をxml文書のencoding属性に指定している場合、新しいJAXP実装では、例外が発生するようになります。(IANAでは「Shift_JIS」と規定されています。)
その場合は、XML文書のxml宣言中にあるencoding属性の値をIANAで規定されている正しいエンコーディング名に変更してください。

XMLパーサ、XSLTプロセッサの実装パッケージ名、クラス名について

XMLパーサ、XSLTプロセッサの実装パッケージ名、クラス名が変更になります。
この注意事項は、標準JAXP APIのみを使用しているアプリケーションには影響ありません。

従来のJAXP実装は、com.sun.org.apache.xxxというパッケージ名で提供されてきました。
新しいJAXP実装で使用されるパッケージ名/クラス名は、Apacheの配布するモジュールと同じになります。(org.apache.xxxというパッケージ名になります。)
従来のJAXP実装のクラスから、内部APIを使用するようなアプリケーションでは、import文や完全修飾名でクラスを使用している箇所があります。
新しいJAXP実装を利用するためには、import文や完全修飾名で指定している箇所を変更する必要があります。

デフォルトで動作するXMLパーサ、XSLTプロセッサについて

デフォルトで動作するXMLパーサ、XSLTプロセッサが変更になります。
標準JAXP APIを使用してXMLパーサやXSLTプロセッサをインスタンス化する場合、java実行時に各Factory経由でXMLパーサやXSLTプロセッサをインスタンス化します。使用するXMLパーサやXSLTプロセッサを利用者が明示的に指定していない場合、従来のJAXP実装では、com.sun.org.apache.xxxパッケージ配下のクラスが使用されていました。
新しいJAXP実装では、org.apache.xxxパッケージのクラスを使用するように変更されています。
また、従来のJAXP実装のクラスを使用する指定がなされていた場合にも、新しいJAXP実装であるorg.apache.xxxパッケージのクラスを使用するように変更しています。

任意のバージョンのXalanやXercesについて

任意のバージョンのXalanやXercesを、java実行時のオプション-classpath、-cp、またはCLASSPATH環境変数で指定しても、動作させることができません。
新しいJAXP実装は、java実行時のオプション-classpath、-cp、またはCLASSPATH環境変数の指定よりも、クラスパス検索順として優先度の高い位置に配置されます。
また、新しいJAXP実装は、Apacheの配布するモジュールとクラス名、パッケージ名が同じであるため、クラスパス検索順で先に見つかったもの(優先度の高いもの)が使用されます。
そのため、java実行時のオプション-classpath、-cp、またはCLASSPATH環境変数でApacheの配布する任意のバージョンのXalanやXercesをご使用の場合は、endorsedの機構を利用して使用してください。

指定方法の詳細は下記ドキュメントを参照してください。

新しいJAXP実装使用時の性能が低下について

新しいJAXP実装を使用することにより性能が低下する場合があります。
新しいJAXP実装では、従来のJAXP実装のXSLT処理で使用していたXSLTCではなく、Apache Xalanプロジェクトでデフォルト動作しているインタプリタモードのトランスフォーマが使用されます。
そのため、アプリケーションの実装によっては性能が低下する場合があります。

性能が顕著に低下する場合は、XSLTCが有効になるようにjava実行時のオプションに以下を追加してください。

"-Djavax.xml.transform.TransformerFactory=org.apache.xalan.xsltc.trax.TransformerFactoryImpl"

互換性の影響などによりやむを得ず、従来のJAXP実装であるcom.sun.org.apache.xxxパッケージのXMLパーサ、XSLTプロセッサを使用する必要がある場合には、java実行時のオプションに以下を指定することで、従来のJAXP実装を使用することができます。

"-Dcom.fujitsu.jdkext.jaxp.impl.compat"

ただし、本オプションを指定した場合には、新しいJAXP実装は使用されません。