Cosminexus V11 アプリケーションサーバ Cosminexus XML Processor ユーザーズガイド

解説・手引書

3021-3-J22-70

前書き

対象製品

マニュアル「アプリケーションサーバ & BPM/ESB基盤 概説」の前書きの対象製品の説明を参照してください。

輸出時の注意

本製品を輸出される場合には、外国為替及び外国貿易法の規制並びに米国輸出管理規則など外国の輸出関連法規をご確認の上、必要な手続きをお取りください。

なお、不明な場合は、弊社担当営業にお問い合わせください。

商標類

AIXは，世界の多くの国で登録されたInternational Business Machines Corporationの商標です。

Microsoft，Windows，Windows Server は，マイクロソフト 企業グループの商標です。

Oracle(R)，Java ，MySQL及びNetSuite は，Oracle，その子会社及び関連会社の米国及びその他の国における登録商標です。

UNIXは，The Open Groupの登録商標です。

その他記載の会社名，製品名などは，それぞれの会社の商標もしくは登録商標です。

This product includes software developed by the Apache Software Foundation (http://www.apache.org/).

発行

2025年 4月 3021-3-J22-70

著作権

All Rights Reserved. Copyright (C) 2020, 2025, Hitachi, Ltd.

変更内容

変更内容(3021-3-J22-70) uCosminexus Application Server 11-60，uCosminexus Client 11-60，uCosminexus Developer 11-60，uCosminexus Service Architect 11-60，uCosminexus Service Platform 11-60

追加・変更内容

変更個所

記載内容は変更なし（リンク情報だけを変更した）。

-

単なる誤字・脱字などはお断りなく訂正しました。

はじめに

このマニュアルをお読みになる際の前提情報については，マニュアル「アプリケーションサーバ & BPM/ESB基盤 概説」のはじめにの説明を参照してください。

1　XML Processorの概要

この章では，XML Processorを使用する前に知っておく必要のあるXML Processorの特長，位置づけ，サポート範囲について説明します。

サポート範囲では，使用できるXMLパーサ・XSLTトランスフォーマの機能，JAXBデータバインディングの機能，および処理できる文字コードについて説明し，XML Processorの拡張機能について紹介します。

1.1　XML Processorの特長

XML ProcessorはJava言語用の標準XML APIであるJAXP，JAXBをサポートし，XMLパーサ機能，XSLTトランスフォーマ機能を提供するミドルウェアです。また，StAXストリーミングパーサ機能，JAXBデータバインディング機能も提供します。次にXML Processorの特長を説明します。

1.1.1　プラットフォーム間で共通のプログラムを作成できる

XML ProcessorはJAXPおよびJAXBをサポートします。

JAXP（Java API for XML Processing）は，JCP（Java Community Process）のJSR 206で定義されるJava言語用の標準XML APIです。JAXPには，XMLパーサ（DOMパーサ・SAXパーサ），XSLTトランスフォーマなどを生成するAPIが含まれています。

JAXB（The Java Architecture for XML Binding）は，Java Community ProcessのJSR 222で定義されている標準XML APIです。JAXBには，XML SchemaからJavaへ変換するスキーマコンパイラ，JavaからXML Schemaへ変換するスキーマジェネレータ，およびXML文書とJavaクラス間のデータを交換するAPIが含まれています。

XML Processorがサポートしている標準XML APIは，XMLパーサ，XSLTトランスフォーマ，JAXBデータバインディングなどの実装やコードに依存しません。そのため，XML文書を処理・操作するプログラムを作成する際に，使用するXMLパーサ，XSLTトランスフォーマ，JAXBデータバインディングなどの実装を意識しなくても，異なるプラットフォーム間で共通のプログラムを作成できます。

1.1.2　JavaプログラムでXML文書を容易に解析できる

XML ProcessorはJAXPの実装を提供しているため，JavaプログラムでXMLパーサを使用できます。

XMLパーサは，XML文書を解析し，解析したデータを扱いやすいデータ構造にして，ユーザプログラムに提供するライブラリです。XML文書を解析する際には，XML文書内のタグや属性などが，XML SchemaやDTDに従っているかどうかも検証できます。

JAXPでXML文書を解析する流れを次の図に示します。

図1‒1　JAXPでXML文書を解析する流れ

JAXPを使用すると，JavaプログラムでXMLパーサ（SAXパーサ，StAXパーサ，またはDOMパーサ）を生成して，XML文書を解析できます。

1.1.3　JavaプログラムでXML文書を容易に変換できる

XML ProcessorはJAXPの実装を提供しているため，JavaプログラムでXSLTトランスフォーマを使用できます。

XSLTはXML文書の構造変換を行うための仕様です。XSLTを実装したものをXSLTトランスフォーマと呼びます。XSLTトランスフォーマはXML文書を読み込み，加工して出力します。XML文書だけでなく，HTML，テキストも出力できます。

JAXPでXML文書を変換する流れを次の図に示します。JAXPを使用すると，JavaプログラムでXSLTトランスフォーマのXML文書の変換処理を操作できます。

図1‒2　JAXPでXML文書を変換する流れ

1.1.4　XML基盤のアプリケーションの開発容易性が向上する

XML ProcessorはJAXBの実装を提供しています。スキーマ文書をスキーマコンパイラに入力すると，スキーマ文書で定義したXML文書にアクセスするためのJavaクラスを生成します。このJavaクラスを使用すると，XML基盤のアプリケーションを容易に開発できます。JAXBを使用してXMLを処理する流れを次の図に示します。

図1‒3　JAXBを使用してXMLを処理する流れ（新規開発）

スキーマジェネレータにJavaクラスを入力すると，Javaクラスのデータ構造と等価なスキーマ文書を生成します。これによって，既存資産であるJavaクラスを流用して，XML基盤のアプリケーションを容易に構築できます。JAXBを使用して，既存のJavaクラスでXML基盤のアプリケーションを構築する流れを次の図に示します。

図1‒4　JAXBを使用してXMLを処理する流れ（既存Javaクラス流用）

1.2　XML Processorの位置づけ

この節では，アプリケーションサーバ Version 11環境でのXML Processorの位置づけを説明します。

XML Processorは，アプリケーションサーバ Version 11でXML文書の解析，操作，生成とXSLT変換などを必要とする局面で使用します。また，アプリケーションサーバ Version 11のほかの製品と組み合わせることで，SOAP通信基盤などの，昨今必要とされているXML基盤のアプリケーション統合を可能にする環境を構築できます。

アプリケーションサーバの実行環境でのXML Processorの位置づけを次の図に示します。

図1‒5　アプリケーションサーバ実行環境でのXML Processorの位置づけ

1.3　XML Processorのサポート範囲

この節では，XML Processorのサポート範囲について説明します。

1.3.1　使用できるXMLパーサ，XSLTトランスフォーマなどの機能

XML Processorは，JAXP1.4およびJAXB2.2の仕様をサポートしています。JAXPを介して使用されるXMLパーサ機能，XSLTトランスフォーマ機能などは，次に示すJAXPで定義された仕様の範囲内で使用できます。

注意事項

JAXPの各バージョン間には，若干の仕様差があります。同様に，JAXB2.2も，従来のJAXB2.1に対して若干の仕様差があるので注意してください。

JAXBのサポート範囲の詳細については，「付録B　JAXB仕様のサポート範囲」を参照してください。

(1)　JAXPで定義された仕様

JSR 206 Java API for XML Processing (JAXP) 1.4

APIの使用方法は次に示すページをご覧ください。

http://docs.oracle.com/javase/6/docs/api/

Extensible Markup Language (XML)

Extensible Markup Language (XML) 1.1

http://www.w3.org/TR/xml11

XML 1.1 First Edition Specification Errata

http://www.w3.org/XML/xml-V11-1e-errata

Extensible Markup Language (XML) 1.0 (Third Edition)

http://www.w3.org/TR/2004/REC-xml-20040204/

Extensible Markup Language (XML) 1.0 (Third Edition) Errata

http://www.w3.org/XML/xml-V10-3e-errata

Namespaces in XML

Namespaces in XML 1.1

http://www.w3.org/TR/xml-names11/

Namespaces in XML 1.1 Errata

http://www.w3.org/XML/2004/xml-names11-errata

Namespaces in XML 1.0

http://www.w3.org/TR/REC-xml-names

Namespaces in XML 1.0 Errata

http://www.w3.org/XML/xml-names-19990114-errata

XML Schema

XML Schema Part 1: Structures Second Edition

http://www.w3.org/TR/xmlschema-1/

XML Schema Part 1: Structures Second Edition Errata

http://www.w3.org/2004/03/xmlschema-errata#Errata1

XML Schema Part 2: Datatypes Second Edition

http://www.w3.org/TR/xmlschema-2/

XML Schema Part 2: Datatypes Second Edition Errata

http://www.w3.org/2004/03/xmlschema-errata#Errata2

XSL Transformations (XSLT)

XSL Transformations (XSLT) Version 1.0

http://www.w3.org/TR/xslt

XSL Transformations (XSLT) Version 1.0 Errata

http://www.w3.org/1999/11/REC-xslt-19991116-errata

XML Path Language (XPath)

XML Path Language (XPath) Version 1.0

http://www.w3.org/TR/xpath

XML Path Language (XPath) Version 1.0 Errata

http://www.w3.org/1999/11/REC-xpath-19991116-errata

XML Inclusions (XInclude)

XML Inclusions (XInclude) Version 1.0

http://www.w3.org/TR/xinclude/

Document Object Model (DOM) Level 3

Document Object Model (DOM) Level 3 Core

http://www.w3.org/TR/DOM-Level-3-Core

Document Object Model (DOM) Level 3 Load and Save

http://www.w3.org/TR/DOM-Level-3-LS

Simple API for XML (SAX)

Simple API for XML (SAX) 2.0.2 (sax2r3)

http://sax.sourceforge.net/

Simple API for XML (SAX) 2.0.2 (sax2r3) Extensions

http://sax.sourceforge.net/?selected=ext

Streaming API for XML(StAX)

Streaming API for XML (StAX) Version 1.0

http://jcp.org/en/jsr/detail?id=173

(2)　JAXBで定義された仕様

JSR 222 The JavaArchitecture for XML Binding 2.2

APIの使用方法は次に示すページをご覧ください。

http://jcp.org/aboutJava/communityprocess/mrel/jsr222/index2.html

1.3.2　処理できる文字コード

XML文書の文字コードは，XML文書に記述するXML宣言のencoding属性（encoding="XXX"のXXXの部分）に指定します。このほかにも，XML文書の入力ソースとなるInputSourceオブジェクトのエンコーディングに指定する方法などがあります。

XML Processorでは，IANAに登録された文字コードのうち次のものを処理できます。文字コードの定義については，IANAのCHARACTER SETSに関するドキュメントを参照してください。

UTF-8

UTF-16

UTF-16BE

UTF-16LE

Shift_JIS※1

Windows-31J

ISO-2022-JP

EUC-JP

US-ASCII

ISO-10646-UCS-2

ISO-10646-UCS-4※2

ISO-8859-1

注※1

Shift_JISを使用するときに適用される文字エンコーディング（SJISまたはMS932）の切り替えについては，「1.3.3　Shift_JIS切り替え機能」を参照してください。

注※2

バイトオーダーがbig-endianまたはlittle-endianであり，かつ，Byte-Order-Markが付加されていない形式だけをサポートします。

注意事項

上記以外の文字コードを使用した場合の動作は保証しません。

1.3.3　Shift_JIS切り替え機能

Shift_JIS切り替え機能は，XML文書のencoding属性にShift_JISが指定されている場合に，XML Processorが適用する文字エンコーディングを切り替える機能です。文字エンコーディングは，XMLパーサやXSLTトランスフォーマのインスタンスごとに切り替えられます。

XML文書のencodingに指定されている文字エンコーディングは，XML Processorが提供するShift_JIS切り替え機能での指定に従って，SJIS（x-sjis-jdk1.1.7）またはMS932（x-sjis-cp932）に切り替えられます。XML文書のencoding指定と適用される文字エンコーディングとの対応については，「3.1　Shift_JIS切り替え機能」の表3-1を参照してください。

Shift_JIS切り替え機能の使用方法については，「3.1　Shift_JIS切り替え機能」を参照してください。

1.3.4　XSLTCトランスフォーマ機能

XSLTCトランスフォーマは，XML Processorが提供しているXSLTトランスフォーマと同じ機能を持ちながら，XML文書の変換処理の性能を向上させたものです。XML Processorでは，XSLTトランスフォーマとXSLTCトランスフォーマの両方を使用したアプリケーションの開発が可能です。

XSLTCトランスフォーマ機能の使用方法については，「3.2.4　XSLTCトランスフォーマの使用方法」を参照してください。

1.3.5　スキーマキャッシュ機能

スキーマキャッシュ機能とは，XML Schemaで定義されたスキーマ文書を解析処理した結果（grammarオブジェクト）を事前にメモリ上，またはディスク上にキャッシュする機能です。スキーマ文書をgrammarオブジェクトに変換する処理をキャッシュの参照に置き換えるため，妥当性検証の性能を向上させることができます。

キャッシュの対象とするスキーマ文書は，設定ファイル（スキーマ定義ファイル）に記述する必要があります。

スキーマキャッシュ機能の使用方法については，「3.3　スキーマキャッシュ機能」を参照してください。

1.3.6　高速パース機能

高速パース機能とは，事前解析によって解析対象のXML文書の特徴を学習し，以降のXML文書解析時に学習結果を利用することで，解析処理の実行速度を向上させる機能です。

高速パース機能の使用方法については，「3.4　高速パース機能」を参照してください。

1.3.7　Apache独自の機能

XML Processorの08-70以降では，JAXPの規格とは別に，Apache独自のフィーチャー，プロパティ，および名前空間URIを使用できます。これらの独自機能は，XMLパーサやXSLT・XSLTCトランスフォーマで使用できます。ただし，JAXPの規格外の機能であるため，動作は保証されません。そのため，事前に十分な動作確認を実施するなどの対策が必要です。

Apache独自の機能の詳細については，「3.5　Apache独自の機能」を参照してください。

2　JAXPおよびJAXBの機能

この章では，JAXPおよびJAXBを使用してプログラムを作成する際に知っておく必要のあるJAXPおよびJAXBの概要について説明します。

2.1　JAXPとは

JAXP（Java API for XML Processing）は，Java Community ProcessのJSR 206で定義されるJava言語用の標準XML APIです。

XML Processorが提供するJAXPの機能を次の表に示します。

表2‒1　XML Processorが提供するJAXPの機能

機能の名称

機能の概要

DOM

XML文書を解析してDOMツリーを生成します。また，生成したDOMツリーを操作します。

SAX

XML文書を解析してSAXのイベントを発生させます。また，発生したイベントを処理します。

StAX

XML文書を解析してStAXのイベントを発生させます。また，発生したイベントを処理します。ハンドラが不要なため，XML文書を手続き的に処理できます。

XSLT

XML文書を入力し，スタイルシートに基づいて変換し，ほかのXML文書，HTML，テキストとして出力します。

XPath

XPath式を評価します。

Validation

XML文書をスキーマ文書に基づいて検証します。

Datatype

W3C XML Schema 1.0で規定された日付／時刻型データを処理します。

JAXPには，DOMパーサ，SAXパーサ，StAXパーサ，XSLTトランスフォーマ，XPathオブジェクト，Validationオブジェクト，およびDatatypeオブジェクトを生成するAPIが含まれています。これらのAPIはJAXPの実装に依存しないので，XML文書を処理・操作するプログラムを作成する際に，使用するXMLプロセッサの実装を意識する必要がありません。そのため，異なるプラットフォーム間で共通のプログラムを作成できます。

2.2　JAXPが規定するパッケージとその機能

JAXPは，「2.1　JAXPとは」の表2-1に示した機能を利用するためのパッケージを規定しています。JAXPが規定するパッケージに含まれるAPIの概要を次の表に示します。

表2‒2　JAXPが規定するパッケージに含まれるAPIの概要

パッケージの名称

パッケージに含まれるAPIの概要

javax.xml.parsers

DOMパーサおよびSAXパーサでの解析を行うためのAPI。

javax.xml.stream

StAXパースのためのAPI。

javax.xml.stream.events

javax.xml.stream.util

javax.xml.transform

XSLTトランスフォーマのためのAPI。

javax.xml.transform.dom

XSLTトランスフォーマの入出力にDOMを使用するためのAPI。

javax.xml.transform.sax

XSLTトランスフォーマの入出力にSAXを使用するためのAPI。

javax.xml.transform.stax

XSLTトランスフォーマの入出力にStAXを使用するためのAPI。

javax.xml.transform.stream

XSLTトランスフォーマの入出力にストリームを使用するためのAPI。

javax.xml.validation

XML文書を検証するためのAPI。

javax.xml.xpath

XPath式を評価するためのAPI。

javax.xml.namespace

XML名前空間を処理するためのAPI。

javax.xml.datatype

W3C XML Schema 1.0で規定された日付／時刻型データを処理するためのAPI。

javax.xml

XML関連の文字列定数。

org.w3c.dom

DOMツリーを操作するAPI。

org.w3c.dom.bootstrap

DOM実装を取得するためのAPI。

org.w3c.dom.ls

XML文書をロードおよび保存するためのAPI。

org.w3c.dom.events

DOMのイベント処理のためのAPI。

org.xml.sax

SAXの基本処理のためのAPI。

org.xml.sax.ext

SAXの拡張処理のためのAPI。

org.xml.sax.helpers

SAXの処理のためのヘルパークラス群。

以降では，それぞれのパッケージの概要について説明します。

2.2.1　javax.xml.parsersパッケージ

javax.xml.parsersパッケージは，DOMパーサ，およびSAXパーサでの解析を行うためのAPIを提供するパッケージです。

DOMパーサでの解析を行うアプリケーションの処理の流れを図2-1に，SAXパーサでの解析を行うアプリケーションの処理の流れを図2-2に示します。

図2‒1　DOMパーサでの解析を行うアプリケーションの処理の流れ

図2‒2　SAXパーサでの解析を行うアプリケーションの処理の流れ

上記のほかに，XMLReaderFactoryクラスを用いてSAXパーサを生成する方法なども可能です。

javax.xml.parsersパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のChapter 7. Package javax.xml.parsersを参照してください。

DOMパーサでの解析を行うコーディング例については，「5.4　DOMパーサを使用するサンプルプログラム」を，SAXパーサでの解析を行うコーディング例については，「5.5　SAXパーサを使用するサンプルプログラム」を参照してください。

2.2.2　javax.xml.streamパッケージ

javax.xml.streamパッケージは，StAXパースのためのAPIを提供するパッケージです。

javax.xml.streamパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.3　javax.xml.stream.eventsパッケージ

javax.xml.stream.eventsパッケージは，StAXのイベント処理のAPIを提供するパッケージです。

javax.xml.stream.eventsパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.4　javax.xml.stream.utilパッケージ

javax.xml.stream.utilパッケージは，StAXの処理のためのユーティリティAPIを提供するパッケージです。

javax.xml.stream.utilパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.5　javax.xml.transformパッケージ

javax.xml.transformパッケージは，XSLTトランスフォーマのためのAPIを提供するパッケージです。

XSLTによる変換を行うアプリケーションの処理の流れを次の図に示します。

図2‒3　XSLTによる変換を行うアプリケーションの処理の流れ

javax.xml.transformパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

XSLTによる変換を行うコーディング例については，「5.7　XSLTトランスフォーマを使用するサンプルプログラム」を参照してください。

2.2.6　javax.xml.transform.domパッケージ

javax.xml.transform.domパッケージは，XSLTトランスフォーマの入出力にDOMを使用するためのAPIを提供するパッケージです。

javax.xml.transform.domパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.7　javax.xml.transform.saxパッケージ

javax.xml.transform.saxパッケージは，XSLTトランスフォーマの入出力にSAXを使用するためのAPIを提供するパッケージです。

javax.xml.transform.saxパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.8　javax.xml.transform.staxパッケージ

javax.xml.transform.staxパッケージは，XSLTトランスフォーマの入出力にStAXを使用するためのAPIを提供するパッケージです。

javax.xml.transform.staxパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.9　javax.xml.transform.streamパッケージ

javax.xml.transform.streamパッケージは，XSLTトランスフォーマの入出力にストリームを使用するためのAPIを提供するパッケージです。

javax.xml.transform.streamパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.10　javax.xml.validationパッケージ

javax.xml.validationパッケージは，XML文書を検証するためのAPIを提供するパッケージです。

javax.xml.validationパッケージに含まれるクラスを用いてXML文書を検証するアプリケーションの処理の流れを次の図に示します。

図2‒4　javax.xml.validationパッケージに含まれるクラスを用いてXML文書を検証するアプリケーションの処理の流れ

上記のほかに，DOMパーサでの解析と検証を同時に行うことも可能です。また，SAXパーサでの解析と検証を同時に行うことも可能です。

javax.xml.validationパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.11　javax.xml.xpathパッケージ

javax.xml.xpathパッケージは，XPath式を評価するためのAPIを提供するパッケージです。

XPath式を評価するアプリケーションの処理の流れを次の図に示します。

図2‒5　XPath式を評価するアプリケーションの処理の流れ

上記のほかに，InputSourceオブジェクトを入力としてXPath式を評価できます。

javax.xml.xpathパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.12　javax.xml.namespaceパッケージ

javax.xml.namespaceパッケージは，XML名前空間を処理するためのAPIを提供するパッケージです。このパッケージは，javax.xml.xpathパッケージおよびjavax.xml.datatypeパッケージに含まれるAPIの引数や戻り値としてだけ使用します。

javax.xml.namespaceパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.13　javax.xml.datatypeパッケージ

javax.xml.datatypeパッケージは，W3C XML Schema 1.0で規定された日付／時刻型データを処理するためのAPIを提供するパッケージです。

日付／時刻型データを処理するアプリケーションの処理の流れを次の図に示します。

図2‒6　日付／時刻型データを処理するアプリケーションの処理の流れ

javax.xml.datatypeパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.14　javax.xmlパッケージ

javax.xmlパッケージは，XML関連の文字列定数を定義したパッケージです。

javax.xmlパッケージの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のJavadocを参照してください。

2.2.15　org.w3c.domパッケージ

org.w3c.domパッケージは，DOMツリーを操作するAPIを提供するパッケージです。

DOMツリーを操作するアプリケーションの処理の流れを次の図に示します。

図2‒7　DOMツリーを操作するアプリケーションの処理の流れ

org.w3c.domパッケージの詳細については，W3C Document Object Model (DOM) Level 3 Core Specificationの次に示す個所を参照してください。

1.4 Fundamental Interfaces: Core Module

1.5 Extended Interfaces: XML Module

Appendix G: Java Language Binding G.2 Other Core interfaces

DOMツリーの操作を行うコーディング例は，「5.4　DOMパーサを使用するサンプルプログラム」を参照してください。

2.2.16　org.w3c.dom.bootstrapパッケージ

org.w3c.dom.bootstrapパッケージは，DOM実装を取得するためのAPIを提供するパッケージです。

org.w3c.dom.bootstrapパッケージの詳細については，W3C Document Object Model (DOM) Level 3 Core Specificationの次に示す個所を参照してください。

1.3.7 Bootstrapping

Appendix G: Java Language Binding G.1 Java Binding Extension

2.2.17　org.w3c.dom.lsパッケージ

org.w3c.dom.lsパッケージは，XML文書をロードおよび保存するためのAPIを提供するパッケージです。

XML文書のロード，および保存を行うアプリケーションの処理の流れを次の図に示します。

図2‒8　XML文書のロード，および保存を行うアプリケーションの処理の流れ

org.w3c.dom.lsパッケージの詳細については，W3C Document Object Model (DOM) Level 3 Load and Save Specificationの次に示す個所を参照してください。

1.3 Fundamental Interfaces

Appendix B: Java Language Binding

2.2.18　org.w3c.dom.eventsパッケージ

org.w3c.dom.eventsパッケージは，org.w3c.dom.ls.LSParserインタフェースを実装した非同期LSParserオブジェクトが使用します。XML Processorは非同期LSParserオブジェクトをサポートしないので，このパッケージは使用しません。

org.w3c.dom.eventsパッケージの詳細については，W3C Document Object Model (DOM) Level 3 Events Specificationの次に示す個所を参照してください。

1.6 Basic interfaces

1.7 Event module definitions

Appendix D: Java Language Binding

2.2.19　org.xml.saxパッケージ

org.xml.saxパッケージは，SAXの基本処理のためのAPIを提供するパッケージです。

SAXイベントを処理するアプリケーションの処理の流れを次の図に示します。

図2‒9　SAXイベントを処理するアプリケーションの処理の流れ

org.xml.saxパッケージの詳細については，Simple API for XML (SAX) 2.0.2 (sax2r3)のJavadocを参照してください。

SAXイベントを処理するコーディング例は，「5.5　SAXパーサを使用するサンプルプログラム」を参照してください。

2.2.20　org.xml.sax.extパッケージ

org.xml.sax.extパッケージは，SAXの拡張処理のためのAPIを提供するパッケージです。

org.xml.sax.extパッケージの詳細については，Simple API for XML (SAX) 2.0.2 (sax2r3) ExtensionsのJavadocを参照してください。

2.2.21　org.xml.sax.helpersパッケージ

org.xml.sax.helpersパッケージは，SAXの処理のためのヘルパークラス群を提供するパッケージです。

org.xml.sax.helpersパッケージの詳細については，Simple API for XML (SAX) 2.0.2 (sax2r3) ExtensionsのJavadocを参照してください。

2.3　JAXBとは

JAXB（The Java Architecture for XML Binding）は，Java Community ProcessのJSR 222で定義されているJava言語用の標準XML APIです。

XML Processorが提供するJAXBの機能は，「付録B　JAXB仕様のサポート範囲」を参照してください。

JAXBには，MarshallerおよびUnmarshallerなどを生成するAPIが含まれています。これらのAPIはJAXBの実装に依存しません。また，JAXBにはスキーマコンパイラおよびスキーマジェネレータが含まれています。これらが生成するJavaクラスやスキーマ文書はJAXBの実装に依存しません。このため，XML文書を処理・操作するプログラムを作成する際に，使用するXMLプロセッサの実装を意識する必要がありません。したがって，プラットフォーム間で共通のプログラムを作成できます。

2.4　JAXBが規定するパッケージとその機能

JAXBは，機能を利用するためのパッケージを規定しています。JAXBが規定するパッケージに含まれるAPIの概要を次の表に示します。

表2‒3　JAXBが規定するパッケージに含まれるAPIの概要

パッケージの名称

パッケージに含まれるAPIの概要

javax.xml.bind

マーシャル，アンマーシャルなどの実行時バインディングフレームワークのためのAPI。

javax.xml.bind.annotation

Javaクラスからスキーマ文書へのマッピングをカスタマイズするためのAPI。

javax.xml.bind.annotation.adapters

任意のJavaクラスをJAXBで使う場合に使用する，アダプタークラスのためのAPI。

javax.xml.bind.attachment

MIME形式のバイナリデータのマーシャル，アンマーシャルのためのAPI。

javax.xml.bind.util

JAXBのユーティリティ用API。

パッケージの詳細については，JSR 222 The Java Architecture for XML Binding 2.2のJavadocを参照してください。

2.5　JAXBのコマンド

JSR 222では，スキーマコンパイラおよびスキーマジェネレータの具体的な使用方法を規定していません。XML Processorでは，この節に示すコマンドでスキーマコンパイラおよびスキーマジェネレータを使用できます。

コマンド文法の説明で使用している記号

このマニュアルでは，次に示す記号を使用して，コマンドの形式を記述しています。

記号

意味

［　］

この記号で囲まれている項目は，省略してもよいことを示します。

<　>

この記号で囲まれている項目は，サービスロケーションやファイルなどの可変値を指定することを示します。

コマンドのファイル名・ディレクトリ名に指定できる文字，パス区切り文字，パスの指定方法

コマンドに指定するファイル名・ディレクトリ名の規則について次に示します。

コマンドのファイル名・ディレクトリ名に指定できる文字は英数字および次に示す記号です。

@　&　=　+　$　,　-　_　.　!　~　'　(　)

パス区切り文字として使用できる文字を次に示します。

¥（Windowsの場合）

/（UNIXの場合）

パスの指定方法は，絶対パスと相対パスのどちらも指定できます。

XML Processorが提供するコマンド

スキーマコンパイラ，スキーマジェネレータのコマンドラインインタフェースとしてXML Processorが提供するコマンドを次の表に示します。

表2‒4　提供コマンド一覧

コマンドのファイル名

機能

Windows

UNIX

csmxjc.bat

csmxjc

XML SchemaからJavaへバインディングするスキーマコンパイラです。

csmschemagen.bat

csmschemagen

JavaからXML Schemaへマッピングするスキーマジェネレータです。

2.5.1　csmxjcコマンド（XML SchemaからJavaへバインディングする）

(1)　形式

csmxjc [オプション [オプション引数] ] ... 入力スキーマ文書

オプションは省略できます。また，オプションは必ずスキーマ文書より前に指定してください。

(2)　機能

XML SchemaからJavaへバインディングするスキーマコンパイラです。

(3)　オプション

-b <外部バインディングファイル>

外部バインディングファイルを1つ指定します。外部バインディングファイル名の指定方法については，「コマンドのファイル名・ディレクトリ名に指定できる文字，パス区切り文字，パスの指定方法」を参照してください。

省略した場合は，外部バインディングファイルを使用しないでjavaクラスを生成します。

-d <出力先ディレクトリ>

Javaソースの出力先ディレクトリを指定します。ディレクトリ名の指定方法については，「コマンドのファイル名・ディレクトリ名に指定できる文字，パス区切り文字，パスの指定方法」を参照してください。

省略した場合は，カレントディレクトリが出力先ディレクトリになります。

-mark-generated

生成したJavaソースに@javax.annotation.Generatedアノテーションを追加します。

省略した場合は，Javaソースに@javax.annotation.Generatedアノテーションを追加しません。

Javaソースに追加される@javax.annotation.Generatedアノテーションの書式を次に示します。斜体の文字には，Javaソースを生成するたびに異なる値が入ります。

@Generated(value = "com.cosminexus.jaxb.tools.xjc.Driver", date = "yyyy-MM-ddTHH:mm:ssRFC822タイムゾーン")

@javax.annotation.Generatedアノテーションの要素とXML Processorで設定される値を次の表に示します。

表2‒5　@javax.annotation.Generatedアノテーションの要素とXML Processorで設定される値

要素名

説明

値

value

スキーマコンパイラの完全修飾クラス名

com.cosminexus.jaxb.tools.xjc.Driver

date

スキーマからJavaソースを生成した日時

yyyy-MM-ddTHH:mm:ssRFC822タイムゾーン※

注※

出力フォーマットの詳細についてはjava.text.SimpleDateFormatクラスの「日付/時刻パターン」を参照してください。

(4)　入力スキーマ文書

入力スキーマ文書のファイル名を1つ指定できます。ファイル名に指定できる文字，パス区切り文字，パスの指定方法については「コマンドのファイル名・ディレクトリ名に指定できる文字，パス区切り文字，パスの指定方法」を参照してください。

(5)　出力Javaソース

出力Javaソースのフォーマット

スキーマコンパイラが出力するJavaソースのフォーマットの概要を次の図に示します。

図2‒10　スキーマコンパイラが出力するJavaソースのフォーマットの概要

出力Javaソースのフォーマットの詳細を次に示します。

ヘッダ部

XML Processorで生成されたことを示すヘッダです。次のヘッダが挿入されます。

//
// This file was generated by Cosminexus XML Processor 09-50
// Any modifications to this file will be lost upon recompilation of the source schema.
//

package文，import文記述部

ソースに必要なpackage文やimport文が生成されます。生成されるpackage文，import文の内容はスキーマコンパイラに入力されたスキーマ文書に依存します。

javadoc部

入力スキーマ文書から生成したクラスについてjavadocの内容が自動生成されます。javadocの内容はスキーマコンパイラに入力されたスキーマ文書に依存します。

Javaクラス本体

入力スキーマ文書から生成したクラスが生成されます。Javaクラス本体の内容はスキーマコンパイラに入力されたスキーマ文書に依存します。

出力Javaソースのパッケージと出力先

出力Javaソースのパッケージ名と出力先について次に示します。

出力Javaソースのパッケージ名は次の優先順位で決定されます。Javaソースの出力先はカレントディレクトリ，または-dオプションで指定されたディレクトリを基準ディレクトリとして，次の規則を順番に適用して決定されます。

カスタムバインディングによるパッケージ名の指定がある場合

カスタムバインディング（jaxb：package要素）で指定されたパッケージ名が出力Javaソースのパッケージ名になります。パッケージ名をディレクトリ名に変換し，基準ディレクトリの下に作成します。作成したディレクトリにJavaソースを出力します。

入力スキーマ文書にtargetNamespace属性が指定されている場合

入力スキーマ文書に記述された対象名前空間から，JAXB仕様書に基づき出力Javaソースのパッケージ名を生成します。生成したパッケージ名をディレクトリ名に変換し，基準ディレクトリの下に作成します。作成したディレクトリにJavaソースを出力します。

入力スキーマ文書にカスタムバインディングによるパッケージ名の指定がなく，targetNamespace属性の指定もない場合

Javaソースのパッケージ名は"generated"になります。基準ディレクトリの下に"generated"という名称のディレクトリを作成し，作成したディレクトリにJavaソースを出力します。

出力先のディレクトリに同名のJavaソースが存在する場合は上書きされます。

(6)　戻り値

　　0：

　　正常終了しました。

　　0以外の値：

　　異常終了しました。

(7)　注意事項

JDK17以降で実行する場合，csmxjcコマンドを実行する前に環境変数CSMJAXB_VM_OPTSを次のように設定してください。

set "CSMJAXB_VM_OPTS=--add-opens=java.base/java.lang=ALL-UNNAMED"

2.5.2　csmschemagenコマンド（JavaからXML Schemaへマッピングする）

(1)　形式

csmschemagen [オプション [オプション引数] ] [package-info.java ファイル名] Javaソースファイル名

オプションとpackage-info.javaファイルは省略できます。また，オプションとpackage-info.javaは必ずJavaソースファイル名より前に指定してください。

(2)　機能

JavaからXML Schemaへマッピングするスキーマジェネレータです。

(3)　オプション

-d <出力先ディレクトリ>

出力スキーマ文書と中間ファイルの出力先ディレクトリを指定します。出力先ディレクトリ名の指定方法については，「コマンドのファイル名・ディレクトリ名に指定できる文字，パス区切り文字，パスの指定方法」を参照してください。

省略した場合は，カレントディレクトリが出力先ディレクトリになります。

-encoding <文字エンコーディング>

入力するJavaソースの文字エンコーディングを指定します。

XML Processorで指定できる文字エンコーディングについては，「1.3.2　処理できる文字コード」を参照してください。

省略した場合の動作は，使用しているOSによって次のように異なります。

Windowsの場合

OSにデフォルトで設定されている文字エンコーディングが適用されます。

UNIXの場合

環境変数LANGに指定されている文字エンコーディングが適用されます。環境変数LANGも指定されていない場合は，OSにデフォルトで設定されている文字エンコーディングが適用されます。

(4)　入力Javaソース

Javaソースファイルを1つ指定できます。ファイル名に指定できる文字，パス区切り文字，パスの指定方法については「コマンドのファイル名・ディレクトリ名に指定できる文字，パス区切り文字，パスの指定方法」を参照してください。

(5)　出力スキーマ文書

カレントディレクトリまたは-dオプションで指定されたディレクトリにscheman.xsd（nは数字）というファイル名で出力されます。出力先のディレクトリに同名のファイルが存在する場合は上書きされます。

(6)　中間ファイル

csmschemagenコマンドは，Javaソースファイルをコンパイルして，中間ファイルである.classファイルを生成します。

Javaソースファイルがpackage文を含む場合は，出力先ディレクトリの下にサブディレクトリを作成して.classファイルを出力します。サブディレクトリ名は，package文に指定したパッケージ名を基に決定します。

Javaソースファイルがpackage文を含まない場合は，出力先ディレクトリの直下に.classファイルを出力します。

.classファイルの出力先ディレクトリは，-dオプションで変更できます。

(7)　戻り値

　　0：

　　正常終了しました。

　　0以外の値：

　　異常終了しました。

(8)　注意事項

cosminexus09-70以降の実行について，csmschemagenコマンドはJava SE 8で提供しているschemagenコマンドを実行します。

サポートするオプションは，csmschemagenコマンドでサポートするオプションだけとなります。

オプションの指定が不正な場合，エラー表示をしないでコマンドが終了する場合があります。

出力されるコマンドのヘルプ情報はschemagenコマンドのヘルプ情報となります。

また，コンパイルできないjavaソースを指定した場合，エラー表示をしないでコマンドが終了しスキーマも生成されません。事前にjavacコマンドでエラーにならないことを確認してから実行してください。

3　XML Processorの拡張機能

この章では，XML Processorの拡張機能について説明します。

XML Processorで出力されるメッセージの説明については，マニュアル「アプリケーションサーバ メッセージ(構築／運用／開発用)」の「11.　KECX（XML Processorが出力するメッセージ）」に記載しています。

3.1　Shift_JIS切り替え機能

Shift_JIS切り替え機能は，XML文書のencoding属性にShift_JISが指定されている場合に，XML Processorが適用する文字エンコーディングをSJIS（x-sjis-jdk1.1.7）またはMS932（x-sjis-cp932）に切り替える機能です。XML文書のencoding指定と適用される文字エンコーディングとの対応を次の表に示します。

表3‒1　XML文書のencoding指定と適用される文字エンコーディングとの対応

XML文書のencoding指定

Shift_JIS切り替え機能の指定

適用される文字エンコーディング

Shift_JIS

指定なし

SJIS（デフォルト）

SJIS

SJIS

MS932

MS932

Windows-31J

−

MS932

（凡例）

−：指定できません。

Shift_JIS切り替え機能の指定は，XMLパーサやXSLTトランスフォーマのインスタンスに特定のプロパティを設定することで行います。プロパティの設定方法については「4.5　Shift_JIS切り替え機能のプロパティの使用方法」を参照してください。

Shift_JIS切り替え機能によるエンコーディング指定は，次のものに対して適用されます。それ以外には適用されません。

入力XML文書のencoding属性

InputSourceオブジェクトに設定されたエンコーディング

スタイルシート内のxsl:output要素のencoding属性に"Shift_JIS"を指定した場合，または，javax.xml.transform.TransformerクラスのsetOutputProperty，setOutputPropertiesメソッドで"Shift_JIS"エンコーディングを指定した場合の，出力文字ストリーム

ただし，次の場合は注意が必要です。

DOMパーサ，SAXパーサの入力ソースにInputSourceオブジェクトを指定する場合

InputSourceオブジェクトにShift_JIS以外のエンコーディングを設定したときには，Shift_JIS切り替え機能は無効になります。また，InputSourceオブジェクトにReaderが設定されているときにも，Shift_JIS切り替え機能は無効になり，Readerのエンコーディングが適用されます。

XSLTまたはXSLTCトランスフォーマの入力ソースにStreamSourceオブジェクトを指定する場合

StreamSourceオブジェクトにReaderが設定されているときには，Shift_JIS切り替え機能は無効になり，Readerのエンコーディングが適用されます。

XSLTまたはXSLTCトランスフォーマの入力ソースにDOMSourceオブジェクトを指定する場合

DOMSourceが生成された時点でXML文書は文字コード変換済みなので，Shift_JIS切り替え機能は無効になります。

Shift_JIS切り替え機能を有効にするためには，DOMSourceに設定するDOMノードの生成時に利用するパーサに対して，あらかじめShift_JIS切り替え機能を指定しておく必要があります。

XSLTまたはXSLTCトランスフォーマの入力ソースにSAXSourceオブジェクトを指定する場合

SAXSourceオブジェクトにInputSourceオブジェクトを設定したときには，1.と同じように注意が必要です。また，SAXSourceオブジェクトにXMLReaderオブジェクトを設定したときには，XMLReaderに指定されたShift_JIS切り替え機能が有効になります。

Shift_JIS切り替え機能を指定したDOMパーサ，またはSAXパーサによって作成されたNode，Source，ResultなどをJAXBのAPIの引数として渡した場合

JAXBは，Shift_JIS切り替え機能をサポートしていません。

StAXはShift_JIS切り替え機能をサポートしていません。そのため，XSLTまたはXSLTCトランスフォーマの入出力に，次のどちらかを使用した場合の動作は保証しません。

StAXSource

StAXResult

3.2　XSLTCトランスフォーマ機能

この節では，XSLTCトランスフォーマ機能について説明します。

3.2.1　XSLTCトランスフォーマの概要

XSLTCトランスフォーマは，XML Processorが提供しているXSLTトランスフォーマと同じ機能を持ちながら，XML文書の変換処理の性能を向上させたものです。

XSLTCトランスフォーマは，XSLTスタイルシートを解析するコンパイラと，変換処理を行う実行時プロセッサで構成されます。コンパイラは，XSLTスタイルシートを解析して，高速に変換するためのトランスレットと呼ばれるJavaのバイトコードをメモリ上に生成します。実行時プロセッサは，トランスレットを実行することによって，高速な変換処理を実現します。

XSLTCトランスフォーマとXSLTトランスフォーマは，次に示す点で動作に差異がありますのでご注意ください。

XSLTCトランスフォーマはXSLTトランスフォーマよりもエラーチェックが簡略化されています。

XSLT1.0仕様書で規定されていない部分で，XSLTトランスフォーマとXSLTCトランスフォーマの動作に差異がある場合があります。

XSLTCトランスフォーマを使用することで，XSLTトランスフォーマよりも高い変換処理性能を期待できるケースを次に示します。

(1)　同一のXSLTスタイルシートを使って複数のXML文書を変換する場合

同一のXSLTスタイルシートを使って複数のXML文書を変換する場合は，XSLTトランスフォーマ，XSLTCトランスフォーマの両方とも，次に示す1.の方法よりも2.の方法の方が高い変換性能を期待できます。

スタイルシートからTemplatesオブジェクトやTransformerオブジェクトを毎回生成し，これを用いて変換する。

スタイルシートからTemplatesオブジェクトやTransformerオブジェクトを一度だけ生成し，これを再利用して変換する。

XSLTCトランスフォーマで2.の方法を用いると，時間の掛かるトランスレット作成処理は一度だけで済みます。その後，トランスレットを用いた高速な変換が繰り返し実行されるため，XSLTトランスフォーマで2.の方法を用いるよりも高い性能が期待できます。

3.2.2　XSLTCトランスフォーマを使ったシステムの開発・運用

XSLTCトランスフォーマは，XSLTトランスフォーマと比べてエラーチェックが厳密ではありません。XSLTCトランスフォーマを使ったシステムを開発・運用する場合は，次に示すようにXSLTトランスフォーマでの動作確認も実施してください。

XSLTトランスフォーマを使ってスタイルシートのエラーチェックを必ず実施してください。これによって，XSLTCトランスフォーマではチェックできないエラーをチェックすることができ，他システムとの相互運用などで発生するおそれがあるエラーチェックの相違を事前にチェックできます。

XSLTCトランスフォーマによる変換結果がXSLTトランスフォーマのものと同じになることを確認することを推奨します。これによって，トランスフォーマ固有の動作が変換結果に影響を及ぼすかどうかを確認でき，他システムとの相互運用などで発生するおそれがある動作の差異を事前にチェックできます。

XSLTトランスフォーマとXSLTCトランスフォーマに関する次の注意事項も参照してください。

「6.6　XSLT/XSLTC共通の注意事項」

「6.7　XSLTに関する注意事項」

「6.8　XSLTCに関する注意事項」

3.2.3　XSLTCトランスフォーマで使用するクラス

XSLTCトランスフォーマでは，TransformerFactoryXSLTCクラスを使用します。

XSLTCトランスフォーマで使用するクラスについて説明します。

(1)　TransformerFactoryXSLTCクラス

(a)　説明

XSLTCトランスフォーマのためのTransformerFactoryインスタンスを作成するクラスです。

(b)　パッケージ名およびクラス名

com.cosminexus.jaxp.xsltc.TransformerFactoryXSLTC

(c)　形式

public class TransformerFactoryXSLTC

(d)　メソッド一覧

メソッド名

機能

newInstance

TransformerFactoryの新しいインスタンスを作成する

(e)　メソッド詳細

newInstanceメソッド

説明

XSLTCトランスフォーマのための，TransformerFactoryの新しいインスタンスを作成します。

形式

public static TransformerFactory newInstance()

パラメタ

なし

戻り値

TransformerFactoryの新しいインスタンスを返却します。

例外

なし

3.2.4　XSLTCトランスフォーマの使用方法

XSLTCトランスフォーマを使用する場合，XSLTトランスフォーマとはTransformerFactoryインスタンスの生成方法が異なります。XSLTCトランスフォーマでのTransformerFactoryインスタンスの生成方法を次に示します。

その他の使用方法は，XSLTトランスフォーマと同じです。

コード例を次に示します。

3.3　スキーマキャッシュ機能

この節では，スキーマキャッシュ機能について説明します。

3.3.1　スキーマキャッシュ機能の概要

スキーマキャッシュ機能とは，XMLパーサがスキーマ文書を解析して取得できる文法定義をあらかじめオブジェクトの状態でキャッシュし，スキーマ検証時に再利用することで検証パースの実行速度を向上させる機能です。

スキーマキャッシュ機能では，メモリ上およびディスク上にキャッシュを作成できます。また，JAXP1.2のAPIを使ったプログラムでも，ソースを改造することなく検証パースの実行速度を向上させることができます。

スキーマキャッシュ機能を使用する場合の前提条件，および適用範囲について説明します。

(1)　前提条件

スキーマキャッシュ機能は，J2EEサーバ上で動作するユーザプログラムがjavax.xml.parsers.DocumentBuilderクラス（DOMパーサ）を使ってXML文書をパースする場合だけ有効となります。

スキーマキャッシュ機能を使用する場合の制約を次に示します。

javax.xml.validationパッケージを使ったスキーマ検証では，スキーマキャッシュ機能が適用されません。

parseメソッドの引数にFileオブジェクトを渡した場合，パーサが内部で保持するスキーマ文書ファイル名の一部が，キャッシュ構築時のファイル名と一致しなくなります。そのため，スキーマキャッシュ機能が使用できません。

(2)　適用範囲

次に示すスキーマ文書がキャッシュの対象となります。

スキーマ定義ファイルで指定されたスキーマ文書

スキーマ定義ファイルで指定されたスキーマ文書から，次の要素によって直接または間接的に参照されるスキーマ文書

import要素

include要素

redefine要素

なお，1つのマシン上で複数のJ2EEサーバが起動された場合，スキーマキャッシュ機能はサーバごとに独立して動作します。

3.3.2　スキーマキャッシュ機能の処理の流れ

スキーマキャッシュ機能には，スキーマキャッシュを操作する次の機能があります。

スキーマキャッシュの構築

スキーマキャッシュの利用

スキーマキャッシュの削除および再構築

スキーマキャッシュ機能の処理の流れを次に示します。

図3‒1　スキーマキャッシュ機能の処理の流れ

従来のスキーマ検証は，同じスキーマを使う場合でも，検証のたびにスキーマ文書そのものをパースしてgrammarオブジェクトを作成します。一方，スキーマキャッシュ機能を使用すると，あらかじめ作成されたgrammarオブジェクトを再利用するため，スキーマ文書解析のオーバーヘッドを軽減できます。

1つのスキーマ文書を使用して複数のインスタンス文書をスキーマ検証する場合の，キャッシュを利用するスキーマキャッシュ機能を使用したスキーマ検証と，キャッシュを利用しない従来のスキーマ検証の処理の例を次に示します。

図3‒2　スキーマキャッシュ機能を使用したスキーマ検証と従来のスキーマ検証の処理の違い

3.3.3　スキーマキャッシュの構築

スキーマキャッシュ機能を使用するためには，あらかじめキャッシュ対象となるスキーマ文書を決めて，スキーマキャッシュを構築する必要があります。そのため，次のプロパティファイルを適切に設定してください。

スキーマ定義ファイル

J2EEサーバのユーザ定義ファイル（usrconf.properties）

上記のファイルはJavaのプロパティファイルに相当するため，基本的な構文規則はJavaのプロパティファイルの規則に従ってください。なお，プロパティファイルの構文規則の詳細については，java.util.PropertiesクラスのJavadocを参照してください。

プロパティファイルの詳細について説明します。

(1)　スキーマ定義ファイル

スキーマ定義ファイルには，次の項目を定義できます。

キャッシュ対象となるスキーマ文書

キャッシュの形式

スキーマキャッシュを格納するディスク上の場所

スキーマ定義ファイルのファイル名，および格納場所は任意です。

キャッシュの対象となるのは，次のスキーマ文書です。

スキーマ定義ファイルに直接指定されたスキーマ文書

スキーマ定義ファイルで直接指定されたスキーマ文書から，次の要素によって直接または間接的に参照されるスキーマ文書

import要素

include要素

redefine要素

スキーマ定義ファイルに記述できるプロパティを次に示します。次に示す以外のプロパティを指定した場合，無視されます。

表3‒2　スキーマ定義ファイルに記述できるプロパティ

項番

プロパティ名

指定値

1

schema_path

スキーマ文書が存在するディレクトリを示す絶対パスを指定します。

2

diskcache_path

ディスクキャッシュを格納するディレクトリを示す絶対パスを指定します。

3

schema_xxx

（"xxx"の部分は1文字以上の任意の文字列）

キャッシュ対象となるスキーマ文書のファイルを示す相対パス，およびディスクキャッシュ指定子を指定します。ディスクキャッシュ指定子は省略できます。

ディスクキャッシュ指定子は，スキーマ文書の相対パスの末尾に",D"と記述してください。ディスクキャッシュ指定子が記述されたスキーマ文書のキャッシュは，ディスク上に作成されます。

ディスクキャッシュ指定子の記述がない場合，キャッシュはメモリ上に作成されます。

ファイル名とディスクキャッシュ指定子の間の連続する空白およびタブは無視されます。

それぞれのプロパティで指定するパスの区切り記号は，Windowsの場合もUNIXの場合もスラッシュ（/）です。ディレクトリ名の絶対パスの末尾のスラッシュ（/）は任意です。

同じプロパティ名が2回以上指定された場合，最後に指定されたプロパティの指定値が有効となります。

スキーマ定義ファイルの記述例を次に示します。

Windowsの場合

shema_path=C:/usr/app/xmlparser/schemafiles
diskcache_path=C:/usr/app/xmlparser
schema_01=schema/type1.xsd
schema_02=schema/type2.xsd,D

UNIXの場合

shema_path=/usr/app/xmlparser/schemafiles
diskcache_path=/usr/app/xmlparser
schema_01=schema/type1.xsd
schema_02=schema/type2.xsd,D

"schema_01=schema/type1.xsd"と指定した場合，ディスクキャッシュ指定子が記述されていないため，スキーマ文書のキャッシュはメモリ上にキャッシュされます。

"schema_02=schema/type2.xsd,D"と指定した場合，ディスクキャッシュ指定子が記述されているめ，スキーマ文書のキャッシュはディスク上にキャッシュされます。

スキーマ定義ファイル指定時の動作を次に示します。

schema_pathプロパティ，およびdiskcache_pathプロパティは，必ず指定してください。

これらのプロパティのどちらか一方でも指定していない場合，必要なプロパティ指定が欠けているという警告メッセージ（KECX09503-W）がエラーファイルに出力され，スキーマキャッシュを使用しないでスキーマ検証を実施します。

複数のJ2EEサーバでdiskcache_pathプロパティに同じディレクトリが指定されている場合でも，ディスクキャッシュはサーバごとに独立して管理されます。

diskcache_pathプロパティで指定されたディレクトリの下にJ2EEサーバ名と同じ名前のディレクトリが作成され，その下にキャッシュファイルが作成されます。ディスクキャッシュが削除される場合は，作成されたサブディレクトリごとにキャッシュファイルが削除されます。

diskcache_pathプロパティの設定値が絶対パスでない場合，エラーファイルに警告メッセージ（KECX09507-W）が出力され，スキーマキャッシュを使用しないでスキーマ検証を実施します。

diskcache_pathプロパティに設定されたディレクトリにアクセスできない場合，ディスクキャッシュ格納用のディレクトリにアクセスできないという警告メッセージ（KECX09505-W）がエラーファイルに出力され，スキーマキャッシュを使用しないでスキーマ検証を実施します。

schema_pathプロパティの設定値が絶対パスでない場合，エラーファイルに警告メッセージ（KECX09508-W）が出力され，スキーマキャッシュを使用しないでスキーマ検証を実施します。

schema_xxxプロパティの設定値が相対パスでない場合，エラーファイルに警告メッセージ（KECX09509-W）が出力され，そのschema_xxxプロパティの指定は無効となります。

ディスクキャッシュ作成時にgrammarオブジェクトのファイルへの書き込みが失敗した場合，エラーファイルに警告メッセージ（KECX09511-W）を出力します。パーサは，書き込みに失敗したキャッシュではなく，スキーマ文書を使用してスキーマ検証を実施します。

複数の異なるschema_xxxプロパティに同じスキーマ文書が指定された場合，スキーマ文書に対応するキャッシュが1つだけ作成されます。このとき，これらのプロパティのうち，どれかのプロパティにディスクキャッシュ指定子が指定されていれば，キャッシュはディスク上に作成されます。どのプロパティにもディスクキャッシュ指定子が指定されていない場合，キャッシュはメモリ上に作成されます。

スキーマ定義ファイルに関する注意事項については，「6.18.3　スキーマ定義ファイルに関する注意事項」を参照してください。

(2)　J2EEサーバのユーザ定義ファイル

J2EEサーバのユーザ定義ファイル（usrconf.properties）は，J2EEサーバ起動時に初期化するクラスや，設定するシステムプロパティを定義するファイルです。

J2EEサーバのユーザ定義ファイルの詳細についてはマニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「2.　J2EEサーバで使用するファイル」を参照してください。

スキーマキャッシュ機能を使用する場合に，J2EEサーバのユーザ定義ファイルに記述するプロパティを次に示します。

表3‒3　J2EEサーバのユーザ定義ファイルに記述するプロパティ

項番

プロパティ名

指定値

1

ejbserver.application.InitTermProcessClasses

J2EE拡張コンテナの初期化・終了クラスを指定します。

スキーマキャッシュ機能では，スキーマキャッシュの構築に必要な"com.cosminexus.jaxp.impl.parsers.util.XMLGrammarCaching"を指定してください。

2

com.cosminexus.jaxp.grammar_caching.preload

スキーマキャッシュ機能を使用するかどうかを指定します。"ON"または"OFF"を指定できます。デフォルトは"OFF"です。

"ON"を設定すると，スキーマキャッシュ機能を使用できます。XMLパーサはスキーマキャッシュを使用してスキーマ検証を実施します。

"OFF"を設定すると，スキーマキャッシュ機能を使用しません。XMLパーサはスキーマキャッシュを使用しないでスキーマ検証を実施します。

なお，このプロパティは，スキーマキャッシュ機能全体を制御するプロパティです。J2EEサーバがスキーマキャッシュ機能を利用する場合，必ず"ON"を指定してください。"OFF"を指定した場合，J2EEサーバ起動後にスキーマキャッシュ機能を有効にすることはできません。

3

com.cosminexus.jaxp.grammar_caching.config

スキーマ定義ファイルの絶対パスを指定します。

スキーマキャッシュ機能は，次のすべての条件に該当する場合だけ，使用できます。

ejbserver.application.InitTermProcessClassesプロパティを指定。

com.cosminexus.jaxp.grammar_caching.preloadプロパティに"ON"を指定。

com.cosminexus.jaxp.grammar_caching.configプロパティを指定。

J2EEサーバのユーザ定義ファイルの記述例を次に示します。

# Application Server起動時に初期化するクラスを指定
ejbserver.application.InitTermProcessClasses=com.cosminexus.jaxp.impl.parsers.util.XMLGrammarCaching
# キャッシュ機能を使用可能にする
com.cosminexus.jaxp.grammar_caching.preload=ON
# キャッシュに保持するスキーマ文書を定義した「スキーマ定義ファイル」の絶対パス名
com.cosminexus.jaxp.grammar_caching.config=C:/usr/app/xmlparser/config.properties

J2EEサーバのユーザ定義ファイル指定時の動作を次に示します。

com.cosminexus.jaxp.grammar_caching.preloadプロパティの指定値が次の場合，"OFF"が設定されたものとします。

"ON"または"OFF"以外の値が設定されている

プロパティが設定されていない

com.cosminexus.jaxp.grammar_caching.preloadプロパティに"ON"が指定されていても，com.cosminexus.jaxp.grammar_caching.configプロパティで指定されたスキーマ定義ファイルにアクセスできない場合，スキーマキャッシュ機能は使用できません（警告メッセージKECX09504-W）。

3.3.4　スキーマキャッシュの利用

XMLパーサを使ってスキーマ検証を実施する場合，スキーマキャッシュ機能を使用するためのユーザ側の操作は不要です。XMLパーサはスキーマキャッシュ機能を使用するかどうかを判断し，スキーマキャッシュ機能を使用する場合は，自動的にスキーマキャッシュを使用してスキーマ検証を実施します。スキーマキャッシュを使用しない場合，またはキャッシュが見つからない場合は，従来のXMLパーサと同様にgrammarオブジェクトを作成してスキーマ検証を実施します。

なお，ディスクキャッシュファイルからのgrammarオブジェクトの読み込みに失敗した場合は，警告メッセージ（KECX09512-W）が出力されます。XMLパーサは読み込みに失敗したキャッシュは使用しないで，スキーマ文書を使用してスキーマ検証を実施します。

スキーマキャッシュ機能では，キャッシュの制御や状態の確認のために，次のコマンドを使用できます。

表3‒4　スキーマキャッシュ機能のコマンド

項番

コマンドのファイル名

機能

Windows

UNIX

1

cacheoff.bat

cacheoff

スキーマキャッシュ機能を無効にして，キャッシュを削除します。

2

cacheon.bat

cacheon

スキーマキャッシュ機能を有効にして，キャッシュを再構築します。

3

cachestate.bat

cachestate

スキーマキャッシュ機能の状態を表示します。

コマンドのファイルは，すべて＜JAXP_DIR＞※の下のbinディレクトリに格納されています。コマンドを使用するためには，＜JAXP_DIR＞※の下のbinディレクトリをPATH環境変数に設定する必要があります。

注※

Application Serverをインストールしたディレクトリ下の，jaxpディレクトリのことです。

コマンドの詳細については，「3.3.5　スキーマキャッシュの削除および再構築」を参照してください。

3.3.5　スキーマキャッシュの削除および再構築

キャッシュ対象のスキーマ文書を削除・変更した場合，コマンドを使用してキャッシュを削除・再構築する必要があります。コマンドを使用することで，J2EEサーバを停止することなくスキーマ文書の変更をキャッシュに反映させることができます。

キャッシュの削除・再構築に関する注意事項については，「6.18.4　キャッシュの再構築・削除に関する注意事項」を参照してください。

キャッシュの削除・再構築時に実行するコマンドについて説明します。

(1)　cacheoffコマンド（XMLパーサにキャッシュ削除を指示する）

(a)　形式

cacheoff　J2EEサーバ名

(b)　cacheoffコマンド実行時の動作

cacheoffコマンドを実行したときの動作を次に示します。なお，スキーマキャッシュ機能が無効の場合，cacheoffコマンドを実行しても，何も動作しません。

cacheoffコマンドを実行すると，XMLパーサはメモリ上のキャッシュをすべて開放し，スキーマ定義ファイルの"diskcache_path"で指定されたディレクトリ以下の，J2EEサーバ名と同じ名前のディレクトリおよびその下に作成されたディスクキャッシュをすべて削除します。

cacheoffコマンド実行後はスキーマキャッシュ機能が無効となり，XMLパーサはキャッシュを使用しないでスキーマ検証を実施します。

cacheoffコマンドはXMLパーサにキャッシュの削除を指示するだけであり，直接キャッシュを削除するわけではありません。cacheoffコマンド実行後，最初にDOMパーサがパースするときにキャッシュが削除されます。

cacheoffコマンド実行時には「"diskcache_path"で指定されたディレクトリ/サーバ名」のディレクトリを表示して，削除してよいかどうかユーザに確認を求めます。ディスク上にキャッシュが作成されていない場合でも，ディスクキャッシュを格納するためのディレクトリだけは作成されているため，削除してよいかどうかユーザに確認を求めます。

cacheoffコマンドを実行した場合に，システムの異常などにより内部ディレクトリおよび内部ファイルにアクセスできなかったときは，エラーメッセージ（KECX09506-E）を標準エラー出力に出力し，コマンドの処理を中断します。

cacheoffコマンドの引数に存在しないJ2EEサーバ名が指定された場合，エラーメッセージ（KECX09510-E）が出力されます。

J2EEサーバのユーザ定義ファイルで，com.cosminexus.jaxp.grammar_caching.preloadプロパティに"ON"が指定されていない場合に，そのJ2EEサーバに対してcacheoffコマンドを実行したときは，エラーメッセージ（KECX09510-E）が出力されます。

コマンド引数に誤りがあった場合，次のエラーメッセージを出力して処理を中断します。

KECX09513-E cacheoff : Invalid parameter.
usage : cacheoff J2EE_server_name

(2)　cacheonコマンド（XMLパーサにキャッシュ再構築を指示する）

(a)　形式

cacheon　J2EEサーバ名

(b)　cacheonコマンド実行時の動作

cacheonコマンドを実行したときの動作を次に示します。

cacheonコマンドを実行すると，XMLパーサはメモリ上のキャッシュを開放し，スキーマ定義ファイルの"diskcache_path"で指定されたディレクトリ以下の，J2EEサーバ名と同じ名前のディレクトリおよびその下に作成されたディスクキャッシュをすべて削除します。そのあと，スキーマ定義ファイルの内容に従ってキャッシュを再構築します。

cacheonコマンド実行後はスキーマキャッシュ機能が有効となり，XMLパーサはキャッシュを使ってスキーマ検証を実施します。

cacheonコマンドはXMLパーサにキャッシュの再構築を指示するだけであり，直接キャッシュを削除したり再構築したりするわけではありません。cacheonコマンド実行後，最初にXMLパーサがパースするときにキャッシュが削除され，再構築されます。

cacheonコマンドを実行した場合に，システムの異常などにより内部ディレクトリおよび内部ファイルにアクセスできなかったときは，エラーメッセージ（KECX09506-E）を標準エラー出力に出力し，コマンドの処理を中断します。

cacheonコマンドの引数に存在しないJ2EEサーバ名が指定された場合，エラーメッセージ（KECX09510-E）が出力されます。

J2EEサーバのユーザ定義ファイルで，com.cosminexus.jaxp.grammar_caching.preloadプロパティに"ON"が指定されていない場合に，そのJ2EEサーバに対してcacheonコマンドを実行したときは，エラーメッセージ（KECX09510-E）出力されます。

コマンド引数に誤りがあった場合，次のエラーメッセージを出力して処理を中断します。

KECX09513-E cacheon : Invalid parameter.
usage : cacheon J2EE_server_name

(3)　cachestateコマンド（キャッシュ機能の状態を表示する）

(a)　形式

cachestate　[-d]　[J2EEサーバ名]

(b)　cachestateコマンド実行時の動作

cachestateコマンドを実行したときの動作を次に示します。

cachestateコマンドを-dオプションなしで実行すると，スキーマキャッシュ機能の状態が標準出力に表示されます。表示される内容を次に示します。

表3‒5　表示されるスキーマキャッシュ機能の状態

項番

スキーマキャッシュ機能の状態

表示内容

1

有効

"KECX09501-I J2EE Server 'J2EEサーバ名': schema cache: ON"

2

無効

"KECX09501-I J2EE Server 'J2EEサーバ名': schema cache: OFF"

cachestateコマンドを実行した場合に，システムの異常などにより内部ディレクトリおよび内部ファイルにアクセスできなかったときは，エラーメッセージ（KECX09506-E）を標準エラー出力に出力し，コマンドの処理を中断します。

cachestateコマンドの引数に存在しないJ2EEサーバ名が指定された場合，エラーメッセージ（KECX09510-E）が出力されます。

cachestateコマンドの引数のJ2EEサーバ名が省略された場合，すべてのJ2EEサーバに関する情報が出力されます。

J2EEサーバのユーザ定義ファイルで，com.cosminexus.jaxp.grammar_caching.preloadプロパティに"ON"が指定されていない場合に，cachestateコマンドに-dオプションを指定して実行しても，何も情報が出力されません。

コマンド引数に誤りがあった場合，次のエラーメッセージを出力して処理を中断します。

KECX09513-E cachestate : Invalid parameter.
usage : cachestate [-d] [J2EE_server_name]

cachestateコマンドに-dオプションを指定して実行すると，次の情報が標準出力に表示されます。

スキーマキャッシュ機能の状態（"ON"または"OFF"）

現在有効なスキーマ定義ファイル

現在有効なdiskcache_path（ディスクキャッシュが作成されるディレクトリ）

キャッシュ構築の開始・終了時刻

スキーマ文書のキャッシュ構築状況

キャッシュ構築中のエラー情報

情報の出力フォーマットを次に示します。

図3‒3　cachestateコマンド実行時の出力フォーマット

サーバ名を指定しない場合，サーバの数だけ情報を出力します。途中でKECX09506-Eのエラーが発生した場合でも，残りのサーバの情報を出力します。この情報の内容は，キャッシュが再構築されるたびにクリアされ，更新されます。

(4)　各コマンドとパースの同期処理の関係

cacheonコマンド，cacheoffコマンド，およびcachestateコマンドとパースの同期処理の関係を次に示します。

表3‒6　各コマンドとパースの同期処理の関係

項番

実行するアクション

システムの状態

パース実行中および右記以外

キャッシュ構築中

キャッシュ削除中

1

パース

パースを開始します

（すぐに処理を開始します）。

構築が完了したあとパースを開始します。

削除が完了したあとパースを開始します。

2

cacheonコマンド

次の順番で実行します。

すぐにコマンドを終了する。ただし，スキーマキャッシュ構築はこの時点では実行されない。

次のパースを開始する。

キャッシュを構築する。

3

cacheoffコマンド

次の順番で実行します。

すぐにコマンドを終了する。ただし，スキーマキャッシュ削除はこの時点では実行されない。

次のパースを開始する。

キャッシュを削除する。

4

cachestateコマンド

次の情報を表示します。

スキーマキャッシュ機能が有効のとき

"KECX09501-I J2EE Server 'J2EEサーバ名': schema cache: ON"

スキーマキャッシュ機能が無効のとき

"KECX09501-I J2EE Server 'J2EEサーバ名': schema cache: OFF"

"KECX09501-I J2EE Server 'J2EEサーバ名': schema cache: OFF"を表示します。

3.3.6　最適なスキーマキャッシュの使用について

スキーマキャッシュ機能を利用すると，妥当性検証のためのパース時間を短縮することができます。ただし，メモリ使用量が増加したり，ディスクキャッシュ使用時に期待するほど効果が出ないなどの問題が発生するおそれがあります。

ここでは，これらの問題を回避し，最適なスキーマキャッシュを使用するための方法について説明します。

(1)　スキーマ文書とインスタンス文書のサイズと検証時間の関係

スキーマ文書はXMLで記述されています。妥当性検証に先立ってパースされ，内部的なgrammarオブジェクトに変換されます。キャッシュを使用すると，スキーマ文書からgrammarオブジェクトを構築する処理を省略できます。妥当性検証のためのパースには，次の時間が掛かります。

インスタンス文書の検証時間＋スキーマ文書からgrammarオブジェクトを構築する時間

grammarオブジェクトを構築する時間はキャッシュにより省略できるため，次の条件では，1.に示す条件の方がスキーマキャッシュの効果が大きくなります。

スキーマ文書のサイズ＞インスタンス文書のサイズ

スキーマ文書のサイズ＜インスタンス文書のサイズ

(2)　メモリキャッシュとディスクキャッシュの差

スキーマキャッシュ機能を使用する場合，事前にスキーマ文書からgrammarオブジェクトを構築しているため，検証時にgrammarオブジェクトを構築する時間を省略できます。

ただし，メモリキャッシュを使用する場合とディスクキャッシュを使用する場合，妥当性検証のためのパースには次に示す時間が掛かります。

メモリキャッシュ

妥当性検証のためのパースには，インスタンス文書を検証する時間が掛かります。

ディスクキャッシュ

妥当性検証のためのパースには，次の時間が掛かります。

インスタンス文書の検証時間＋デシリアライズ※時間＋I/O時間

注※

Javaのオブジェクトを丸ごとファイルで保存できるように変換（シリアライズ）したデータを，再び元のオブジェクト形式に復元する処理のことです。

(3)　メモリキャッシュ使用時の注意事項

メモリキャッシュを使用する場合，キャッシュ構築後はメモリ上にキャッシュが残ります。そのため，リソースの許す範囲で，メモリ使用量を調整してください。使用頻度の高いスキーマ文書を選択して，優先的にメモリキャッシュを利用すると効果的です。

3.4　高速パース機能

この節では，高速パース機能について説明します。

3.4.1　高速パース機能の概要

高速パース機能とは，事前解析によって解析対象のXML文書の特徴を学習し，以降のXML文書解析時に学習結果を利用することで，解析処理の実行速度を向上させる機能です。この機能は，要素や属性の並び順や入れ子関係などの構造的な特徴が一致しているXML文書を，繰り返し解析するシステムに適しています。高速パース機能を利用したシステムを次の図に示します。

図3‒4　高速パース機能を利用したシステム

事前解析によって学習したXML文書の特徴は，解析結果オブジェクトに記録します。解析結果オブジェクトを生成して，高速パースを実現する流れを次の図に示します。

図3‒5　解析結果オブジェクトを生成して，高速パースを実現する流れ

解析結果オブジェクトの生成

解析結果オブジェクトは，XML Processorが，事前解析用XML文書から要素の並び順，属性の並び順，要素の繰り返しなどの情報を事前解析して生成します。事前解析用XML文書とは，解析対象のXML文書と構造的な特徴が同じXML文書です。

事前解析用XML文書は，ユーザが作成する必要があります。XML文書は一般的に自由な構造を持つため，すべてのXML文書に対応できる解析結果オブジェクトは生成できません。このため，解析対象のXML文書を考慮して，出現頻度の高い文書構造に的を絞って事前解析用XML文書を作成します。

解析結果オブジェクトの利用（高速パースの実現）

解析結果オブジェクトを設定したXML ProcessorのXMLパーサ機能で解析を実行すると，解析結果オブジェクトを利用してXML文書を解析します。解析対象のXML文書の構造が，解析結果オブジェクトが記録している文書の構造と一致していれば，解析速度が向上します。

図3-5に示した流れで高速パース機能を使用する場合，ユーザプログラム中に，解析結果オブジェクトを生成してXMLパーサに設定するためのコードを記述する必要があります。ユーザプログラム中にコードを記述して高速パース機能を使用する方法の詳細については，「3.4.2　高速パースのための作業の流れ」を参照してください。

ただし，すべての場合について，通常よりも解析速度を向上できることを保証するものではありません。このため，高速パース機能を使用する場合は，実際に解析対象のXML文書を使用して性能を評価することを推奨します。

なお，高速パース機能を使用する場合は，「6.19　高速パース機能に関する注意事項」の内容も確認してください。

参考

高速パース機能を使用することで短縮できる解析時間の割合について

高速パース機能は，SAXパーサでの解析時間を短縮します。また，DOMパーサでの解析は，SAXパーサでの解析とDOMツリーの生成で実装されているため，DOMパーサでの解析時間も短縮できます。ただし，高速パース機能を使用してもDOMツリーの生成時間は変わりません。このため，次の図に示すように，SAXパーサでの解析と比べて，解析時間全体に対して短縮される時間の割合は小さくなります。

また，妥当性検証を行う場合は，解析時間に占める妥当性検証処理の割合が大きいため，短縮される解析時間の割合は相対的に小さくなります。特に，javax.xml.validation.Schemaクラスを使わないで妥当性検証を行う場合は，解析時間はほとんど短縮されません。

小さいサイズのXML文書を解析する場合も，解析時間に占めるXMLパーサの初期化時間の割合が大きいため，短縮される解析時間の割合は相対的に小さくなります。

3.4.2　高速パースのための作業の流れ

ユーザプログラム中にコードを記述して高速パース機能を使用する場合の，ユーザが実施する作業の流れを次に示します。

図3‒6　高速パース機能を使用するための作業の流れ

各作業について説明します。

事前解析用XML文書の作成

解析対象のXML文書の構造的な特徴を考慮して，事前解析用XML文書を作成します。事前解析用XML文書を作成するための指針については，「3.4.3　事前解析用XML文書の作成」を参照してください。

解析結果オブジェクトの生成

事前解析用XML文書を解析して，解析結果オブジェクトを生成します。解析結果オブジェクトの生成方法については，「3.4.4　解析結果オブジェクトの生成」を参照してください。

解析結果オブジェクトの設定

解析結果オブジェクトをXML ProcessorのXMLパーサに設定します。解析結果オブジェクトの設定方法については，「3.4.5　解析結果オブジェクトの設定」を参照してください。

XML文書の解析

解析結果オブジェクトを設定したXMLパーサのparseメソッドで，XML文書を解析します。高速パース機能の対象となるparseメソッドについては，「3.4.6　XML文書の解析」を参照してください。

事前解析用XML文書のチューニング

必要に応じて，事前解析用XML文書のチューニングを行います。チューニング情報を調査して事前解析用XML文書を最適化することで，解析速度をさらに向上できます。事前解析用XML文書のチューニング方法については，「3.4.9　事前解析用XML文書のチューニング」を参照してください。

なお，高速パース機能を使用するためにユーザプログラムに記述するコード例については，「3.4.8　高速パース機能を使用するためのコード例」を参照してください。

3.4.3　事前解析用XML文書の作成

事前解析用XML文書は，解析対象のXML文書の構造的な特徴を考慮して作成します。事前解析用XML文書を作成する際は，次の指針に従ってください。

表3‒7　事前解析用XML文書を作成するための指針

項番

適用個所

指針

1

XML宣言

解析対象のXML文書と一致させる。

2

要素と属性

解析対象のXML文書に記述されている要素と属性を記述する。

3

要素と属性の順序

解析対象のXML文書と一致させる。

4

要素の入れ子構造

解析対象のXML文書と一致させる。

5

要素の繰り返し構造

繰り返す可能性がある要素は，繰り返しの形で記述する。

6

テキスト，CDATAセクション，属性値

解析対象のXML文書と一致させる必要はない。

7

DTD，コメント，処理命令

記述する必要はない。

それぞれの指針について，具体的な記述例を示して説明します。

(1)　XML宣言

解析対象のXML文書にあるXML宣言を，そのまま事前解析用XML文書に記述してください。例を次の図に示します。

図3‒7　XML宣言を記述する例（事前解析用XML文書の作成指針）

(2)　要素と属性

解析対象のXML文書にある要素や属性を，事前解析用XML文書に記述します。事前解析用XML文書に記述された要素や属性の情報は，生成される解析結果オブジェクトに記録されます。

解析対象のXML文書間で異なる要素や属性がある場合は，すべての要素や属性を事前解析用XML文書に記述します。例を次の図に示します。

図3‒8　要素と属性を記述する例（事前解析用XML文書の作成指針）

ただし，要素中のテキスト，CDATAセクション，および属性値の内容については，解析対象のXML文書と一致させる必要はありません。詳細については，「3.4.3(6)　テキスト，CDATAセクション，属性値」を参照してください。

なお，次の記述はXML規格では区別されませんが，事前解析では異なる要素として区別されます。

空要素と空要素タグ（例：<a></a>と<a/>）

改行文字・空白文字・タブの数や位置が異なる要素

解析対象のXML文書にこれらの要素がある場合は，事前解析用XML文書には区別して記述する必要があります。例を次の図に示します。

図3‒9　空要素と空要素タグを記述する例（事前解析用XML文書の作成指針）

図3‒10　改行文字・空白文字の数や位置が異なる要素を記述する例（事前解析用XML文書の作成指針）

(3)　要素と属性の順序

解析対象のXML文書にある要素や属性は，そのままの順序で事前解析用XML文書に記述します。例を次の図に示します。

図3‒11　要素と属性を記述する例（事前解析用XML文書の作成指針・要素と属性の順序）

解析対象のXML文書に，同じ組み合わせで順序が異なる要素や属性が記述されている場合は，それらをすべて事前解析用XML文書に記述します。例を次の図に示します。

図3‒12　同じ組み合わせで順序が異なる属性を記述する例（事前解析用XML文書の作成指針）

(4)　要素の入れ子構造

解析対象のXML文書にある要素の入れ子構造は，そのままの形で事前解析用XML文書に記述します。例を次の図に示します。

図3‒13　要素の入れ子構造を記述する例（事前解析用XML文書の作成指針）

解析対象のXML文書に異なる入れ子構造が複数ある場合は，すべての入れ子構造を事前解析用XML文書に記述します。例を次の図に示します。

図3‒14　要素の入れ子構造を複数記述する例（事前解析用XML文書の作成指針）

(5)　要素の繰り返し構造

解析対象のXML文書に繰り返す可能性がある要素がある場合は，繰り返す可能性がある要素を，2回以上連続で事前解析用XML文書に記述します。2回以上連続で記述することで，解析時に，繰り返す可能性がある要素として扱われます。なお，事前解析用XML文書に連続して記述する回数が2回以上であれば，解析対象のXML文書と繰り返しの回数が異なっても，高速パース機能の性能に影響はありません。例を次の図に示します。

図3‒15　要素の繰り返し構造を記述する例（事前解析用XML文書の作成指針）

(6)　テキスト，CDATAセクション，属性値

事前解析用XML文書に記述されたテキスト，CDATAセクション，および属性値の内容は，生成される解析結果オブジェクトに影響を与えません。このため，事前解析用XML文書のテキスト，CDATAセクション，および属性値の内容を，解析対象のXML文書と一致させる必要はありません。

また，テキストとCDATAセクションは区別されません（どちらを記述しても，生成される解析結果オブジェクトは同じです）。例を次の図に示します。

図3‒16　テキスト，CDATAセクション，属性値を記述する例（事前解析用XML文書の作成指針）

内容を持つ要素（例：<a>12</a>）と空要素（例：<a></a>）は区別されます。また，改行，タブ，空白はテキストなので，これらのテキストを持つ要素（例：<a>［改行］</a>）と空要素（例：<a></a>）は区別されます。このため，解析対象のXML文書にこのような要素が含まれる場合は，事前解析用XML文書にすべての要素を区別して記述する必要があります。例を次の図に示します。

図3‒17　空要素を記述する例（事前解析用XML文書の作成指針）

(7)　DTD，コメント，処理命令

DTD，コメント，および処理命令は，解析結果オブジェクトには含まれません。このため，事前解析用XML文書にこれらを記述する必要はありません（記述しても生成される解析結果オブジェクトには影響しません）。例を次の図に示します。

図3‒18　DTD，コメント，処理命令に関する例（事前解析用XML文書の作成指針）

ただし，解析対象のXML文書の中から参照されているエンティティを定義しているDTDは，事前解析用XML文書に記述する必要があります。例を次の図に示します。

図3‒19　XML文書中から参照されているエンティティの定義を記述する例（事前解析用XML文書の作成指針）

3.4.4　解析結果オブジェクトの生成

事前解析用XML文書を解析して，解析結果オブジェクトであるPreparsedObjectインスタンスを生成します。

解析結果オブジェクト（PreparsedObjectインスタンス）を生成するには，次に示すメソッドを使用します。

com.cosminexus.jaxp.preparsedxml.PreparsedObjectFactoryクラスのnewInstanceメソッド

com.cosminexus.jaxp.preparsedxml.PreparsedObjectクラスのnewPreparsedObjectメソッド

メソッドの詳細については，「3.4.7　高速パース機能で使用するクラス」を参照してください。

解析結果オブジェクトを生成するコードの例を次に示します。

// 事前解析用XML文書を用意する
File xml = new File("learning1.xml");
// エンティティリゾルバを用意する
MyEntityResolver entityResolver = new MyEntityResolver();
// エラーハンドラを用意する
MyErrorHandler errorHandler = new MyErrorHandler();
// PreparsedObjectFactoryを生成する
PreparsedObjectFactory pof = PreparsedObjectFactory.newInstance();
// 名前空間を有効にする
pof.setNamespaceAware(true);
// エンティティリゾルバを設定する
pof.setEntityResolver(entityResolver);
// エラーハンドラを設定する
pof.setErrorHandler(errorHandler);
// 解析結果オブジェクトを生成する
PreparsedObject pobj = pof.newPreparsedObject(xml);

3.4.5　解析結果オブジェクトの設定

解析結果オブジェクトをXML ProcessorのXMLパーサに設定します。解析結果オブジェクトは，次に示すXMLパーサに設定できます。

javax.xml.parsers.DocumentBuilder

javax.xml.parsers.SAXParser

org.xml.sax.XMLReader

解析結果オブジェクトをXMLパーサに設定するには，http://cosminexus.com/xml/properties/preparsedobject-loadプロパティを使用します。プロパティの詳細については「4.6　高速パース機能のプロパティの使用方法」を参照してください。

3.4.6　XML文書の解析

解析結果オブジェクトを設定したXMLパーサのparseメソッドで，XML文書を解析します。高速パース機能の対象となるparseメソッドを次の表に示します。

注意事項

表に記載のないparseメソッドを使用して高速パース機能を使用した場合の動作は保証しません。

表3‒8　高速パース機能の対象となるparseメソッド

クラス名

メソッド名

javax.xml.parsers.DocumentBuilder

parse(File f)

parse(InputSource is)

parse(InputStream is)

parse(InputStream is, String systemId)

parse(String uri)

javax.xml.parsers.SAXParser

parse(File f, DefaultHandler dh)

parse(InputSource is, DefaultHandler dh)

parse(InputStream is, DefaultHandler dh)

parse(InputStream is, DefaultHandler dh, String systemId)

parse(String uri, DefaultHandler dh)

org.xml.sax.XMLReader

parse(InputSource input)

parse(String systemId)

3.4.7　高速パース機能で使用するクラス

高速パース機能を使用する場合，次に示すクラスを使用します。

PreparsedObjectFactory

PreparsedObject

各クラスについて説明します。

(1)　PreparsedObjectFactoryクラス

(a)　説明

解析結果オブジェクトを生成するためのファクトリクラスです。

PreparsedObjectFactoryクラスは，スレッドセーフではありません。このため，複数のスレッドから同時に同じPreparsedObjectFactoryにアクセスすることはできません。PreparsedObjectFactoryクラスは，スレッド間の競合を避けるため，次のどちらかの方法で使用してください。

各スレッドに1つのPreparsedObjectFactoryインスタンスを持つ。

各スレッドが排他的にPreparsedObjectFactoryインスタンスにアクセスする。

(b)　パッケージ名およびクラス名

com.cosminexus.jaxp.preparsedxml.PreparsedObjectFactory

(c)　形式

public class PreparsedObjectFactory

(d)　メソッド一覧

メソッド名

機能

newInstance

解析結果オブジェクトを生成するためのファクトリを生成して返却する。

setNamespaceAware

事前解析用XML文書を解析する際の名前空間の有効・無効を設定する。

setErrorHandler

事前解析用XML文書の解析で発生するエラーを受け取るエラーハンドラを設定する。

setEntityResolver

事前解析用XML文書に含まれるエンティティを解決するためのエンティティリゾルバを設定する。

setTuningInfoFlag

チューニング情報を出力するかどうかを設定する。

newPreparsedObject

事前解析用XML文書を解析して，解析結果オブジェクトを生成する。

(e)　メソッド詳細

newInstanceメソッド

説明

解析結果オブジェクトを生成するためのファクトリを生成して返却します。

形式

public static PreparsedObjectFactory newInstance()

パラメタ

なし

戻り値

PreparsedObjectFactoryの新しいインスタンスを返却します。

例外

なし

setNamespaceAwareメソッド

説明

事前解析用XML文書を解析する際の名前空間の有効・無効を設定します。

デフォルトでは，falseが設定されています。

形式

public void setNamespaceAware(boolean awareness)

パラメタ

awareness

名前空間の有効・無効を設定します。

true：名前空間を有効にする

false：名前空間を無効にする

戻り値

なし

例外

なし

setErrorHandlerメソッド

説明

newPreparsedObjectメソッドを呼び出す際に，事前解析用XML文書の解析で発生するエラーを受け取るエラーハンドラを設定します。

デフォルトでは，次のエラーハンドラが設定されているように動作します。

class DefaultErrorHandler implements ErrorHandler {
     public void fatalError(SAXParseException e) throws SAXException {
         throw e;
     }
     public void error(SAXParseException e) throws SAXException {
         throw e;
     }
     public void warning(SAXParseException e) throws SAXException {
         // 何もしない
     }
 }

形式

public void setErrorHandler(org.xml.sax.ErrorHandler errorHandler)

パラメタ

errorHandler

エラーハンドラを設定します。nullを設定した場合，デフォルトの動作になります。

戻り値

なし

例外

なし

setEntityResolverメソッド

説明

newPreparsedObjectメソッドを呼び出す際に，事前解析用XML文書に含まれるエンティティを解決するためのエンティティリゾルバを設定します。

デフォルトでは，次のエンティティリゾルバが設定されているように動作します。

class DefaultEntityResolver implements EntityResolver {
     InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
         return null; // 常にnullを返す
     }
}

形式

public void setEntityResolver(org.xml.sax.EntityResolver entityResolver)

パラメタ

entityResolver

エンティティリゾルバを設定します。nullを設定した場合，デフォルトの動作になります。

戻り値

なし

例外

なし

setTuningInfoFlagメソッド

説明

チューニング情報を出力するかどうかを設定します。

デフォルトでは，falseが設定されています。

チューニング情報を出力する場合は，このメソッドでtrueを設定し，システムプロパティ「com.cosminexus.jaxp.preparsedxml.tuning.level」にINFOを設定する必要があります。チューニング情報の出力方法の詳細については，「3.4.9(3)　チューニング情報の出力方法」を参照してください。

形式

public void setTuningInfoFlag(boolean state)

パラメタ

state

チューニング情報を出力するかどうかを設定します。

true：チューニング情報を出力する

false：チューニング情報を出力しない

戻り値

なし

例外

なし

newPreparsedObjectメソッド

説明

事前解析用XML文書を解析して，解析結果オブジェクトを生成します。

形式

public PreparsedObject newPreparsedObject(java.io.File xml)

throws IllegalArgumentException, SAXException, IOException

パラメタ

xml

事前解析用XML文書を示すFileオブジェクトを指定します。nullは指定できません。

戻り値

解析結果オブジェクトであるPreparsedObjectの新しいインスタンスを返却します。

例外

IllegalArgumentException

xmlパラメタにnullが指定されているときに発生します。

SAXException

次の場合に発生します。

・処理中にSAXエラーが発生したとき

・XML1.1文書を事前解析しようとしたとき（詳細については「6.19.3　XML1.1に関する注意事項」を参照のこと）

IOException

入出力エラーが発生したときに発生します。

(2)　PreparsedObjectクラス

(a)　説明

解析結果オブジェクトを示すクラスです。

(b)　パッケージ名およびクラス名

com.cosminexus.jaxp.preparsedxml.PreparsedObject

(c)　形式

public class PreparsedObject

(d)　メソッド一覧

メソッド名

機能

isNamespaceAware

事前解析用XML文書を解析する際に設定された名前空間の有効・無効を返却する。

getErrorHandler

事前解析用XML文書を解析する際に設定されたエラーハンドラを返却する。

getEntityResolver

事前解析用XML文書を解析する際に設定されたエンティティリゾルバを返却する。

(e)　メソッド詳細

isNamespaceAwareメソッド

説明

事前解析用XML文書を解析する際に設定された名前空間の有効・無効を返却します。

形式

public boolean isNamespaceAware()

パラメタ

なし

戻り値

true：名前空間が有効である

false：名前空間が無効である

例外

なし

getErrorHandlerメソッド

説明

事前解析用XML文書を解析する際に設定されたエラーハンドラを返却します。

形式

public ErrorHandler getErrorHandler()

パラメタ

なし

戻り値

事前解析用XML文書を解析する際に設定されたエラーハンドラを返却します。設定されていない場合は，nullを返却します。

例外

なし

getEntityResolverメソッド

説明

事前解析用XML文書を解析する際に設定されたエンティティリゾルバを返却します。

形式

public EntityResolver getEntityResolver()

パラメタ

なし

戻り値

事前解析用XML文書を解析する際に設定されたエンティティリゾルバを返却します。設定されていない場合は，nullを返却します。

例外

なし

3.4.8　高速パース機能を使用するためのコード例

高速パース機能を使用するために，ユーザプログラムに記述するコードの例を次に示します。

import java.io.File;
import java.io.IOException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.cosminexus.jaxp.preparsedxml.PreparsedObjectFactory;
import com.cosminexus.jaxp.preparsedxml.PreparsedObject;

public class TestSAXParser{
    public static void main(String[] args){
        try{
            // 事前解析用XML文書から解析結果オブジェクトを生成する
            File xml = new File("learning1.xml");
            MyHandler handler = new MyHandler ();
            PreparsedObjectFactory pof = PreparsedObjectFactory.newInstance();
            pof.setNamespaceAware(true);
            pof.setEntityResolver(handler);
            pof.setErrorHandler(handler);
            PreparsedObject pobj = pof.newPreparsedObject(xml);

            // XMLパーサを生成する
            SAXParserFactory spf = SAXParserFactory.newInstance();
            spf.setNamespaceAware(true);
            SAXParser sp = spf.newSAXParser();

            // 解析結果オブジェクトをXMLパーサに設定して，解析を実行する
            sp.setProperty("http://cosminexus.com/xml/properties/preparsedobject-load", pobj);
            sp.parse("SampleSAX.xml", handler);
        } catch(IllegalArgumentException iae){
            System.out.println("MSG : " + iae.getMessage());
        }catch(SAXException se){
            System.out.println("MSG : " + se.getMessage());
        }catch(IOException ioe){
            System.out.println("MSG : " + ioe.getMessage());
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

class MyHandler extends DefaultHandler {
  //エラーハンドラとエンティティリゾルバの実装を記述
}

3.4.9　事前解析用XML文書のチューニング

事前解析用XML文書のチューニング情報を参照すると，高速パース機能が効果的に動作しているかどうかを調査できます。調査結果を基に事前解析用XML文書を最適化することで，解析速度をさらに向上できます。

事前解析用XML文書のチューニング情報の種類，利用方法，および出力方法について説明します。

(1)　チューニング情報の種類

チューニング情報として出力できるファイルは，次の2種類です。

チューニングサマリファイル

チューニング詳細ファイル

これらのファイルには，解析時のマッチング処理についての情報が出力されます。マッチング処理とは，解析時に解析結果オブジェクトの情報を利用できたかどうかを判定する処理のことです。解析結果オブジェクトの情報を利用できた場合を「マッチング処理に成功した」，解析結果オブジェクトの情報を利用できなかった場合を「マッチング処理に失敗した」といいます。

各ファイルについて説明します。

(a)　チューニングサマリファイル

高速パース機能を使用したそれぞれの解析について，マッチング処理の成功率，解析結果オブジェクトの生成に使用した事前解析用XML文書のファイル名，解析対象のXML文書のシステム識別子，チューニング詳細ファイル名などが出力されます。高速パース機能を使用した解析処理で，どのくらい効果的に解析結果オブジェクトが利用されているかを調査できます。

チューニングサマリファイルの詳細については，「3.4.10　チューニングサマリファイルの詳細」を参照してください。

(b)　チューニング詳細ファイル

高速パース機能を使用した1つの解析について，チューニングサマリファイルの情報に加え，マッチング処理の履歴が出力されます。高速パース機能を使用した解析処理で，マッチングに失敗している個所の詳細を調査できます。

チューニング詳細ファイルの詳細については，「3.4.11　チューニング詳細ファイルの詳細」を参照してください。

(2)　チューニング情報の利用方法

チューニング情報の利用方法を次に示します。

チューニング情報を出力する。

チューニング情報の出力方法については，「3.4.9(3)　チューニング情報の出力方法」を参照してください。

チューニングサマリファイルを参照して，マッチング処理の成功率が低い解析を抽出する。

マッチング処理の成功率が低いということは，解析結果オブジェクトが学習した事前解析用XML文書の構造と解析対象のXML文書の構造の違いが大きく，高速パース機能が効果的に動作していないことを示します。

2.で抽出した各解析について，チューニング詳細ファイルを参照して，マッチングに失敗した個所の履歴を調査する。

マッチングに失敗した個所の履歴を調査して，事前解析用XML文書と解析対象のXML文書の構造が不一致になっている部分を抽出します。

事前解析用XML文書を修正する。

3.の調査結果を基に，事前解析用XML文書を修正します。事前解析用XML文書を作成するための指針については，「3.4.3　事前解析用XML文書の作成」を参照してください。

注意事項

解析対象のXML文書に記述されているすべての要素や属性が事前解析用XML文書に含まれていても，マッチング処理の成功率が低い場合は，高速パース機能の効果は低くなります。

解析対象のXML文書に記述されているすべての要素や属性が事前解析用XML文書に含まれていても，マッチング処理の成功率が低下する場合の例を次に示します。

この例では，解析対象のXML文書でremark要素が省略されているため，remark要素のマッチング処理は失敗し，チューニング詳細ファイルに失敗履歴が記録されます。この結果，マッチング処理の成功率が低下します。

(3)　チューニング情報の出力方法

チューニング情報を出力するには，XML Processorが規定するシステムプロパティを設定する必要があります。また，PreparsedObjectを使用した高速パースでチューニング情報を出力する場合は，システムプロパティの設定に加え，PreparsedObjectFactoryクラスのsetTuningInfoFlagメソッドでtrueを設定して，PreparsedObjectを生成する必要があります。PreparsedObjectFactoryクラスの詳細については，「3.4.7(1)　PreparsedObjectFactoryクラス」を参照してください。

チューニング情報を出力するためのシステムプロパティ，チューニング情報の出力先，およびエラー発生時の動作について説明します。

注意事項

チューニング情報を出力した場合は，解析性能が劣化します。このため，チューニング情報は，高速パース機能の性能を評価するときだけ出力してください。

(a)　チューニング情報を出力するためのシステムプロパティ

システムプロパティ名

com.cosminexus.jaxp.preparsedxml.tuning.level

値

OFFまたはこのプロパティを設定していない場合：チューニング情報を出力しない

INFO：チューニング情報を出力する

大文字のINFO以外が指定された場合は，OFFが指定されたものとして扱われます。

(b)　チューニング情報の出力先

チューニング情報は，高速パース機能を利用した解析の終了時に出力されます。チューニング情報の出力先は，次の順序で決定されます。

<サーバのログ出力ディレクトリ>※/jaxp

注※　<サーバのログ出力ディレクトリ>は，動作しているサーバによって異なります。

J2EEサーバの場合

J2EEサーバのオプション定義ファイル（usrconf.cfg）のejb.server.log.directoryキーに指定されているディレクトリです。デフォルトでは，次のディレクトリとなります。

<製品の作業ディレクトリ>/ejb/<サーバ名称>/logs

Webコンテナサーバの場合

Webコンテナサーバのオプション定義ファイル（usrconf.cfg）のweb.server.log.directoryキーに指定されているディレクトリです。デフォルトでは，次のディレクトリとなります。

<Application Serverのインストールディレクトリ>/CC/web/containers/<サーバ名称>/logs

<user.dirシステムプロパティで取得できるディレクトリ>/logs/jaxp

なお，同名のファイルは上書きされます。同名のファイルが存在する場合は，必要に応じて退避してください。ファイル名の規則については，「3.4.10(1)　ファイル名（チューニングサマリファイル）」および「3.4.11(1)　ファイル名（チューニング詳細ファイル）」を参照してください。

また，チューニングサマリファイルおよびチューニング詳細ファイルは自動的には削除されません。必要に応じて削除してください。チューニングサマリファイルのファイルサイズの上限値については，「3.4.10(3)　ファイルサイズの上限値」を参照してください。チューニング詳細ファイルの合計ファイルサイズの上限値については，「3.4.11(3)　合計ファイルサイズの上限値」を参照してください。

(c)　エラー発生時の動作

エラーが発生してチューニング情報を出力できない場合の動作を次に示します。

入出力エラーが発生した場合

チューニングサマリファイル，およびチューニング詳細ファイルを出力する際に入出力エラーが発生した場合は，これらのファイルは出力されません。また，IOException例外が発生します。

XML文書の解析中にエラーが発生した場合

チューニングサマリファイルには情報が出力されません。チューニング詳細ファイルには，エラーが発生する前までの情報が出力されます。

3.4.10　チューニングサマリファイルの詳細

チューニングサマリファイルのファイル名，出力形式，およびファイルサイズの上限値を次に示します。

(1)　ファイル名（チューニングサマリファイル）

csmjaxp_ppxml_summary.csv

(2)　出力形式（チューニングサマリファイル）

出力行

出力内容

1行目

チューニングサマリファイルであることを示すヘッダ

Cosminexus XML Processor Fast Parse Function Tuning Summary Information

2行目

チューニングサマリファイルが作成された日時

3行目

4行目以降の行ヘッダ

matching rate,preparsed XML,parsed XML,tuning detail file,date

4行目以降

次の情報がコンマで区切られて出力される。

マッチング処理の成功率

成功回数÷マッチング処理の実行回数×100

事前解析用XMLファイル名※

解析対象のXML文書のシステム識別子※

システム識別子が設定されていない場合は，nullが出力されます。

チューニング詳細ファイルのファイル名※

解析が終了した日時

注※

出力文字列にコンマ（,）が含まれている場合も，そのまま出力されます。

出力例

(3)　ファイルサイズの上限値

1MB※

注※

1MBを超えた場合，それ以降のデータは追記しません。

なお，ファイルサイズの上限値は，次のシステムプロパティで変更できます。

システムプロパティ名

com.cosminexus.jaxp.preparsedxml.tuning.summaryfile_maxsize

値

0以上の整数を指定します。単位はMBです。

このプロパティを設定していない場合，および範囲外の値が指定された場合は，1が設定されます。

3.4.11　チューニング詳細ファイルの詳細

チューニング詳細ファイルのファイル名，出力形式，およびファイルサイズの上限値を次に示します。

(1)　ファイル名（チューニング詳細ファイル）

csmjaxp_ppxml_{事前解析用XML文書を表す文字列}_{解析対象のXML文書を表す文字列}_{連番}.txt

事前解析用XML文書を表す文字列

事前解析用XML文書の絶対パスの末尾部分から，最後に出現するピリオド（.）以降を除いたものです。

例：事前解析用XML文書の絶対パスが「D:¥home¥xml¥training¥tr1.xml」の場合

事前解析用XML文書を表す文字列は，「tr1」となります。

解析対象のXML文書を表す文字列

解析対象となるXML文書のシステム識別子の末尾部分から，最後に出現するピリオド以降を除いたものです。

例：解析対象のXML文書のシステムIDが「file:/home/xml/data/novelA.xml」の場合

解析対象のXML文書を表す文字列は，「novelA」となります。

連番

00〜99の連番です。解析ごとに増加します。

なお，J2EEサーバまたはWebコンテナを再起動すると「00」にリセットされます。また，「99」の次は「00」となります。

(2)　出力形式（チューニング詳細ファイル）

出力行

出力内容

1行目

チューニング詳細ファイルであることを示すヘッダ

Cosminexus XML Processor Fast Parse Function Tuning Detail Information

2行目

チューニング詳細ファイルが作成された日時

3行目

事前解析用XML文書のファイル名

4行目

解析対象のXML文書のシステム識別子

システム識別子が設定されていない場合は，nullが出力されます。

5行目

マッチング情報の開始を示すヘッダ

Matching Information start

6行目以降

マッチング情報（マッチング処理の履歴）

マッチング処理に成功している場合

o:{マッチング処理の対象とした要素・属性}※

マッチング処理に失敗している場合

x:expected {マッチングを試みたパターン}※ but {解析対象XML文書中に出現したパターン}※

最終行から2行目

マッチング情報の終了を示すフッタ

Matching Information end

最終行

マッチング処理の成功率

成功回数÷マッチング処理の実行回数×100（%）

ただし，マッチング処理が1回も実行されなかった場合は，0.0%と出力されます

注※

要素または属性の一部だけが出力されることがあります。また，要素または属性の前後の文字が出力されることがあります。具体例は出力例を参照してください。

出力例

(3)　合計ファイルサイズの上限値

32MB※

注※

出力済みのチューニング詳細ファイルの合計ファイルサイズが32MBを超えた場合，それ以降はチューニング詳細ファイルが生成されません。

例えば，次の1〜5の順にチューニング詳細ファイルが生成される場合，4のファイルが生成された時点で1〜4の合計ファイルサイズが40MBとなり，32MBを超えているため，5のファイルは生成されません。

csmjaxp_ppxml_trl_novelistA_00.txt（10MB）

csmjaxp_ppxml_trl_novelistB_00.txt（10MB）

csmjaxp_ppxml_trl_novelistC_00.txt（10MB）

csmjaxp_ppxml_trl_novelistD_00.txt（10MB）

csmjaxp_ppxml_trl_novelistE_00.txt（10MB）

なお，合計ファイルサイズの上限値は，次のシステムプロパティで変更できます。

システムプロパティ名

com.cosminexus.jaxp.preparsedxml.tuning.detailfile_totalmaxsize

値

0以上の整数を指定します。単位はMBです。

このプロパティを設定していない場合，および範囲外の値が指定された場合は，32が設定されます。

3.5　Apache独自の機能

XML Processorの08-70以降では，XMLパーサやXSLT／XSLTCトランスフォーマに対応してApache独自のフィーチャーやプロパティを設定できます。また，Apache独自の名前空間URIを使用することもできます。

ここでは，使用できるApache独自のフィーチャー，プロパティ，および名前空間URIを紹介します。それぞれの機能の詳細は，ApacheのXerces2 JavaおよびXalan Java 2のサイトを参照してください。

注意事項

この節で説明する機能はApache独自のものであり，JAXPの規格外となるため，これらの機能を使用した場合の動作は保証しません。これらの機能を使用する場合は，あらかじめ十分な動作確認を実施するようにしてください。

3.5.1　設定できるフィーチャー

XMLパーサに指定できるApache独自のフィーチャーを次に示します。

http://apache.org/xml/features/allow-java-encodings

http://apache.org/xml/features/continue-after-fatal-error

http://apache.org/xml/features/disallow-doctype-decl

http://apache.org/xml/features/dom/create-entity-ref-nodes

http://apache.org/xml/features/dom/defer-node-expansion

http://apache.org/xml/features/dom/include-ignorable-whitespace

http://apache.org/xml/features/generate-synthetic-annotations

http://apache.org/xml/features/honour-all-schemaLocations

http://apache.org/xml/features/nonvalidating/load-dtd-grammar

http://apache.org/xml/features/nonvalidating/load-external-dtd

http://apache.org/xml/features/scanner/notify-builtin-refs

http://apache.org/xml/features/scanner/notify-char-refs

http://apache.org/xml/features/standard-uri-conformant

http://apache.org/xml/features/validate-annotations

http://apache.org/xml/features/validation/dynamic

http://apache.org/xml/features/validation/schema

http://apache.org/xml/features/validation/schema/augment-psvi

http://apache.org/xml/features/validation/schema/element-default

http://apache.org/xml/features/validation/schema/normalized-value

http://apache.org/xml/features/validation/schema-full-checking

http://apache.org/xml/features/validation/warn-on-duplicate-attdef

http://apache.org/xml/features/validation/warn-on-undeclared-elemdef

http://apache.org/xml/features/warn-on-duplicate-entitydef

http://apache.org/xml/features/xinclude

http://apache.org/xml/features/xinclude/fixup-base-uris

http://apache.org/xml/features/xinclude/fixup-language

XSLT／XSLTCトランスフォーマに指定できるApache独自のフィーチャーを次に示します。

http://xml.apache.org/xalan/features/incremental

http://xml.apache.org/xalan/features/optimize

3.5.2　設定できるプロパティ

XMLパーサに指定できるApache独自のプロパティを次に示します。

http://apache.org/xml/properties/dom/current-element-node

http://apache.org/xml/properties/dom/document-class-name

http://apache.org/xml/properties/input-buffer-size

http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation

http://apache.org/xml/properties/schema/external-schemaLocation

http://apache.org/xml/properties/security-manager

XSLT／XSLTCトランスフォーマに指定できるApache独自のプロパティを次に示します。

http://xml.apache.org/xalan/properties/source-location

3.5.3　設定できる名前空間URI

XSLT／XSLTCトランスフォーマで使用できるApache独自の名前空間URIを次に示します。

http://xml.apache.org/xalan

http://xml.apache.org/xalan/java

http://xml.apache.org/xalan/PipeDocument

http://xml.apache.org/xalan/redirect

http://xml.apache.org/xalan/sql

http://xml.apache.org/xalan/xsltc

http://xml.apache.org/xalan/xsltc/java

http://xml.apache.org/xslt

http://xml.apache.org/xslt/java

3.6　XML SchemaのエラーメッセージとW3C仕様との対応

XML Processorが出力するエラーメッセージには，W3Cでの仕様個所を特定するための識別子が付いています。これは，スキーマ文書での構文エラーおよびXML文書での検証エラーに対して，一貫したエラー情報を提供するためです。

エラーメッセージに付いている識別子の一覧は，W3CによるXML Schemaの仕様書，Part1: Structure Appendices Cに記載されています。

例えば，スキーマ文書中で要素内のデータ型を整数型（xsd:integer）と規定したにもかかわらず，XML文書で文字列データを指定した場合は，次のメッセージが出力されます。

このメッセージでは，「cvc-datatype-valid.1.2.1」が識別子となります。これは，「Validation Rule: Datatype Valid」の，1.2.1に記載された規則に違反していることを示します。

3.7　パーサ切り替え機能

3.7.1　パーサ切り替え機能の概要

パーサ切り替え機能は，XML ProcessorのXML実装と，フレームワークまたはユーザが指定したXML実装との優先順を切り替えられる機能です。この機能を使うことで，フレームワークに同梱されたXML実装へ切り替えられます。

パーサ切り替え機能を使用することで，他社製のXML実装を前提とするフレームワークを使用したアプリケーションでも，XML実装を切り替えられます。ただし，パーサ切り替え機能では，アプリケーションサーバのコンポーネントが使用するXML実装をXML Processorから切り替えることはできません。

(1)　パーサ切り替え機能の有効範囲

パーサ切り替え機能の有効範囲はJ2EEサーバ単位です。パーサ切り替えの設定がほかのJ2EEサーバに影響を与えることはありません。

また，パーサ切り替え機能を有効にした場合でも，J2EEサーバ起動やデプロイの実行に関しては，ユーザが指定したXML実装ではなくXML Processorが使用されます。パーサ切り替え機能の有効範囲を次の図に示します。

図3‒20　パーサ切り替え機能の有効範囲

(2)　対象となるXML実装の種類

JAXP，StAX，JAXBの各APIで，XML実装を切り替えられるメソッドを次の表に示します。

表3‒9　XML実装を切り替えられるメソッド名

項番

APIの種類

クラス名

メソッド名

1

JAXP API

javax.xml.datatype.DatatypeFactory

newInstance()

2

javax.xml.parsers.DocumentBuilderFactory

newInstance()

3

javax.xml.parsers.SAXParserFactory

newInstance()

4

javax.xml.transform.TransformerFactory

newInstance()

5

javax.xml.transform.sax.SAXTransformerFactory

newInstance()

6

javax.xml.validation.SchemaFactory

newInstance(String schemaLanguage)

7

javax.xml.xpath.XPathFactory

newInstance()

8

newInstance(String URI)

9

org.w3c.dom.bootstrap.DOMImplementationRegistry

newInstance()

10

org.xml.sax.helpers.XMLReaderFactory

createXMLReader()

11

StAX API

javax.xml.stream.XMLInputFactory

newInstance()

12

newFactory()

13

javax.xml.stream.XMLOutputFactory

newInstance()

14

newFactory()

15

javax.xml.stream.XMLEventFactory

newInstance()

16

newFactory()

17

JAXB API

javax.xml.bind.JAXBContext

newInstance(Class... classesToBeBound)

18

newInstance(Class[] classesToBeBound, Map<String,?> properties)

19

newInstance(String contextPath)

20

newInstance(String contextPath, ClassLoader classLoader)

21

newInstance(String contextPath, ClassLoader classLoader, Map<String,?> properties)

3.7.2　パーサ切り替え機能の使用方法

パーサ切り替え機能は，アプリケーションで使用するXML実装を同梱し，次に示すJ2EEサーバの定義ファイルで設定します。

J2EEサーバ用ユーザプロパティファイル（usrconf.properties）

J2EEサーバ用セキュリティポリシーファイル（server.policy）

これらのファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「2.　J2EEサーバで使用するファイル」を参照してください。

これらのファイルの格納場所は次のとおりです。

Windowsの場合

<Application Serverのインストールディレクトリ>¥CC¥server¥usrconf¥ejb¥<サーバ名>¥

UNIXの場合

/opt/Cosminexus/CC/server/usrconf/ejb/<サーバ名>/

(1)　XML実装の同梱

XML実装を同梱するには，実装を切り替えるJ2EEアプリケーションのライブラリJAR，またはWebアプリケーションのWEB-INF/lib以下にXML実装を格納します。複数のアプリケーションでXML実装を切り替えたい場合，それぞれのアプリケーションにXML実装を同梱してください。ライブラリJARの詳細については，マニュアル「アプリケーションサーバシステム設計ガイド」の「2.3.3　J2EEアプリケーションとJ2EEコンポーネント」を参照してください。

なお，Component Containerのローカル呼び出し最適化機能で，最適化の範囲にallを指定している場合は，「3.7.4(5)　Component Containerのローカル呼び出し最適化機能を使用する場合の注意事項」の注意事項を参照してください。

(2)　J2EEサーバ用ユーザプロパティファイルの設定

J2EEサーバ用ユーザプロパティファイル（usrconf.properties）は，J2EEサーバ起動時に設定するシステムプロパティを定義するファイルです。パーサ切り替え機能を使用するには，対象となるXML実装の種類に応じて，次の表に示すプロパティをJ2EEサーバ用ユーザプロパティファイルに設定する必要があります。

表3‒10　J2EEサーバ用ユーザプロパティファイルに設定するプロパティ

APIの種類

プロパティ名

JAXP API

com.cosminexus.jaxp.change

StAX API

com.cosminexus.stax.change

JAXB API

com.cosminexus.jaxb.change

これらのプロパティに設定できる値とその意味を次の表に示します。

表3‒11　プロパティの設定値とその意味

プロパティの設定値

意味

true

各APIのXML実装を同梱のXML実装に切り替えます。

false（デフォルト値）

XML Processorが提供するXML実装を使用します。

(3)　J2EEサーバ用セキュリティポリシーファイルの設定

-nosecurityオプション（SecurityManagerの解除）を指定しないでJ2EEサーバを開始する場合，J2EEサーバ用セキュリティポリシーファイル（server.policy）にはAPIの種類に応じて次のように指定します。

JAXB APIの実装切り替えを指定している場合

permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.io.FilePermission "${cosminexus.home}/jaxp/lib/csmjaxb.jar", "read";

3.7.3　パーサ切り替え機能の性能

パーサ切り替え機能を使用しない場合の処理性能は09-00と同等です。

パーサ切り替え機能を使用した場合は，「3.7.1(2)　対象となるXML実装の種類」に示すFactoryクラスのインスタンス生成で，1回目は処理速度が数ミリ秒程度劣化します。2回目以降は問題となる劣化はありません。javax.xml.validation.SchemaFactory，javax.xml.xpath.XPathFactory，javax.xml.bind.JAXBContextのAPIについては性能劣化はありません。

3.7.4　パーサ切り替え機能の注意事項

(1)　コンテナ拡張ライブラリへのXML実装

usrconf.cfgにXML Processor以外のXML実装のクラスパスを指定すると，アプリケーションサーバの起動処理やコンポーネントの動作に影響を与えるため，コンテナ拡張ライブラリにXML実装は指定できません。

コンテナ拡張ライブラリの詳細については，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「19.　コンテナ拡張ライブラリ」を参照してください。

(2)　アプリケーションサーバの機能を使用する場合の注意事項

アプリケーションサーバが提供する機能には，XML Processorの動作を前提とするものがあります。次の表に示す機能は，同一のアプリケーションの中でパーサ切り替え機能と同時に使用すると正常に動作しない場合があるため，注意してください。

表3‒12　XML実装の切り替えに対応していないアプリケーションサーバの機能

APIの種類

XML実装の切り替えに対応していないアプリケーションサーバの機能

JAXP API

Webサービス機能（JAX-WS機能，JAX-RS機能，WS-RM1.1機能，WS-RM1.2機能）の全機能

WebサービスおよびSOAP間通信（既存機能）の全機能

JPA機能の全機能

JSF機能の全機能

JSTL機能の全機能

Bean Validation機能の全機能

CDI機能の全機能

セキュリティ管理（Webサービス）機能の全機能

cFrameworkの全機能

Reliable Messagingのキュー間転送機能

XML ProcessorのJAXB機能

Service Coordinatorの全機能

StAX API

Webサービス機能（JAX-WS機能，JAX-RS機能，WS-RM1.2機能）の全機能

JSTL機能の全機能

BeanValidation機能の全機能

XML ProcessorのJAXB機能

Service Coordinatorの全機能

JAXB API

Webサービス機能（JAX-WS機能，JAX-RS機能，WS-RM1.2機能）の全機能

JSTL機能の全機能

BeanValidation機能の全機能

Service Coordinatorの全機能

回避策として，ユーザ同梱のXML実装を必要とする部分と，アプリケーションサーバが提供する機能を必要とする部分とを別のアプリケーションに分けることを検討してください。

また，Service Coordinatorが動作するJ2EEサーバ上では，ユーザ同梱のXML実装を必要とするアプリケーションをService Coordinatorと別のJ2EEサーバで動作させることで回避してください。

(3)　切り替えるXML実装のバージョンについて

パーサ切り替え機能はXML実装を切り替えるだけで，APIは切り替えられません。そのため，APIのバージョンはアプリケーションサーバがサポートするバージョンから変更できません。

例えば，アプリケーションサーバがサポートするバージョンとは異なるバージョンに準拠したXML実装に切り替えた場合，XML Processor 09-50でサポートしているJAXP1.4/StAX1.0/JAXB2.2の範囲で使用され，新しいバージョンで追加されたAPIを使った開発・実行はできません。また，仕様変更による影響が発生したり，API使用時にエラーや例外が発生したりするおそれがあるため，異なるバージョンのXML実装へ切り替える場合には注意してください。

(4)　XMLの実装クラスの切り替えについて

JAXP1.4やJAXB2.2では，実装クラス切り替えの仕組みを規定しています。次に示す方法ですでに実装クラスを切り替えている場合は，その指定が優先されるため，パーサ切り替え機能の指定は有効になりません。

システムプロパティでファクトリクラスを指定している場合

jaxp.propertiesでJAXPのファクトリクラスを指定している場合

stax.propertiesでStAXのファクトリクラスを指定している場合

jaxb.propertiesでJAXBのファクトリクラスを指定している場合

したがって，jaxb.propertiesの指定が必須であるJAXB1のような実装はパーサ切り替え機能で切り替えることはできません。

(5)　Component Containerのローカル呼び出し最適化機能を使用する場合の注意事項

J2EEアプリケーションでXML実装を同梱する場合，Component Containerのローカル呼び出し最適化機能で最適化の範囲にallを指定する（ejbserver.rmi.localinvocation.scope=all）と，同一J2EEサーバ上で動作するすべてのアプリケーションのXML実装が切り替わります。J2EEアプリケーションが持つEJB-JARやライブラリJARは同一のクラスローダでロードされるため，同名のクラスはJ2EEアプリケーション間で共有されます。内容の異なる同名クラスが存在する場合は，Javaの仕様上，先にロードされたクラスだけが有効となるため，注意して使用してください。

ローカル呼び出し最適化機能の詳細については，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「付録B.2　ローカル呼び出し最適化時のクラスローダ構成」を参照してください。

(6)　クライアントで動作するJavaアプリケーションのXML実装切り替えについて

Javaアプリケーションでは，Javaアプリケーション用ユーザプロパティファイルにシステムプロパティを指定することでXML実装が切り替えられるため，パーサ切り替え機能はサポートしていません。

Javaアプリケーション用ユーザプロパティファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「12.2.2　usrconf.properties（Javaアプリケーション用ユーザプロパティファイル）」を参照してください。

3.8　セキュアプロセッシング機能

3.8.1　機能の概要

JAXPではJAXP1.3よりXMLの解析でセキュア（安全）な処理を実現するためにセキュアプロセッシング機能を提供しています。セキュアプロセッシング機能ではDTDに定義されたエンティティやXMLスキーマに指定されたmaxOccursの値を制限することによってサービス不能攻撃（DoS）の可能性がある不当なXMLを処理しないようにします。セキュアプロセッシング機能の設定は次のクラスに対しsetFeatureメソッドを使用し次のフィーチャーで設定します。フィーチャーの指定方法を次の表に示します。詳細はJSR 206 JavaTM API for XML Processing（JAXP）1.4および次のクラスのsetFeatureメソッドのjavadocを参照してください。

javax.xml.parsers.SAXParserFactory

javax.xml.parsers.DocumentBuilderFactory

javax.xml.transform.TransformerFactory

javax.xml.validation.SchemaFactory

javax.xml.xpath.XPathFactory

表3‒13　フィーチャーの指定方法

フィーチャー名

内容

値

http://javax.xml.XMLConstants/feature/secure-processing

機能を有効にする

true

機能を無効にする

false

XMLPでは09-50-03までセキュアプロセッシング機能をデフォルトで無効としていましたが，09-50-04以降一部のAPIでデフォルト有効となります。また制限値をチェックする項目では，制限値を変更できるようにし，エンティティに関して制限する項目を追加し機能を強化します。ただし，互換性のため，以前と同様に動作させるためのシステムプロパティも提供します。

3.8.2　機能の有効範囲

APIを実行したとき，デフォルトでの機能が有効・無効かを次の表に示します。

表3‒14　デフォルトでの機能の有効・無効について

項番

クラス名・インターフェース名

メソッド名

デフォルト

09-50-03以前

09-50-04以降

1

javax.xml.parsers.SAXParser

parse

無効

有効

2

org.xml.sax.XMLReader

parse

無効

有効

3

org.xml.sax.XMLFilter

parse

無効

有効※

4

javax.xml.parsers.DocumentBuilder

parse

無効

有効

5

javax.xml.transform.TransformerFactory

newTemplates

無効

無効

6

javax.xml.transform.TransformerFactory

getAssociatedStylesheet

無効

無効

7

javax.xml.transform.TransformerFactory

newTransformer

無効

無効

8

javax.xml.transform.sax.SAXTransformerFactory

newXMLFilter

無効

無効

9

javax.xml.transform.sax.SAXTransformerFactory

newTransformerHandler

無効

無効

10

javax.xml.transform.Transformer

transform

無効

無効

11

javax.xml.validation.SchemaFactory

newSchema

無効

有効

12

javax.xml.validation.Validator

validate

無効

有効

13

javax.xml.xpath.XPath

compile

無効

無効

14

javax.xml.xpath.XPath

evaluate

無効

無効

15

javax.xml.xpath.XPathExpression

evaluate

無効

無効

16

com.cosminexus.jaxp.preparsedxml.PreparsedObjectFactory

newPreparsedObject

無効

有効

注※

SAXTransformerFactoryクラスのnewXMLFilterで作成されたXMLFilterのparseメソッドは無効となります。

3.8.3　制限できる項目

この機能で制限できる項目を次に示します。これらの項目は制限値を変更できます。

(1)　エンティティに関する制限

XMLPではエンティティ展開時に制限をする機能を提供します。制限する項目を次に示します。

エンティティ参照の展開回数

一般エンティティの文字列長

パラメータエンティティの文字列長

一般エンティティとパラメータエンティティの展開後の文字列長の合計

(a)　エンティティ参照の展開回数

エンティティ参照の展開回数を制限します。XML解析処理で制限値を超えた場合のエラー通知（fatalErrorイベント）または例外発生時のエラーメッセージはKECX01225-Eエラーとなります。

エンティティ参照の展開回数を制限するXML例を次に示します。

<!DOCTYPE root [
 <!ENTITY x3 "abc">
 <!ENTITY x2 "&x3;&x3;">
 <!ENTITY x1 "&x2;&x2;">
 ]>
<root>&x1;</root>

上記XML例ではエンティティ参照の展開回数は&x1; &x2; &x3; &x3; &x2; &x3; &x3;の7回となります。

(b)　一般エンティティの文字列長

一般エンティティ実体の文字列長を制限します。XML解析処理で制限値を超えた場合のエラー通知（fatalErrorイベント）または例外発生時のエラーメッセージはKECX01232-Eエラーとなります。

一般エンティティの文字列長を制限するXML例を次に示します。

<!DOCTYPE root [
 <!ENTITY GE4 "hijk">
 <!ENTITY GE3 "abcd">
 <!ENTITY GE2 "efgh&GE3;ijk">
 <!ENTITY GE1 "lmn">
 ]>
<root>&GE1;&GE2;</root>

上記XML例ではエンティティ参照しているエンティティGE1やGE2について”lmn”（3文字），GE3展開後の”efghabcdijk”（11文字）の文字列長をチェックします。GE3だけのチェックはしません。参照していないGE4についてはチェックされません。

(c)　パラメータエンティティの文字列長

パラメータエンティティ展開後の文字列長を制限します。XML解析処理で制限値を超えた場合のエラー通知（fatalErrorイベント）または例外発生時のエラーメッセージはKECX01232-Eエラーとなります。

パラメータエンティティの文字列長を制限するXML例を次に示します。

<!ENTITY % PE2 "abcd">
<!ENTITY % PE1 "%PE2;efgh">
<!ENTITY GE1 "ij">
<!ENTITY % PEG1 "&GE1;klmn">
<!ENTITY % PEEXT SYSTEM "ext.xml">

上記XML例では，エンティティPE1はPE2のパラメータエンティティ展開後の”abcdefgh”（8文字）の文字列長を，PE2は“abcd”（４文字）の文字列長をチェックします。エンティティPEG1は一般エンティティGE1を参照しますが，パラメータエンティティから一般エンティティへの参照は展開されず，”&GE1;klmn”（9文字）の文字列長をチェックします。参照されていない外部パラメータエンティティPEEXTのチェックはしません。

(d)　一般エンティティとパラメータエンティティの展開後の文字列長の合計

一般エンティティとパラメータエンティティの展開後のすべての文字列長の合計の値を制限します。XML解析処理で制限値を超えた場合のエラー通知（fatalErrorイベント）または例外発生時のエラーメッセージはKECX01233-Eエラーとなります。

一般エンティティとパラメータエンティティの展開後の文字列長の合計を制限するXML例を次に示します。

<!ENTITY GE3 "abcd">
<!ENTITY GE2 "efgh&GE3;ijk">
<!ENTITY GE1 "lmn">
<!ENTITY % PE2 "abcd">
<!ENTITY % PE1 "%PE2;efgh">

上記XML例では， GE1，GE2だけが参照されている場合，参照されている一般エンティティGE1，GE2と定義されているパラメータエンティティPE1，PE2の展開後の文字列長の合計となるため次のとおり26となります。

GE1：”lmn”（3文字）

GE2：”efghabcdijk”（11文字）

PE1：”abcdefgh”（8文字）

PE2：”abcd”（4文字）

(e)　エンティティによって置き換えられる文字列や参照されるファイルにあるノード数

エンティティによって置き換えられる文字列や参照されるファイルに次のオブジェクトが含まれる場合，その数をノード数として制限します。

XML解析処理で制限値を超えた場合のエラー通知(fatalErrorイベント)または例外発生時のエラーメッセージはKECX01235-Eエラーとなります。

要素タグ

要素内容

属性

処理命令

コメント

CDATAセクション

エンティティの参照

エンティティによって置き換えられる文字列や参照されるファイルにあるノード数を制限するXML例を次に示します。

例1　エンティティによって置き換えられる文字列や参照されるファイルにあるノード数の制限のXML例（test.xml）

<?xml version="1.0" ?>
<!DOCTYPE root[
  <!ELEMENT root ANY >
  <!ENTITY GE1 SYSTEM "external.xml">
]>
<root>&GE1;</ root>

例2　エンティティによって置き換えられる文字列や参照されるファイルにあるノード数の制限のXML例（external.xml）

<xmlFile>
  <filler1>example</filler1>
  <filler1 attr="abc">example</filler1>
  <!-- comment -->
  <![CDATA[ cdata section ]]>
   ・・・
</xmlFile>

上記XML例では，参照しているエンティティGE1（外部エンティティ参照によって読み込んだexternal.xml）に含まれる要素タグ（xmlFile要素やfilter1要素），要素内容（filter1要素の間にある"example"）などのオブジェクトの数をノード数としてチェックします。

(2)　XMLスキーマの内容モデルに関する制限

XMLスキーマの内容モデルで作成されるノードの最大数を制限する機能を提供します。XML解析処理で制限値を超えた場合のエラー通知（fatalErrorイベント）または例外発生時のエラーメッセージはKECX06248-Eエラーとなります。XMLスキーマの内容モデルで作成されるノードの最大数を制限するXMLスキーマ例を次に示します。

<xsd:complexType>
  <xsd:sequence maxOccurs="2">
    <xsd:element name="child" maxOccurs="1500"/>
  </xsd:sequence>
</xsd:complexType>

上記例のとおりXMLスキーマの複合型の大域定義（一番外側に定義された<xsd:complexType>）に対しmaxOccursに大きな値を指定した場合エラーとなります。ただし，maxOccursに制限値より小さな値の場合でもネストの深さやその他のmaxOccursの指定によって内部のカウンタが制限値を超える場合エラーとなります。

(3)　XML名の文字列長

要素および属性のプレフィックスやローカル名，名前空間URIの文字列長を制限する機能を提供します。XML解析処理で制限値を超えた場合のエラー通知（fatalErrorイベント）または例外発生時のエラーメッセージはKECX01234-Eエラーとなります。XML名の文字列長の制限に該当するXMLの例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <prefix:localname xmlns:prefix="http://www.hitachi.co.jp/xmlp/sample/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz"/>
</root>

上記XML例は，XML名の一つである名前空間URIの文字列長が長い場合の例です。この例のように，XML名に長い文字列を指定した場合エラーとなります。

(4)　XPath式に関する制限

XPath式のコンパイル時にXPath式に対する制限をする機能を提供します。制限する項目を次に示します。

XPath式に含まれるグループの数

XPath式に含まれる演算子の数

XPath式に含まれる演算子の総数

(a)　XPath式に含まれるグループの数

XPath式に含まれるグループの数を制限します。XPath式に含まれるグループの数が制限値を超えた場合，XPath式のコンパイルをする機能によって，次の表の動作になります。

表3‒15　XPath式に含まれるグループの数が制限値を超えた場合の動作

機能

動作

XPath式を評価するためのAPI

KECX03139-Eのエラーメッセージを含む例外をスローします。

XSLTトランスフォーマ機能

KECX02267-Eのエラーメッセージを含む例外をエラー通知（fatalErrorイベント）します。

XSLTCトランスフォーマ機能

KECX07107-Eのエラーメッセージを含む例外をエラー通知（fatalErrorイベント）します。

グループが含まれるXPath式の例を次に示します。

(((((child::*)|(child::*)|(child::*))|((child::*)|(child::*)|(child::*)))))

上記XPath式の例ではグループの数は11個となります。

(b)　XPath式に含まれる演算子の数

1つのXPath式に含まれる演算子の数を制限します。XPath式に含まれる演算子の数が制限値を超えた場合，XPath式のコンパイルをする機能によって，次の表の動作になります。

表3‒16　XPath式に含まれる演算子の数が制限値を超えた場合の動作

機能

動作

XPath式を評価するためのAPI

KECX03140-Eのエラーメッセージを含む例外をスローします。

XSLTトランスフォーマ機能

KECX02268-Eのエラーメッセージを含む例外をエラー通知（fatalErrorイベント）します。

XSLTCトランスフォーマ機能

KECX07108-Eのエラーメッセージを含む例外をエラー通知（fatalErrorイベント）します。

演算子が含まれるXPath式の例を次に示します。

x >= 90.00 and y <= 9.0 and x >= 90.00 and y <= 9.0

上記XPath式の例では演算子の数は7個となります。

(c)　XPath式に含まれる演算子の総数

XSLTトランスフォーマおよびXSLTCトランスフォーマの場合，解析するスタイルシートに記述された複数のXPath式に含まれる演算子の総数（総和）を制限します。解析するスタイルシートに記述された複数のXPath式に含まれる演算子の総数が制限値を超えた場合，スタイルシートの解析をした機能によって，次の表の動作になります。

表3‒17　XPath式に含まれる演算子の総数が制限値を超えた場合の動作

機能

動作

XSLTトランスフォーマ機能

KECX02269-Eのエラーメッセージを含む例外をエラー通知（fatalErrorイベント）します。

XSLTCトランスフォーマ機能

KECX07109-Eのエラーメッセージを含む例外をエラー通知（fatalErrorイベント）します。

(d)　XPath式に関する制限の互換用システムプロパティ

(a)〜(c)に示したXPath式に関する制限で動作が変化することによる影響を考慮し，XPath式に関する制限の動作を変更する互換用システムプロパティを提供します。提供するシステムプロパティを次の表に示します。

表3‒18　XPath式に関する制限の互換用システムプロパティ

システムプロパティ名

内容

値※

com.cosminexus.jaxp.secure_processing.xpath_limit.compatible

(a)〜(c)に示したXPath式に関する制限を無効にします。

true（デフォルト）

(a)〜(c)に示したXPath式に関する制限を有効にします。

false

注※

小文字の"false"以外の値は，すべて"true"を指定したものとして扱います。

3.8.4　機能の使用方法

(1)　制限値の変更

セキュアプロセッシング機能の制限値を変更するには次の方法があります。

Cosminexus XML Processorが独自に規定するシステムプロパティを指定する。

Cosminexus XML Processorが独自に規定するプロパティを指定する。

システムプロパティと各APIのプロパティ指定が同時に指定された場合，各APIのプロパティの指定を優先します。

提供するシステムプロパティの一覧を次の表に示します。

表3‒19　提供するシステムプロパティ一覧

項番

システムプロパティ名

内容

指定可能値※1

デフォルト値

1

com.cosminexus.jaxp.secure_processing.entityExpansionLimit

エンティティ参照の展開回数

0〜2147483647

100000

2

com.cosminexus.jaxp.secure_processing.maxGeneralEntitySizeLimit

一般エンティティの文字列長

0〜2147483647

0

3

com.cosminexus.jaxp.secure_processing.maxParameterEntitySizeLimit

パラメータエンティティの文字列長

0〜2147483647

1000000

4

com.cosminexus.jaxp.secure_processing.totalEntitySizeLimit

エンティティの展開後の実体文字列長の合計

0〜2147483647

50000000

5

com.cosminexus.jaxp.secure_processing.entityReplacementLimit

エンティティによって置き換えられる文字列や参照されるファイルにあるノード数

0〜2147483647

3000000

6

com.cosminexus.jaxp.secure_processing.maxOccurLimit

内容モデルのノード数

0〜2147483647

3000

7

com.cosminexus.jaxp.secure_processing.maxXMLNameLimit

XML名の文字列長

0〜2147483647

1000

8

com.cosminexus.jaxp.secure_processing.xpathExprGrpLimit※2

XPath式に含まれるグループの数

0〜2147483647

10

9

com.cosminexus.jaxp.secure_processing.xpathExprOpLimit※2

XPath式に含まれる演算子の数

0〜2147483647

100

10

com.cosminexus.jaxp.secure_processing.xpathTotalOpLimit※2

XPath式に含まれる演算子の総数

0〜2147483647

10000

注※1

値に0が指定された場合，制限値によるエラーチェックはされません。

指定できる値以外の値が指定された場合デフォルト値が設定されます。

注※2

デフォルト値より小さい値（0を除く）を指定するとCosminexus製品で制限に該当してエラーが発生するおそれがあるため，デフォルト値より小さい値を設定することは推奨しません。

提供するプロパティの一覧を次の表に示します。プロパティ値で指定できる値は次の表を参照してください。

不正な値を指定した場合，値を設定しません。したがって設定前の値のままとなります。

表3‒20　提供するプロパティ一覧

項番

プロパティ名

内容

1

http://cosminexus.com/xml/properties/entityExpansionLimit

エンティティ参照の展開回数

2

http://cosminexus.com/xml/properties/maxGeneralEntitySizeLimit

一般エンティティの文字列長

3

http://cosminexus.com/xml/properties/maxParameterEntitySizeLimit

パラメータエンティティの文字列長

4

http://cosminexus.com/xml/properties/totalEntitySizeLimit

エンティティの展開後の実体文字列長の合計

5

http://cosminexus.com/xml/properties/entityReplacementLimit

エンティティによって置き換えられる文字列や参照されるファイルにあるノード数

6

http://cosminexus.com/xml/properties/maxOccurLimit

内容モデルのノード数

7

http://cosminexus.com/xml/properties/maxXMLNameLimit

XML名の文字列長

8

http://cosminexus.com/xml/properties/xpathExprGrpLimit

XPath式に含まれるグループの数

9

http://cosminexus.com/xml/properties/xpathExprOpLimit

XPath式に含まれる演算子の数

10

http://cosminexus.com/xml/properties/xpathTotalOpLimit

XPath式に含まれる演算子の総数

制限値を設定する場合に表3-20のプロパティを設定するメソッドの一覧を次の表に示します。

プロパティを設定する場合，セキュアプロセッシング機能を有効にしてから設定してください。

表3‒21　制限値を設定するプロパティの設定メソッド

項番

クラス名・インタフェース名

メソッド

1

javax.xml.parsers.DocumentBuilderFactory

setAttribute

2

javax.xml.parsers.SAXParser

setProperty

3

org.xml.sax.XMLReader

setProperty

4

javax.xml.transform.TransformerFactory

setAttribute

5

javax.xml.validation.SchemaFactory

setProperty

com.cosminexus.jaxp.preparsedxml.PreparsedObjectFactoryではプロパティでの設定はできません。したがってシステムプロパティで設定する必要があります。

(2)　互換用システムプロパティ

この機能をサポートする以前と同様の動作にする必要性を考慮し，互換用システムプロパティを提供します。提供するプロパティの仕様を次の表に示します。このシステムプロパティと各APIのフィーチャー指定が同時にされた場合，各APIのフィーチャーの指定を優先します。

表3‒22　互換システムプロパティ

システムプロパティ名

内容

値※

com.cosminexus.jaxp.secure_processing.compatible

09-50-04以降のデフォルト値を使用する。（表3-14参照）

false（デフォルト）

09-50-03以前のデフォルト値を使用する。

true

注※

小文字の"true"以外の値は，すべて"false"を指定したものとして扱います。

3.8.5　無効時の動作

セキュアプロセッシング機能が無効の場合でも一部の項目については制限を有効化します。セキュアプロセッシング機能が無効の場合の制限の有効／無効を，次の表に示します。

表3‒23　セキュアプロセッシング機能が無効の場合の制限の有効／無効

内容

制限の有効／無効

エンティティ参照の展開回数

無効

一般エンティティの文字列長

無効

パラメータエンティティの文字列長

無効

エンティティの展開後の実体文字列長の合計

無効

エンティティによって置き換えられる文字列や参照されるファイルにあるノード数

無効

内容モデルのノード数

無効

XML名の文字列長

無効

XPath式に含まれるグループの数

有効※

XPath式に含まれる演算子の数

有効※

XPath式に含まれる演算子の総数

有効※

注※

XPath式に関する制限が有効の場合です。詳細は，「3.8.3(4)(d)　XPath式に関する制限の互換用システムプロパティ」を参照してください。

3.9　互換オプション機能

XML Processorの07-00以降では，JAXP1.2からJAXP1.3への移行などを実施したため，以前のバージョンとは機能や動作が一部異なります。XML Processorの互換オプション機能を使用すると，以前のバージョンと同じ動作ができます。

3.9.1　互換オプション機能の概要

XML Processorの互換オプション機能では，XMLスキーマを使った検証パースの互換機能を使用できます。検証パースの互換機能では次に示す項目に対して，06-00の動作と07-00以降の動作とを切り替えられます。

表3‒24　検証パースの互換機能で切り替えられる動作

項目

XML Processor 06-00の動作

XML Processor 07-00以降の動作

スキーマ文書やインスタンス文書が不正な構文のURIを参照した場合

例外はスローされません。

次の例外がスローされます。

JDK5/JDK7以降で動作する場合

IllegalArgumentException

JDK6で動作する場合

NullPointerException またはIllegalArgumentException

存在しないスキーマ文書を参照した場合

KECX06069-Eエラー（warningイベント）は通知されません。

KECX06069-Eエラー（warningイベント）が通知されます。

3.9.2　互換オプション機能の設定方法

(1)　互換オプション機能を設定するファイル

互換オプション機能は使用する環境に応じて，次のどれかのファイルで設定できます。

J2EEサーバ用ユーザプロパティファイル

<アプリケーションサーバのインストールディレクトリ>/CC/server/usrconf/ejb/<サーバ名称>/usrconf.properties

Webコンテナサーバ用ユーザプロパティファイル

<アプリケーションサーバのインストールディレクトリ>/CC/web/containers/<サーバ名称>/usrconf/usrconf.properties

EJBクライアントアプリケーション用ユーザプロパティファイル

<ユーザ定義ファイル格納ディレクトリ>/usrconf.properties

(2)　プロパティの設定

ファイルには次の形式でプロパティを設定してください。互換オプションの値は起動時に1回だけ読み込まれます。起動後に変更することはできません。

プロパティ名=設定値

検証パースの互換機能で使用するプロパティ名と設定値を次の表に示します。

表3‒25　検証パースの互換機能で使用するプロパティ名と設定値

項目

プロパティ名

設定値

スキーマ文書やインスタンス文書が不正な構文のURIを参照した場合

com.cosminexus.jaxp.compat.schema_illegal_uri

ON

06-00と同じ動作にする。

OFF，その他の文字

07-00以降と同じ動作にする（デフォルト）。

存在しないスキーマ文書を参照した場合

com.cosminexus.jaxp.compat.schemalocation

4　フィーチャーおよびプロパティの使用方法

この章では，JAXPおよびJAXBで規定されているフィーチャーおよびプロパティの使用方法について説明します。また，XML Processorの拡張機能に関連したフィーチャーおよびプロパティの使用方法についても説明します。

4.1　SAX2のフィーチャーおよびプロパティの使用方法

SAX2規格では，フィーチャーおよびプロパティという機構によって，SAXパーサのオプション機能を使用する方法を規定しています。

フィーチャー名およびプロパティ名は，SAXパーサのオプション機能に対応したURIです。フィーチャー名，プロパティ名の形式は次のとおりです。

XML ProcessorがサポートしているSAX2のフィーチャーを表4-1に，XML ProcessorがサポートしているSAX2のプロパティを表4-2に示します。

表4‒1　XML ProcessorがサポートしているSAX2のフィーチャー一覧

項番

フィーチャー名

1

http://xml.org/sax/features/external-general-entities

2

http://xml.org/sax/features/external-parameter-entities

3

http://xml.org/sax/features/namespaces

4

http://xml.org/sax/features/namespace-prefixes

5

http://xml.org/sax/features/use-attributes2

6

http://xml.org/sax/features/use-locator2

7

http://xml.org/sax/features/use-entity-resolver2

8

http://xml.org/sax/features/validation

表4‒2　XML ProcessorがサポートしているSAX2のプロパティ一覧

項番

プロパティ名

1

http://xml.org/sax/properties/declaration-handler

2

http://xml.org/sax/properties/lexical-handler

それぞれのフィーチャー，およびプロパティの意味については，Simple API for XML (SAX) 2.0.2 (sax2r3)のJavadocの次に示す個所を参照してください。

org.xml.saxパッケージの "SAX2 Standard Feature Flags"

org.xml.saxパッケージの "SAX2 Standard Handler and Property IDs"

4.1.1　SAX2のフィーチャーの使用方法

SAX2のフィーチャーを設定するには，org.sax.xml.XMLReaderクラスのsetFeatureメソッドを使用します。フィーチャーの設定方法を次に示します。

4.1.2　SAX2のプロパティの使用方法

SAX2のプロパティを設定するには，org.sax.xml.XMLReaderクラスのsetPropertyメソッドを使用します。プロパティの設定方法を次に示します。

4.2　StAXのプロパティの使用方法

StAX規格では，XMLInputFactoryおよびXMLOutputFactoryにプロパティを設定できます。設定できるプロパティを次に示します。

javax.xml.stream.isNamespaceAware

javax.xml.stream.isCoalescing

javax.xml.stream.isReplacingEntityReferences

javax.xml.stream.isSupportingExternalEntities

javax.xml.stream.reporter

javax.xml.stream.resolver

javax.xml.stream.allocator

javax.xml.stream.isRepairingNamespaces

それぞれのプロパティの意味については，Streaming API For XML Version 1.0(JSR-173)の次に示す個所を参照してください。

「Chapter 4.5.1.1 Supported Properties of XMLInputFactory」

「Chapter 4.5.2.1 Supported Properties of XMLOutputFactory」

Javadoc

使用方法

XMLInputFactoryに対してプロパティを設定するには，javax.xml.stream.XMLInputFactoryクラスのsetPropertyメソッドを使用します。また，XMLOutputFactoryに対してプロパティを設定するには，javax.xml.stream.XMLOutputFactoryクラスのsetPropertyメソッドを使用します。

それぞれのプロパティの設定方法を次に示します。

XMLInputFactoryに対してプロパティを設定する場合

XMLOutputFactoryに対してプロパティを設定する場合

4.3　XSLTのフィーチャーの使用方法

JAXP規格では，フィーチャーという機構によって，XSLTトランスフォーマのオプション機能を使用する方法を規定しています。

フィーチャー名は，XSLTトランスフォーマのオプション機能に対応したURIです。JAXPで規定されているXSLTフィーチャーを次の表に示します。

表4‒3　JAXPで規定されているXSLTのフィーチャー一覧

項番

フィーチャー名

1

http://javax.xml.transform.stream.StreamSource/feature

2

http://javax.xml.transform.stream.StreamResult/feature

3

http://javax.xml.transform.dom.DOMSource/feature

4

http://javax.xml.transform.dom.DOMResult/feature

5

http://javax.xml.transform.sax.SAXSource/feature

6

http://javax.xml.transform.sax.SAXResult/feature

7

http://javax.xml.transform.sax.SAXTransformerFactory/feature

8

http://javax.xml.transform.sax.SAXTransformerFactory/feature/xmlfilter

それぞれのフィーチャーの意味については，JSR 206 Java API for XML Processing(JAXP) 1.4のjavadocの各クラスに記載されているFEATUREフィールドを参照してください。

使用方法

XSLTのフィーチャーは，設定することはできません。XSLTのフィーチャーを参照するには，javax.xml.transform.TransformerFactoryクラスのgetFeatureメソッドを使用します。getFeatureの結果はすべてtrueになります。

4.4　XML Schemaのプロパティの使用方法

JAXPで規定されたプロパティを設定すると，スキーマ検証に使用するスキーマ言語，およびスキーマ文書を特定できます。プロパティの詳細については，JSR 206 Java API for XML Processing(JAXP) 1.4のChapter 4. Plugability LayerのProperties For Enabling Schema Validationを参照してください。

4.4.1　DOMパーサに対するXML Schemaのプロパティの設定方法

DOMパーサに対してXML Schemaのプロパティを設定するには，javax.xml.parsers.DocumentBuilderFactoryクラスのsetAttributeメソッドを使用します。プロパティの設定方法を次に示します。

コーディング例について次に説明します。各項番はコーディング例のコメントに記述している番号に対応しています。

妥当性を検証するように設定します。

javax.xml.parsers.DocumentBuilderFactoryクラス，setValidatingメソッドの引数にtrueを設定します。これによって，XML文書の妥当性検証の機能が有効になります。

スキーマ検証に使用するスキーマ言語を設定します。

javax.xml.parsers.DocumentBuilderFactoryクラス，setAttributeメソッドで，プロパティ文字列"http://java.sun.com/xml/jaxp/properties/schemaLanguage"に対して，XML Schemaの仕様に従って検証を行うことを示す値，"http://www.w3.org/2001/XMLSchema"を設定します。これによって，XML Schemaによる妥当性検証が行われます。

スキーマ文書を特定します。

javax.xml.parsers.DocumentBuilderFactoryクラス，setAttributeメソッドで，プロパティ文字列"http://java.sun.com/xml/jaxp/properties/schemaSource"に対して，検証に使うスキーマ文書を特定します。XML文書内でスキーマ文書を特定する場合，この指定は不要です。

4.4.2　SAXパーサに対するXML Schemaのプロパティの設定方法

SAXパーサに対してXML Schemaのプロパティを設定するには，javax.xml.parsers.SAXParserクラスのsetPropertyメソッドを使用します。プロパティの設定方法を次に示します。

コーディング例について次に説明します。各項番はコーディング例のコメントに記述している番号に対応しています。

妥当性を検証するように設定します。

javax.xml.parsers.SAXParserFactoryクラス，setValidatingメソッドの引数にtrueを設定します。これによって，XML文書の妥当性検証の機能が有効になります。

XML Schemaの仕様に従うように設定します。

javax.xml.parsers.SAXParserクラス，setPropertyメソッドで，プロパティ文字列"http://java.sun.com/xml/jaxp/properties/schemaLanguage"に対して，XML Schemaの仕様に従って検証を行うことを示す値，"http://www.w3.org/2001/XMLSchema"を設定します。これによって，XML Schemaによる妥当性検証が行われます。

スキーマ文書を特定します。

javax.xml.parsers.SAXParserクラス，setPropertyメソッドで，プロパティ文字列"http://java.sun.com/xml/jaxp/properties/schemaSource"に対して，検証に使うスキーマ文書を指定します。XML文書内でスキーマ文書を特定する場合，この指定は不要です。

4.4.3　スキーマ文書をXML文書内で設定する方法

「4.4.1　DOMパーサに対するXML Schemaのプロパティの設定方法」，および「4.4.2　SAXパーサに対するXML Schemaのプロパティの設定方法」に示した方法では，プロパティを用いてスキーマ文書を設定しています。これに対して，検証の対象となるXML文書内で，直接スキーマ文書を特定する方法もあります。なお，XML文書内でスキーマ文書を特定し，かつ，プロパティを用いてスキーマ文書を特定した場合は，プロパティを使って特定したスキーマ文書が優先されます。

検証の対象となるXML文書内でスキーマ文書を特定するには，xsi:schemaLocation属性またはxsi:noNamespaceSchemaLocation属性を使用します。これらの属性は，特定するスキーマ文書内で，名前空間を定義しているかどうかによって異なります。特定するスキーマ文書の種類と使用する属性の関係を次の表に示します。

表4‒4　特定するスキーマ文書の種類と使用する属性の関係

特定するスキーマ文書の種類

使用する属性

名前空間を定義したスキーマ文書

xsi:schemaLocation

名前空間を定義していないスキーマ文書

xsi:noNamespaceSchemaLocation

xsi:schemaLocation属性を使用する場合，特定するスキーマ文書内で宣言されている要素や属性の名前空間のURIと，特定するスキーマ文書名を空白で区切って指定します。

xsi:schemaLocation属性，およびxsi:noNamespaceSchemaLocation属性は，どちらも名前空間"http://www.w3.org/2001/XMLSchema-instance"に属します。したがって，これらの属性を使ってスキーマ文書を特定する場合，名前空間"http://www.w3.org/2001/XMLSchema-instance"を宣言する必要があります。

xsi:schemaLocation属性を使用してスキーマ文書を特定する場合の例を次に示します。

xsi:schemaLocation属性の名前空間を宣言します。

xsi:schemaLocation属性を使ってスキーマ文書を特定するために，この属性の名前空間"http://www.w3.org/2001/XMLSchema-instance"を宣言します。

スキーマ文書を特定します。

特定するスキーマ文書内で宣言されている要素や属性の名前空間のURI，およびスキーマ文書名を空白で区切って指定します。

上記の例では，スキーマ文書としてpurchaseOrder.xsdを，スキーマ文書purchaseOrder.xsd内で宣言されている要素や属性の名前空間として"http://www.myshopping.com/schema/purchaseOrder"を指定しています。

4.5　Shift_JIS切り替え機能のプロパティの使用方法

Shift_JIS切り替え機能を使用するためには，XML Processorが独自に規定する次のプロパティを設定する必要があります。

プロパティの値には，文字エンコーディングを設定します。設定するプロパティの値とその意味を次の表に示します。

表4‒5　設定するプロパティの値とその意味（Shift_JIS切り替え機能）

プロパティに設定する値※1

意味

SJIS

SJISエンコーディングを適用する。

MS932

MS932エンコーディングを適用する。

その他の文字列

指定を無視する。※2

注※1

指定された文字列は，大文字・小文字を区別しません。

注※2

指定が無視された場合は，直前に指定されたエンコーディングが有効となります。

注意事項

Shift_JIS切り替え機能の指定がない場合，デフォルトではSJISエンコーディングとなります。

Shift_JIS切り替え機能のプロパティは，次に示すクラス，インタフェースのインスタンスごとに設定する必要があります。Shift_JIS切り替え機能の設定用メソッドを次の表に示します。次の表では，プロパティの設定に使用するメソッドを，クラス，インタフェースごとに示しています。

表4‒6　Shift_JIS切り替え機能の設定用メソッド

クラス，インタフェース

メソッド

javax.xml.parsers.DocumentBuilderFactory

setAttribute

javax.xml.parsers.SAXParser

setProperty

org.xml.sax.XMLReader

setProperty

javax.xml.parsers.TransformerFactory

setAttribute

DOMパーサ，SAXパーサ，およびXSLTトランスフォーマでShift_JIS切り替え機能を使用する場合について，例を用いて説明します。

4.5.1　DOMパーサでShift_JIS切り替え機能を使用する方法

DOMパーサでShift_JIS切り替え機能を使用する基本的なコーディングの流れについて説明します。

コーディング例について次に説明します。各項番はコーディング例のコメントに記述している番号に対応しています。

DocumentBuilderFactoryを作成します。

javax.xml.parsers.DocumentBuilderFactoryのstaticメソッドnewInstance()を使用してファクトリを作成します。

Shift_JISをMS932に切り替えます。

DOMパーサの設定用メソッドsetAttributeの第一引数に設定キーhttp://cosminexus.com/xml/properties/shift_jis_mapを，第二引数にMS932を指定します。

DocumentBuilderを作成します。

newDocumentBuilder()メソッドを使用して，DocumentBuilderを作成します。

4.5.2　SAXパーサでShift_JIS切り替え機能を使用する方法

SAXパーサでShift_JIS切り替え機能を使用する基本的なコーディングの流れについて説明します。コーディング例を次に示します。

コーディング例について次に説明します。各項番はコーディング例のコメントに記述している番号に対応しています。

SAXParserFactoryを作成します。

javax.xml.parsers.SAXParserFactoryのstaticメソッドnewInstance()を使用してファクトリを作成します。

SAXParserを作成します。

newSAXParser()を使用してSAXパーサを作成します。

XMLReaderを取得します。

getXMLReader()を使用してXMLReaderを取得します。

Shift_JISをMS932に切り替えます。

SAXパーサの設定用メソッドsetPropertyの第一引数に設定キーhttp://cosminexus.com/xml/properties/shift_jis_mapを，第二引数にMS932を指定します。

4.5.3　XSLTトランスフォーマでShift_JIS切り替え機能を使用する方法

XSLTトランスフォーマでShift_JIS切り替え機能を使用する基本的なコーディングの流れについて説明します。コーディング例を次に示します。

コーディング例について次に説明します。各項番はコーディング例のコメントに記述している番号に対応しています。

TransformerFactoryを作成します。

javax.xml.transform.TransformerFactoryのstaticメソッドnewInstance()を使用してファクトリを作成します。

Shift_JISをMS932に切り替えます。

XSLTトランスフォーマファクトリの設定用メソッドsetAttributeの第一引数に設定キーhttp://cosminexus.com/xml/properties/shift_jis_mapを，第二引数にMS932を指定します。

Transformerを作成します。

newTransformer()メソッドを使用して，トランスフォーマを作成します。

4.6　高速パース機能のプロパティの使用方法

高速パース機能を使用するためには，XML Processorが独自に規定する次のプロパティを設定する必要があります。

プロパティの値には，nullまたはPreparsedObjectオブジェクトを設定します。設定するプロパティの値とその意味を次の表に示します。

表4‒7　設定するプロパティの値とその意味（高速パース機能）

プロパティに設定する値※

意味

null

解析時に解析結果オブジェクトを使用しない。

PreparsedObjectオブジェクト

解析時に，指定した解析結果オブジェクトを使用する。

注※

指定が省略された場合は，nullが指定されたものとして扱います。

また，nullおよびPreparsedObjectオブジェクト以外の値が設定された場合は，プロパティが設定されているXMLパーサによって，次の例外が発生します。

DocumentBuilderFactoryの場合：IllegalArgumentException

SAXParserまたはXMLReaderの場合：SAXNotSupportedException

高速パース機能のプロパティは，次に示すXMLパーサのオブジェクトごとに設定する必要があります。解析結果オブジェクトの設定用メソッドを次の表に示します。次の表では，プロパティの設定に使用するメソッドを，クラス，インタフェースごとに示しています。

表4‒8　解析結果オブジェクトの設定用メソッド

クラス，インタフェース

メソッド

javax.xml.parsers.DocumentBuilderFactory

setAttribute

javax.xml.parsers.SAXParser

setProperty

org.xml.sax.XMLReader

setProperty

DocumentBuilder，SAXParser，およびXMLReaderで高速パース機能を使用する場合について，例を用いて説明します。

4.6.1　DocumentBuilderに解析結果オブジェクトを設定する方法

DocumentBuilderに解析結果オブジェクトを設定する場合のコーディング例を次に示します。

コーディング例について次に説明します。各項番はコーディング例のコメントに記述している番号に対応しています。

解析結果オブジェクトを生成します。

解析結果オブジェクトを生成する方法については，「3.4.4　解析結果オブジェクトの生成」を参照してください。

DocumentBuilderに解析結果オブジェクトを設定します。

解析結果オブジェクトの設定用メソッドsetAttributeの第一引数に設定キーhttp://cosminexus.com/xml/properties/preparsedobject-loadを，第二引数にPreparsedObjectオブジェクトを示すpobjを指定します。

4.6.2　SAXParserに解析結果オブジェクトを設定する方法

SAXParserに解析結果オブジェクトを設定する場合のコーディング例を次に示します。

解析結果オブジェクトを生成します。

解析結果オブジェクトを生成する方法については，「3.4.4　解析結果オブジェクトの生成」を参照してください。

SAXParserに解析結果オブジェクトを設定します。

解析結果オブジェクトの設定用メソッドsetPropertyの第一引数に設定キーhttp://cosminexus.com/xml/properties/preparsedobject-loadを，第二引数にPreparsedObjectオブジェクトを示すpobjを指定します。

4.6.3　XMLReaderに解析結果オブジェクトを設定する方法

XMLReaderに解析結果オブジェクトを設定する場合のコーディング例を次に示します。

解析結果オブジェクトを生成します。

解析結果オブジェクトを生成する方法については，「3.4.4　解析結果オブジェクトの生成」を参照してください。

XMLReaderに解析結果オブジェクトを設定します。

解析結果オブジェクトの設定用メソッドsetPropertyの第一引数に設定キーhttp://cosminexus.com/xml/properties/preparsedobject-loadを，第二引数にPreparsedObjectオブジェクトを示すpobjを指定します。

4.7　セキュアプロセッシング機能のフィーチャー，プロパティを使用する

JAXPで規定されたフィーチャーを設定することによって，セキュアプロセッシング機能を使用することができます。フィーチャーの一覧を次の表に示します。フィーチャーの詳細については，JSR 206 JavaTM API for XML Processing(JAXP) 1.4を参照してください。

表4‒9　セキュアプロセッシング機能のフィーチャー一覧

項番

フィーチャー名

1

http://javax.xml.XMLConstants/feature/secure-processing

Cosminexus XML Processorでセキュアプロセッシング機能の制限値を指定するプロパティの一覧を次の表に示します。

機能の詳細は，「3.8　セキュアプロセッシング機能」を参照してください。

表4‒10　セキュアプロセッシング機能のプロパティ一覧

項番

プロパティ名

1

http://cosminexus.com/xml/properties/entityExpansionLimit

2

http://cosminexus.com/xml/properties/maxGeneralEntitySizeLimit

3

http://cosminexus.com/xml/properties/maxParameterEntitySizeLimit

4

http://cosminexus.com/xml/properties/totalEntitySizeLimit

5

http://cosminexus.com/xml/properties/maxOccurLimit

4.8　JAXBのプロパティの使用方法

JAXBではMarshallerにプロパティを設定できます。XML ProcessorがサポートしているJAXBのプロパティを次に示します。

XML ProcessorがサポートしているJAXBのプロパティ

jaxb.encoding

jaxb.formatted.output

jaxb.schemaLocation

jaxb.noNamespaceSchemaLocation

jaxb.fragment

プロパティの詳細については，JSR 222 The Java Architecture for XML Binding(JAXB) 2.2のChapter 4.5.2. Marshalling Propertiesおよびjavadocを参照してください。

また，jaxb.encodingに指定できる文字コードについては，「1.3.2　処理できる文字コード」を参照してください。

Marshallerに対してプロパティを設定するには，javax.xml.bind.MarshallerクラスのsetPropertyメソッドを使用します。プロパティの設定方法を次に示します。

5　プログラムの作成方法

この章では，プログラム作成の流れ，使用するパッケージ，およびJAXPの主な機能を用いたサンプルプログラムについて説明します。

5.1　プログラム作成の流れ

5.1.1　XML Processorを使用したプログラムの作成の流れ

XML Processorを使用したプログラムの作成の流れを次の図に示します。

図5‒1　XML Processorを使用したプログラム作成の流れ

(1)　使用するパッケージを決定する

XML Processorは，JAXP仕様で規定されたパッケージ，XSLTCトランスフォーマ機能のパッケージ，およびJAXB仕様で規定されたパッケージを提供しています。プログラムを作成する際には，そのプログラムの用途に適したパッケージを選択してください。

例えば，読み込んだXML文書をメモリ上に保持し，その構造を変更したり，複雑な操作をしたりする必要がある場合はDOMを，対話的にXML文書を解析しながら処理をする場合はSAXを使用します。また，XML文書をHTMLなどに変換する場合は，XSLTを使用します。

JAXP仕様で規定されたパッケージについては「2.2　JAXPが規定するパッケージとその機能」を，XSLTCトランスフォーマ機能のパッケージについては「3.2.3　XSLTCトランスフォーマで使用するクラス」を，JAXB仕様で規定されたパッケージについては「2.4　JAXBが規定するパッケージとその機能」を参照してください。

(2)　ソースファイルを作成する

使用するパッケージの決定後，それぞれのパッケージに含まれるクラスやインタフェースを使用して，ソースファイルを作成します。

(3)　実行ファイルを作成する

作成したソースファイルから実行ファイルを作成します。

実行ファイルを作成するには，作成したソースファイルをjavacコマンドでコンパイルし，使用するクラスやインタフェースに必要なライブラリをリンクする必要があります。

(4)　プログラムを実行する

コンパイルしたプログラムを実行します。

5.2　XML Processorが使用しているパッケージ名

XML Processorは，次の名称で始まるパッケージ名を使用しています。

com.cosminexus.jaxp.

com.cosminexus.jaxb.

com.cosminexus.stax.

com.sun.istack.

com.sun.xml.bind.

com.sun.xml.bind.api.

com.sun.xml.bind.marshaller.

com.sun.xml.bind.v2.model.annotation.

com.sun.xml.bind.v2.model.core.

com.sun.xml.bind.v2.model.runtime.

org.apache.xerces.util.

注意事項

ユーザプログラムのパッケージ名は，上記の名称で始まらないようにしてください。

5.3　プログラム実行時のトラブルシュート

XML Processorを使用したシステムを運用する場合，システム管理者への連絡が必要になるような障害や，対処方法が不明な障害が発生した場合の障害調査資料として，アプリケーションログには次の情報を採取しておく必要があります。

障害発生時時刻

障害発生時の入力となったXML文書名（スキーマ文書名，スタイルシート名含む）

上記のアプリケーションログと同時に，次に示す障害情報を取得した上，システム管理者に連絡してください。

アプリケーションログファイル

障害発生時の入力となったXML文書（スキーマ文書，スタイルシート含む）

障害発生時に出力されたXML Processorのエラーメッセージ

サーバ，およびクライアントに設定したシステムプロパティとシステムクラスパス

サーバ，およびクライアントの標準出力と標準エラー出力

Component Container，およびWebサーバのログ

Component Containerで規定する障害時取得情報

Component Containerで規定する障害時取得情報を次に示します。

J2EEサーバのユーザ定義ファイル

J2EEサーバの保守情報

サーバ管理コマンドのユーザ定義ファイル

サーバ管理コマンドの保守情報

J2EEサーバの標準出力，標準エラー出力

J2EEサーバ側のTPBrokerのログ

EJBクライアントアプリケーションに設定したシステムプロパティ，およびシステムクラスパス

EJBクライアントアプリケーションの標準出力，標準エラー出力

ネットワークモニタツールで採取したパケットの内容

Component Containerで規定する障害時取得情報の取得方法については，マニュアル「アプリケーションサーバ 機能解説 保守／移行編」の「2.3　資料の取得」を参照してください。

5.4　DOMパーサを使用するサンプルプログラム

この節では，DOMパーサを使用するサンプルプログラムについて説明します。

サンプルプログラムは，Windowsの場合だけ提供します。

サンプルプログラムのインストール先，ファイル名は次のとおりです。

インストール先

＜XML Processorをインストールしたフォルダ＞¥samples¥DOM

ファイル名

SampleDOM.java

5.4.1　サンプルプログラムの処理

サンプルプログラムは次のような処理を行います。

商品の情報について記述したDOMツリーを新規に作成します。

作成したDOMツリーをXML文書に変換・出力します。

出力したXML文書を読み込みます。

読み込んだXML文書から，商品の合計金額を画面に出力します。

5.4.2　サンプルプログラムの作成の流れ

DOMパーサを使用するサンプルプログラムの作成の流れを次の図に示します。

図5‒2　DOMパーサを使用するサンプルプログラムの作成の流れ

Documentオブジェクトを作成します。

Documentオブジェクトを新規に作成します。

Documentノードを作成します。

1.で作成したDocumentオブジェクトを使用してDOMツリーの親となるDocumentノードを作成します。

Elementノードを作成します。

必要となる要素ノードをDocumentノードから作成し，DOMツリーを作成します。

Textノードを作成します。

要素の内容となる文字列を作成します。

5.4.3　サンプルプログラム（SampleDOM.java）

サンプルプログラムを次に示します。

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.xml.sax.SAXException;
import org.w3c.dom.*;

public class SampleDOM
{
  public static final void main(String[] args)
  {
    try{
      new SampleDOM().CreateXMLFile();
      new SampleDOM().GetStringFromXML();
    }catch(Exception exception){
      exception.printStackTrace();
    }
  }

  //XMLファイルを作成する
  public final void CreateXMLFile()
  {
    try{
      DocumentBuilderFactory dbf =
          DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();

      Document doc = db.newDocument();
      Element parent = doc.createElement("伝票");

      Element sub = doc.createElement("商品");
      Element leaf1 = doc.createElement("商品名");
      Element leaf2 = doc.createElement("単価");
      Element leaf3 = doc.createElement("数量");
      leaf1.appendChild(doc.createTextNode("テレビ"));
      sub.appendChild(leaf1);
      leaf2.appendChild(doc.createTextNode("15000"));
      sub.appendChild(leaf2);
      leaf3.appendChild(doc.createTextNode("14"));
      sub.appendChild(leaf3);
      parent.appendChild(sub);

      sub = doc.createElement("商品");
      leaf1 = doc.createElement("商品名");
      leaf2 = doc.createElement("単価");
      leaf3 = doc.createElement("数量");
      leaf1.appendChild(doc.createTextNode("ラジオ"));
      sub.appendChild(leaf1);
      leaf2.appendChild(doc.createTextNode("3500"));
      sub.appendChild(leaf2);
      leaf3.appendChild(doc.createTextNode("6"));
      sub.appendChild(leaf3);
      parent.appendChild(sub);

      sub = doc.createElement("商品");
      leaf1 = doc.createElement("商品名");
      leaf2 = doc.createElement("単価");
      leaf3 = doc.createElement("数量");
      leaf1.appendChild(doc.createTextNode("ビデオ"));
      sub.appendChild(leaf1);
      leaf2.appendChild(doc.createTextNode("21000"));
      sub.appendChild(leaf2);
      leaf3.appendChild(doc.createTextNode("4"));
      sub.appendChild(leaf3);
      parent.appendChild(sub);

      doc.appendChild(parent);

      OutputStream os =
          new BufferedOutputStream(
          new FileOutputStream("SampleDOM.xml"));
      TransformerFactory tf =
          TransformerFactory.newInstance();
      Transformer tran = tf.newTransformer();
      tran.setOutputProperty("encoding", "Shift_JIS");
      tran.setOutputProperty("indent", "yes");
      tran.transform(new DOMSource(doc),
          new StreamResult(os));

      os.flush();
      os.close();

    }catch(ParserConfigurationException e){
      e.printStackTrace();
    }catch(TransformerConfigurationException e){
      e.printStackTrace();
    }catch(TransformerException e){
      e.printStackTrace();
    }catch(IOException e){
      e.printStackTrace();
    }
  }

  //CreateXMLFileで作成したXMLファイルからデータを取得して計算する
  public final void GetStringFromXML()
  {
    try{
      int tvPrice = 0;
      int radioPrice = 0;
      int videoPrice = 0;

      DocumentBuilderFactory factory =
          DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();

      Document doc = builder.parse("SampleDOM.xml");
      Element element1 = doc.getDocumentElement();
      NodeList nodelist1 = element1.getElementsByTagName("商品");

      //商品の数だけループをまわす
      for(int nShouhin = 0 ;
          nShouhin < nodelist1.getLength() ; nShouhin++){
        String str = new java.lang.String();
        int price = 0;
        int number = 0;
        Element element2 = (Element)nodelist1.item(nShouhin);

        //商品名の取得
        NodeList nodelist2 =
            element2.getElementsByTagName("商品名");
        Node node1 = nodelist2.item(0);
        if(node1.getNodeType() == Node.ELEMENT_NODE){
          Element element3 = (Element)node1;
          NodeList nodelist3 = element3.getChildNodes();
          Node node2 = nodelist3.item(0);
          str = node2.getNodeValue();
        }

        //商品名に対する単価の取得
        nodelist2 = element2.getElementsByTagName("単価");
        node1 = nodelist2.item(0);
        if(node1.getNodeType() == Node.ELEMENT_NODE){
          Element element3 = (Element)node1;
          NodeList nodelist3 = element3.getChildNodes();
          Node node2 = nodelist3.item(0);
          price = Integer.parseInt(node2.getNodeValue());
        }

        //商品名に対する数量の取得
        nodelist2 = element2.getElementsByTagName("数量");
        node1 = nodelist2.item(0);
        if(node1.getNodeType() == Node.ELEMENT_NODE){
          Element element3 = (Element)node1;
          NodeList nodelist3 = element3.getChildNodes();
          Node node2 = nodelist3.item(0);
          number = Integer.parseInt(node2.getNodeValue());
        }

        //各商品の小計を計算する
        if(str.equals("テレビ")){
          tvPrice = price * number;
        }else if(str.equals("ラジオ")){
          radioPrice = price * number;
        }else if(str.equals("ビデオ")){
          videoPrice = price * number;
        }
      }
      int sum = tvPrice + radioPrice + videoPrice;
      System.out.println("合計は" + sum + "円です。");
    }catch(ParserConfigurationException e){
      e.printStackTrace();
    }catch(SAXException e){
      e.printStackTrace();
    }catch(IOException e){
      e.printStackTrace();
    }
  }
}

5.4.4　サンプルプログラム（SampleDOM.java）の実行結果

このサンプルプログラムの実行結果は標準出力，およびSampleDOM.xmlに出力されます。

標準出力の内容

$  合計は315000円です。

SampleDOM.xmlに出力される内容

<?xml version="1.0" encoding="Shift_JIS"?>
<伝票>
<商品>
<商品名>テレビ</商品名>
<単価>15000</単価>
<数量>14</数量>
</商品>
<商品>
<商品名>ラジオ</商品名>
<単価>3500</単価>
<数量>6</数量>
</商品>
<商品>
<商品名>ビデオ</商品名>
<単価>21000</単価>
<数量>4</数量>
</商品>
</伝票>

5.5　SAXパーサを使用するサンプルプログラム

この節では，SAXパーサを使用するサンプルプログラムについて説明します。

サンプルプログラムは，Windowsの場合だけ提供します。

サンプルプログラムのインストール先，ファイル名は次のとおりです。

インストール先

＜XML Processorをインストールしたフォルダ＞¥samples¥SAX

ファイル名

SampleSAX.xml

SampleSAX.java

5.5.1　サンプルプログラムの処理

サンプルプログラムは次のような処理を行います。

商品の情報について記述したXML文書を読み込みます。

読み込んだXML文書から，商品の合計金額を画面に出力します。

5.5.2　サンプルプログラムの作成の流れ

SAXパーサを使用するサンプルプログラムの作成の流れを次の図に示します。

図5‒3　SAXパーサを使用するサンプルプログラムの作成の流れ

コールバック用ハンドラを作成します。

SAXパーサを使用して解析を開始すると，SAXパーサからXML文書内の情報が通知されます。これを受け取るための，コールバック用ハンドラを作成します。

コールバック用ハンドラをSAXパーサに登録します。

1.で作成したコールバック用ハンドラをSAXパーサに登録します。

XML文書をSAXパーサに渡して解析します。

XML文書を解析します。

SAXパーサが呼び出すメソッド

SAXパーサが呼び出すメソッドを次の図に示します。

5.5.3　使用するXML文書（SampleSAX.xml）

使用するXML文書を次に示します。

<?xml version="1.0" encoding="Shift_JIS"?>
<伝票>
  <商品>
    <商品名>テレビ</商品名>
    <単価>15000</単価>
    <数量>14</数量>
  </商品>
  <商品>
    <商品名>ラジオ</商品名>
    <単価>3500</単価>
    <数量>6</数量>
  </商品>
  <商品>
    <商品名>ビデオ</商品名>
    <単価>21000</単価>
    <数量>4</数量>
  </商品>
</伝票>

5.5.4　サンプルプログラム（SampleSAX.java）

サンプルプログラムを次に示します。

import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.xml.sax.SAXException;
import java.io.*;

public class SampleSAX{

  public static final void main(String[] args){
    try{
      SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser parser = factory.newSAXParser();
      String xml = "SampleSAX.xml";
      DefaultHandler handler = new EventHandler();

      parser.parse(xml, handler);
    }catch(ParserConfigurationException e){
      e.printStackTrace();
    }catch(IOException e){
      e.printStackTrace();
    }catch(SAXException e){
      e.printStackTrace();
    }
  }
}

//合計金額を計算して出力する
class EventHandler extends DefaultHandler{

  int     tvPrice;        //テレビ単価
  int     radioPrice;     //ラジオ単価
  int     videoPrice;     //ビデオ単価
  int     tvNum;          //テレビ数量
  int     radioNum;       //ラジオ数量
  int     videoNum;       //ビデオ数量
  boolean tvFlag;         //テレビ用フラグ
  boolean radioFlag;      //ラジオ用フラグ
  boolean videoFlag;      //ビデオ用フラグ
  boolean tankaFlag;      //単価タグ内用フラグ
  boolean volFlag;        //数量タグ内用フラグ
  boolean nameFlag;       //商品名タグ内用フラグ

  String str;             //要素内容の文字列
  StringBuffer buffer;    //要素内容の文字列連結用バッファ

  //XMLの開始通知イベント
  public void startDocument(){
    tvPrice = 0;
    radioPrice = 0;
    videoPrice = 0;
    tvNum = 0;
    radioNum = 0;
    videoNum = 0;
    tvFlag = false;
    radioFlag = false;
    videoFlag = false;
    tankaFlag = false;
    volFlag = false;
    nameFlag = false;
  }

  //XMLの終了通知イベント
  public void endDocument(){
    int sum = tvNum * tvPrice + radioNum * radioPrice +
        videoNum * videoPrice;
    System.out.println("合計は" + sum + "円です。");
  }

  //エレメント開始(タグの開始)通知イベント
  public void startElement(String nameSpace, String localName,
      String modName, Attributes attr){
    buffer = new StringBuffer();
    if(modName.equals("単価")){
      tankaFlag = true;
    }
    if(modName.equals("数量")){
      volFlag = true;
    }
    if(modName.equals("商品名")){
      nameFlag = true;
    }
  }

  //エレメント終了(タグの終了)通知イベント
  public void endElement(String nameSpace, String localName,
      String modName){
    str = buffer.toString();
    if(nameFlag == true){
      if(str.equals("テレビ")){
        tvFlag = true;
      }
      if(str.equals("ラジオ")){
        radioFlag = true;
      }
      if(str.equals("ビデオ")){
        videoFlag = true;
      }
    }else if(tvFlag == true){
      if(tankaFlag == true){
        //テレビの単価をセット
        tvPrice = Integer.parseInt(str);
      }else if(volFlag == true){
        //テレビの数量をセット
        tvNum = Integer.parseInt(str);
      }
    }else if(radioFlag == true){
      if(tankaFlag == true){
        //ラジオの単価をセット
        radioPrice = Integer.parseInt(str);
      }else if(volFlag == true){
        //ラジオの数量をセット
        radioNum = Integer.parseInt(str);
      }
    }else if(videoFlag == true){
      if(tankaFlag == true){
        //ビデオの単価をセット
        videoPrice = Integer.parseInt(str);
      }else if(volFlag == true){
        //ビデオの数量をセット
        videoNum = Integer.parseInt(str);
      }
    }
    if(modName.equals("単価")){
      tankaFlag = false;
    }
    if(modName.equals("数量")){
      volFlag = false;
    }
    if(modName.equals("商品名")){
      nameFlag = false;
    }
    if(modName.equals("商品")){
      tvFlag = false;
      radioFlag = false;
      videoFlag = false;
    }
  }

  //文字列通知イベント
  public void characters(char[] ch, int start, int length){
    buffer.append(ch, start, length);
  }
}

5.5.5　サンプルプログラム（SampleSAX.java）の実行結果

このサンプルプログラムの実行結果は標準出力に出力されます。標準出力の内容を次に示します。

$  合計は315000円です。

5.6　XML Schemaを使用するサンプルプログラム

この節では，XML Schemaを使用するサンプルプログラムについて説明します。

サンプルプログラムは，Windowsの場合だけ提供します。

サンプルプログラムのインストール先，ファイル名は次のとおりです。

インストール先

＜XML Processorをインストールしたフォルダ＞¥samples¥XMLSchema

ファイル名

purchaseOrder.xml

purchaseOrder-fail.xml

purchaseOrder.xsd

personalData.xsd

SampleValidateDOM.java

SampleValidateSAX.java

5.6.1　サンプルプログラムの処理

サンプルプログラムでは，XML文書として作成された注文明細書の妥当性を検証します。注文明細書は顧客の個人データを共有して使用しているため，注文明細書のスキーマ文書は，個人データのスキーマ文書を読み込みます。なお，スキーマ文書はJavaプログラム内で特定します。

XML Schemaを使用するサンプルプログラムの処理の流れを次の図に示します。

図5‒4　XML Schemaを使用するサンプルプログラムの処理の流れ

サンプルプログラムは次のような処理を行います。

スキーマ文書purchaseOrder.xsdを読み込みます。

purchaseOrder.xsdは，商品の注文明細書を規定するスキーマ文書です。

purchaseOrder.xsdは，スキーマ文書personalData.xsdを読み込みます。

personalData.xsdは，注文した顧客の個人データを規定するスキーマ文書で，purchaseOrder.xsdとは異なる対象名前空間を持ちます。

XML文書purchaseOrder.xml（またはpurchaseOrder-fail.xml）を読み込みます。

purchaseOrder.xml，およびpurchaseOrder-fail.xmlは，検証されるXML文書となる注文明細書です。

XML文書の妥当性を検証します。

XML文書がスキーマ文書に対して妥当な場合は「Validation OK」，妥当ではない場合はメッセージとともに「Validation NG」と標準出力に表示します。

5.6.2　使用するXML文書（purchaseOrder.xml，purchaseOrder-fail.xml）

XML Processorは，XML Schemaによる検証の対象として，次の2種類のXML文書を提供します。

検証に成功するXML文書（purchaseOrder.xml）

検証に失敗するXML文書（purchaseOrder-fail.xml）

(1)　XML文書（purchaseOrder.xml）

検証に成功するXML文書（purchaseOrder.xml）を次に示します。

<?xml version="1.0"?>
<po:purchaseOrder
    xmlns:po="http://www.myshopping.com/schema/purchaseOrder"
    xmlns:psd="http://www.myshopping.com/schema/personalData">
  <po:shipTo age="20">
    <psd:firstName>John</psd:firstName>
    <psd:familyName>Doe</psd:familyName>
    <psd:occupation>accountant</psd:occupation>
    <psd:email>johnD@bpl.com</psd:email>
    <psd:tel>050-1234-1234</psd:tel>
    <psd:address country="US">
      <psd:street>Universal street 100</psd:street>
      <psd:city>Carson</psd:city>
      <psd:state>Nevada</psd:state>
      <psd:zip>10-456</psd:zip>
    </psd:address>
  </po:shipTo>
  <po:billTo age="20">
    <psd:firstName>Jane</psd:firstName>
    <psd:familyName>Doe</psd:familyName>
    <psd:occupation>lawyer</psd:occupation>
    <psd:email>janeD@bpl.com</psd:email>
    <psd:tel>033-1111-2345</psd:tel>
    <psd:address country="US">
      <psd:street>Times Square 555</psd:street>
      <psd:city>New York</psd:city>
      <psd:state>New York</psd:state>
      <psd:zip>155-5600</psd:zip>
    </psd:address>
    <po:credit year="2007" month="10">
      <po:creditHolder>Jane Doe</po:creditHolder>
      <po:creditNumber>1111444422229999</po:creditNumber>
      <po:creditCompany>CardCompanyA</po:creditCompany>
    </po:credit>
  </po:billTo>
  <po:items>
    <po:item>
      <po:productName
          productID="DTPC2000S">DeskTop PC</po:productName>
      <po:quantity>1</po:quantity>
      <po:price>1500</po:price>
      <po:shipDate>2004-05-20</po:shipDate>
    </po:item>
    <po:item>
      <po:productName
          productID="DC500MP">Digital Camera</po:productName>
      <po:quantity>1</po:quantity>
      <po:price>450</po:price>
      <po:shipDate>2004-05-20</po:shipDate>
    </po:item>
    <po:item>
      <po:productName
          productID="LP800S">Printer</po:productName>
      <po:quantity>1</po:quantity>
      <po:price>200</po:price>
      <po:shipDate>2004-05-20</po:shipDate>
    </po:item>
  </po:items>
</po:purchaseOrder>

(2)　XML文書（purchaseOrder-fail.xml）

検証に失敗するXML文書（purchaseOrder-fail.xml）の一部を次に示します。

         :
         :
    <po:credit year="2007" month="10">
      <po:creditHolder>Jane Doe</po:creditHolder>
      <po:creditNumber>111144442222999955</po:creditNumber>
      <po:creditCompany>CardCompanyA</po:creditCompany>
    </po:credit>
         :
         :

このXML文書は，<po:creditNumber>で始まるクレジット番号の定義以外は「5.6.2(1)　XML文書（purchaseOrder.xml）」と同じです。<po:creditNumber>で始まるクレジット番号の値として18桁の数字を使用していますが，サンプルのスキーマ文書ではクレジット番号を16桁で規定しているため，検証時にエラーとなります。

5.6.3　使用するスキーマ文書（purchaseOrder.xsd，personalData.xsd）

このサンプルでは，スキーマ文書として，purchaseOrder.xsdおよびpersonalData.xsdを使用します。

(1)　スキーマ文書での各名前空間の関係

purchaseOrder.xsd，およびpersonalData.xsdでの各名前空間の関係を次の図に示します。それぞれの矢印は，参照する型定義や要素などが定義された対象名前空間を指しています。

図5‒5　スキーマ文書の名前空間の関係

(2)　スキーマ文書（purchaseOrder.xsd）

使用するスキーマ文書（purchaseOrder.xsd）を次に示します。

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.myshopping.com/schema/purchaseOrder"
  xmlns:po="http://www.myshopping.com/schema/purchaseOrder"
  xmlns:psd="http://www.myshopping.com/schema/personalData">

<xsd:import
  namespace="http://www.myshopping.com/schema/personalData"
  schemaLocation="personalData.xsd"/>

<xsd:element name="purchaseOrder" type="po:purchaseOrderType"/>
<xsd:element name="shipTo" type="psd:personalDataType"/>
<xsd:element name="billTo" type="po:billToPersonalDataType"/>
<xsd:element name="items" type="po:itemsType">
  <xsd:key name="productID_unique">
    <xsd:selector xpath="po:item/po:productName"/>
    <xsd:field xpath="@productID"/>
  </xsd:key>
</xsd:element>

<xsd:element name="item" type="po:itemType"/>
<xsd:element name="productName" type="po:productNameType"/>
<xsd:element name="quantity">
  <xsd:simpleType>
    <xsd:restriction base="xsd:positiveInteger">
      <xsd:maxExclusive value="100"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>

<xsd:element name="price" type="xsd:positiveInteger"/>
<xsd:element name="shipDate" type="xsd:date"/>
<xsd:element name="credit" type="po:creditType"/>
<xsd:element name="creditHolder" type="xsd:string"/>
<xsd:element name="creditNumber">
  <xsd:simpleType>
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="¥d{16}"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>

<xsd:element name="creditCompany">
  <xsd:simpleType>
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="CardCompanyA"/>
      <xsd:enumeration value="CardCompanyB"/>
      <xsd:enumeration value="CardCompanyC"/>
      <xsd:enumeration value="CardCompanyD"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>

<xsd:complexType name="purchaseOrderType">
  <xsd:sequence>
    <xsd:element ref="po:shipTo"/>
    <xsd:element ref="po:billTo"/>
    <xsd:element ref="po:items"/>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="billToPersonalDataType">
  <xsd:sequence>
    <xsd:group ref="psd:personalDataGroup"/>
    <xsd:element ref="po:credit"/>
  </xsd:sequence>
  <xsd:attributeGroup ref="psd:personalAttributeGroup"/>
</xsd:complexType>

<xsd:complexType name="itemsType">
  <xsd:sequence>
    <xsd:element ref="po:item"
        minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="itemType">
  <xsd:sequence>
    <xsd:element ref="po:productName"/>
    <xsd:element ref="po:quantity"/>
    <xsd:element ref="po:price"/>
    <xsd:element ref="po:shipDate"/>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="productNameType">
  <xsd:simpleContent>
    <xsd:extension base="xsd:string">
      <xsd:attribute name="productID" type="xsd:string"/>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="creditType">
  <xsd:sequence>
    <xsd:element ref="po:creditHolder"/>
    <xsd:element ref="po:creditNumber"/>
    <xsd:element ref="po:creditCompany"/>
  </xsd:sequence>
  <xsd:attribute name="year" type="po:yearType" use="required"/>
  <xsd:attribute name="month" type="po:monthType" use="required"/>
</xsd:complexType>

<xsd:simpleType name="yearType">
  <xsd:annotation>
    <xsd:documentation>
      Year set from 2004 to 2008
    </xsd:documentation>
  </xsd:annotation>
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="200[4-8]"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="monthType">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="0[1-9]|1[0-2]"/>
  </xsd:restriction>
</xsd:simpleType>

</xsd:schema>

(3)　スキーマ文書（personalData.xsd）

使用するスキーマ文書（personalData.xsd）を次に示します。

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.myshopping.com/schema/personalData"
  xmlns:psd="http://www.myshopping.com/schema/personalData">

<xsd:element name="personalData" type="psd:personalDataType"/>
<xsd:element name="firstName" type="xsd:string"/>
<xsd:element name="familyName" type="xsd:string"/>
<xsd:element name="occupation" type="xsd:string"/>
<xsd:element name="email" type="xsd:string"/>
<xsd:element name="tel" type="xsd:string"/>
<xsd:element name="address" type="psd:addressType"/>
<xsd:element name="building" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:string"/>

<xsd:complexType name="personalDataType">
  <xsd:group ref="psd:personalDataGroup"/>
  <xsd:attributeGroup ref="psd:personalAttributeGroup"/>
</xsd:complexType>

<xsd:group name="personalDataGroup">
  <xsd:sequence>
    <xsd:element ref="psd:firstName"/>
    <xsd:element ref="psd:familyName"/>
    <xsd:element ref="psd:occupation"/>
    <xsd:element ref="psd:email"/>
    <xsd:element ref="psd:tel"/>
    <xsd:element ref="psd:address"/>
  </xsd:sequence>
</xsd:group>

<xsd:attributeGroup name="personalAttributeGroup">
  <xsd:attribute name="age"
      type="xsd:positiveInteger" use="optional"/>
  <xsd:attribute name="company"
      type="xsd:string" use="optional"/>
  <xsd:attribute name="department"
      type="xsd:string" use="optional"/>
  <xsd:attribute name="title"
      type="xsd:string" use="optional"/>
  <xsd:attribute name="fax"
      type="xsd:string" use="optional"/>
</xsd:attributeGroup>

<xsd:complexType name="addressType">
  <xsd:sequence>
    <xsd:element ref="psd:building" minOccurs="0"/>
    <xsd:element ref="psd:street"/>
    <xsd:element ref="psd:city"/>
    <xsd:element ref="psd:state"/>
    <xsd:element ref="psd:zip"/>
  </xsd:sequence>
  <xsd:attribute name="country" type="xsd:string"
      use="optional" default="US"/>
</xsd:complexType>
</xsd:schema>

5.6.4　DOMパーサを使用する場合のサンプルプログラム

DOMパーサを使用してXML文書を検証する場合のサンプルプログラム，サンプルプログラムの実行方法，および実行結果について説明します。

(1)　サンプルプログラム（SampleValidateDOM.java）

DOMパーサを使用する場合のサンプルプログラム（SampleValidateDOM.java）を次に示します。

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.io.*;

public class SampleValidateDOM implements ErrorHandler{
  public static final void main(String[] argv){
    if (argv.length != 2) {
      System.out.println(
        "Usage: java SampleValidateDOM <xml_file> <schema_file>");
      System.exit(1);
    }

    try{
      DocumentBuilderFactory dbf =
        DocumentBuilderFactory.newInstance();
      dbf.setNamespaceAware(true);
      dbf.setValidating(true);
      dbf.setAttribute(
        "http://java.sun.com/xml/jaxp/properties/schemaLanguage",
        "http://www.w3.org/2001/XMLSchema");
      dbf.setAttribute(
        "http://java.sun.com/xml/jaxp/properties/schemaSource",
        argv[1]);

      DocumentBuilder db = dbf.newDocumentBuilder();
      db.setErrorHandler(new SampleValidateDOM());
      Document doc = db.parse(argv[0]);
      System.out.println("Validation OK");

    }catch(ParserConfigurationException e){
      e.printStackTrace();
    }catch(SAXParseException e){
      e.printStackTrace();
    }catch(SAXException e){
      System.out.println("Validation NG: " + e.getMessage());
    }catch(IOException e){
      e.printStackTrace();
    }
  }

  public void warning(SAXParseException exception)
      throws SAXException {
    System.out.println("**Parsing Warning**¥n" +
        "  Line:    " +
        exception.getLineNumber() + "¥n" +
        "  URI:     " +
        exception.getSystemId() + "¥n" +
        "  Message: " +
        exception.getMessage());
  }

  public void error(SAXParseException exception)
      throws SAXException {
    System.out.println("**Parsing Error**¥n" +
        "  Line:    " +
        exception.getLineNumber() + "¥n" +
        "  URI:     " +
        exception.getSystemId() + "¥n" +
        "  Message: " +
        exception.getMessage());
    throw new SAXException("Error encountered");
  }

  public void fatalError(SAXParseException exception)
      throws SAXException {
    System.out.println("**Parsing Fatal Error**¥n" +
        "  Line:    " +
        exception.getLineNumber() + "¥n" +
        "  URI:     " +
        exception.getSystemId() + "¥n" +
        "  Message: " +
        exception.getMessage());
    throw new SAXException("Fatal Error encountered");
  }
}

(2)　サンプルプログラムの実行結果

このサンプルプログラムの実行結果は標準出力に出力されます。標準出力の内容を次に示します。

検証対象にpurchaseOrder.xmlを指定した場合

Validation OK

検証対象にpurchaseOrder-fail.xmlを指定した場合

**Parsing Error**
  Line:    33
  URI:     file:///＜サンプルが格納されたフォルダ＞/purchaseOrder-fail.xml
  Message: KECX06063-E cvc-pattern-valid: Value '111144442222999955' is not facet-valid with respect to pattern '¥d{16}' for type '#AnonType_creditNumber'.
Validation NG: Error encountered

5.6.5　SAXパーサを使用する場合のサンプルプログラム

SAXパーサを使用してXML文書を検証する場合のサンプルプログラム，サンプルプログラムの実行方法，および実行結果について説明します。

(1)　サンプルプログラム（SampleValidateSAX.java）

SAXパーサを使用する場合のサンプルプログラム（SampleValidateSAX.java）を次に示します。

import javax.xml.parsers.*;
import org.xml.sax.*;
import java.io.*;

public class SampleValidateSAX implements ErrorHandler{
  public static final void main(String[] argv){
    if (argv.length != 2) {
      System.out.println(
        "Usage: java SampleValidateSAX <xml_file> <schema_file>");
      System.exit(1);
    }

    try{
      SAXParserFactory spf = SAXParserFactory.newInstance();
      spf.setNamespaceAware(true);
      spf.setValidating(true);
      SAXParser sp = spf.newSAXParser();
      sp.setProperty(
        "http://java.sun.com/xml/jaxp/properties/schemaLanguage",
        "http://www.w3.org/2001/XMLSchema");
      sp.setProperty(
        "http://java.sun.com/xml/jaxp/properties/schemaSource",
        argv[1]);

      XMLReader reader = sp.getXMLReader();
      reader.setErrorHandler(new SampleValidateSAX());
      reader.parse(argv[0]);
      System.out.println("Validation OK");

    }catch(ParserConfigurationException e){
      e.printStackTrace();
    }catch(SAXParseException e){
      e.printStackTrace();
    }catch(SAXException e){
      System.out.println("Validation NG: " + e.getMessage());
    }catch(IOException e){
      e.printStackTrace();
    }
  }

  public void warning(SAXParseException exception)
      throws SAXException {
    System.out.println("**Parsing Warning**¥n" +
        "  Line:    " +
        exception.getLineNumber() + "¥n" +
        "  URI:     " +
        exception.getSystemId() + "¥n" +
        "  Message: " +
        exception.getMessage());
  }

  public void error(SAXParseException exception)
      throws SAXException{
    System.out.println("**Parsing Error**¥n" +
        "  Line:    " +
        exception.getLineNumber() + "¥n" +
        "  URI:     " +
        exception.getSystemId() + "¥n" +
        "  Message: " +
        exception.getMessage());
    throw new SAXException("Error encountered");
  }

  public void fatalError(SAXParseException exception)
      throws SAXException {
    System.out.println("**Parsing Fatal Error**¥n" +
        "  Line:    " +
        exception.getLineNumber() + "¥n" +
        "  URI:     " +
        exception.getSystemId() + "¥n" +
        "  Message: " +
        exception.getMessage());
    throw new SAXException("Fatal Error encountered");
  }
}

(2)　サンプルプログラムの実行結果

このサンプルプログラムの実行結果は標準出力に出力されます。標準出力の内容を次に示します。

検証対象にpurchaseOrder.xmlを指定した場合

Validation OK

検証対象にpurchaseOrder-fail.xmlを指定した場合

**Parsing Error**
  Line:    33
  URI:     file:///＜サンプルが格納されたフォルダ＞/purchaseOrder-fail.xml
  Message: KECX06063-E cvc-pattern-valid: Value '111144442222999955' is not facet-valid with respect to pattern '¥d{16}' for type '#AnonType_creditNumber'.
Validation NG: Error encountered

5.7　XSLTトランスフォーマを使用するサンプルプログラム

この節では，XSLTトランスフォーマを使用するサンプルプログラムについて説明します。

サンプルプログラムは，Windowsの場合だけ提供します。

サンプルプログラムのインストール先，ファイル名は次のとおりです。

インストール先

＜XML Processorをインストールしたフォルダ＞¥samples¥XSLT

ファイル名

SampleXSLT.xml

SampleXSLT.xsl

SampleXSLT.java

5.7.1　サンプルプログラムの処理

サンプルプログラムは次のような処理を行います。

変換元のXML文書を読み込みます。

1.で読み込んだXML文書をHTMLデータへ変換します。

5.7.2　サンプルプログラムの作成の流れ

XSLTトランスフォーマを使用するサンプルプログラムの作成の流れを次の図に示します。

図5‒6　XSLTトランスフォーマを使用するサンプルプログラムの作成の流れ

TransformerFactoryインスタンスを取得します。

メソッドnewInstanceでTransformerFactoryインスタンスを取得します。

Transformerオブジェクトを作成します。

HTMLデータへの変換を行います。

Transformerオブジェクトを使用してXML文書をHTMLデータに変換します。

5.7.3　使用するXML文書（SampleXSLT.xml）

サンプルプログラムが読み込むXML文書を次に示します。

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="SampleXSLT.xsl" ?>
<START>
  <伝票>
    <商品>
      <商品名>テレビ</商品名>
      <単価>15000</単価>
      <数量>14</数量>
    </商品>
    <商品>
      <商品名>ラジオ</商品名>
      <単価>3500</単価>
      <数量>6</数量>
    </商品>
    <商品>
      <商品名>ビデオ</商品名>
      <単価>21000</単価>
      <数量>4</数量>
    </商品>
  </伝票>
</START>

5.7.4　使用するXSLファイル（SampleXSLT.xsl）

サンプルプログラムが読み込むXSLファイルを次に示します。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
  <xsl:output method="html" indent="yes" encoding="Shift_JIS"/>

  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>

  <!-- STARTをルートとして変換を開始する -->
  <xsl:template match="START">
    <HTML>
      <HEAD>
        <TITLE>XMLをHTMLのテーブルで表示する</TITLE>
      </HEAD>
      <BODY BGCOLOR="#C0C0C0">
      <FONT SIZE="5">発注伝票</FONT>
      <TABLE BORDER="2">
      <TR><TH>商品名</TH><TH>単価</TH>
          <TH>数量</TH><TH>小計</TH></TR>
      <xsl:apply-templates />
      <TR><TH>合計</TH><TD>&#160;</TD><TD>&#160;</TD>
      <TD ALIGN="RIGHT"><xsl:value-of
          select="(//商品[1]/単価 * //商品[1]/数量 +
                   //商品[2]/単価 * //商品[2]/数量 +
                   //商品[3]/単価 * //商品[3]/数量)" /></TD></TR>
      </TABLE>
      </BODY>
    </HTML>
  </xsl:template>

  <xsl:template match="伝票">
    <xsl:apply-templates />
  </xsl:template>

  <!-- 1商品で1行を作成するし，最後に小計を出力する -->
  <xsl:template match="商品">
    <TR><xsl:apply-templates />
    <TD ALIGN="RIGHT">
        <xsl:value-of select="number(単価)*number(数量)" />
    </TD></TR>
  </xsl:template>

  <!-- 商品名を出力する -->
  <xsl:template match="商品名">
    <TD><xsl:value-of select="."/></TD>
  </xsl:template>

  <!-- 単価を出力する -->
  <xsl:template match="単価">
    <TD ALIGN="RIGHT"><xsl:value-of select="."/></TD>
  </xsl:template>

  <!-- 数量を出力する -->
  <xsl:template match="数量">
    <TD ALIGN="RIGHT"><xsl:value-of select="."/></TD>
  </xsl:template>
</xsl:stylesheet>

5.7.5　サンプルプログラム（SampleXSLT.java）

サンプルプログラムを次に示します。

import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.parsers.*;

public class SampleXSLT{
  public static void main(String[] args){

    try{
      File file = new File(args[0]);

      //XMLファイルの読み込み
      Source source  = new StreamSource(file);
      Result result = new StreamResult(System.out);
      TransformerFactory factory =
          TransformerFactory.newInstance();

      //HTMLファイルへの変換
      Source style = factory.getAssociatedStylesheet(source,
          null, null, null);

      Transformer transformer = factory.newTransformer(style);
      transformer.transform(source, result);

    }catch(TransformerConfigurationException e){
      e.printStackTrace();
    }catch(TransformerException e){
      e.printStackTrace();
    }
  }
}

5.7.6　サンプルプログラム（SampleXSLT.java）の実行結果

(1)　サンプルプログラムの実行結果

このサンプルプログラムの実行結果は標準出力に出力されます。標準出力の内容を次に示します。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>XMLをHTMLのテーブルで表示する</TITLE>
</HEAD>
<BODY BGCOLOR="#C0C0C0">
<FONT SIZE="5">発注伝票</FONT>
<TABLE BORDER="2">
<TR>
<TH>商品名</TH><TH>単価</TH><TH>数量</TH><TH>小計</TH>
</TR>
<TR>
<TD>テレビ</TD>
      <TD ALIGN="RIGHT">15000</TD>
      <TD ALIGN="RIGHT">14</TD>
    <TD ALIGN="RIGHT">210000</TD>
</TR>
<TR>
<TD>ラジオ</TD>
      <TD ALIGN="RIGHT">3500</TD>
      <TD ALIGN="RIGHT">6</TD>
    <TD ALIGN="RIGHT">21000</TD>
</TR>
<TR>
<TD>ビデオ</TD>
      <TD ALIGN="RIGHT">21000</TD>
      <TD ALIGN="RIGHT">4</TD>
    <TD ALIGN="RIGHT">84000</TD>
</TR>
<TR>
<TH>合計</TH><TD>&nbsp;</TD><TD>&nbsp;</TD><TD ALIGN="RIGHT">315000</TD>
</TR>
</TABLE>
</BODY>
</HTML>

5.8　XSLTCトランスフォーマを使用するサンプルプログラム

XSLTCトランスフォーマを使用するプログラムについて説明します。

ここでは，「5.7　XSLTトランスフォーマを使用するサンプルプログラム」を変更して，XSLTCトランスフォーマ機能を使用する方法を示します。

XSLTCトランスフォーマ機能を使用する場合のプログラム変更を次の図に示します。次の図に示す変更によって，XSLTCトランスフォーマ機能を使用できます。プログラムの実行方法および実行結果は，XSLTトランスフォーマを使用する場合のサンプルプログラムと同じです。詳細は「5.7.6　サンプルプログラム（SampleXSLT.java）の実行結果」を参照してください。

注意事項

プログラム変更後も，ファイル名は変更しないでください。ファイル名を変更すると，コンパイルに失敗します。

図5‒7　XSLTCトランスフォーマ機能を使用する場合のプログラム変更

プログラムの変更個所について次に説明します。各項番はプログラムのコメントに記述している番号に対応しています。

XSLTCトランスフォーマ機能を使用するためのパッケージをインポートします。

TransformerFactoryXSLTCクラスにnewInstanceメソッドを適用して，TransformerFactoryオブジェクトを生成します。

6　XML Processor使用時の注意事項

この章では，XML Processorをご使用になる際の注意事項について説明します。

6.1　JAXP1.4機能の共通の注意事項

JAXP1.4の共通の注意事項を次の表に示します。

表6‒1　JAXP1.4の共通の注意事項

項番

注意事項

1

JAXP1.4仕様書で，引数にnullを指定したときの動作が規定されていないメソッドがあります。このようなメソッドの引数にnullを指定した場合，NullPointerException例外が発生するなど，動作結果が未定義ですので注意してください。

2

JAXP1.4仕様書が規定するメソッドで例外が発生したとき，例外オブジェクトにgetMessageメソッドを適用することで，多くの場合は詳細メッセージが得られます。ただし，詳細メッセージが必ず得られることを保証するものではありません。したがって，アプリケーションでは，詳細メッセージの内容に依存した例外処理をしないで，例外の種別に応じて適切な処理をしてください。例えば，DOMException例外の場合は，codeフィールドでエラーの詳細要因を判定してください。

3

DocumentBuilderクラスのparse(String uri)メソッドやSAXParserクラスのparse(String uri, ...)メソッドなどの引数に指定するURIは，正しい形式で指定してください。URIとして不正な文字列を指定すると，IllegalArgumentExceptionなどのRuntimeException例外が発生する場合があります。

4

DocumentBuilderクラスのparse(File f)メソッドやSAXParserクラスのparse(File f, ...)メソッドなどの引数に指定するFileオブジェクトは，引数に「%」「#」「?」を含まないFileコンストラクタで生成してください。引数にこれらの文字が含まれるFileコンストラクタで生成されたFileオブジェクトを指定すると，次に示す現象が発生する場合があります。

IllegalArgumentExceptionなどのRuntimeException例外が発生する

SAXException例外が発生する

XMLパーサの動作が不正になる

5

XML文書のエンコーディング，XML宣言のencoding擬似属性，およびInputSourceやReaderのエンコーディングは統一してください。統一されていない場合の動作は保証しません。

JAXP1.4を使用する場合は，次の表に示すクラスとメソッドは使用できません。

表6‒2　JAXP1.4で制限となるクラスとメソッド

項番

パッケージ名

クラス名

メソッド名

1

javax.xml.stream

XMLEventFactory

newInstance(String, ClassLoader)

2

XMLInputFactory

newInstance(String, ClassLoader)

3

XMLOutputFactory

newInstance(String, ClassLoader)

また，次の表に示すメソッドは，この表に示すファクトリクラス名だけを指定できます。それ以外のファクトリクラス名を指定した場合の動作は保証されません。

表6‒3　ファクトリ生成のメソッドと指定できるファクトリクラス名

項番

パッケージ名

クラス名

メソッド名

指定できるファクトリクラス名

1

javax.xml.datatype

DatatypeFactory

newInstance(String, ClassLoader)

com.cosminexus.jaxp.impl.parsers.jaxp.datatype.DatatypeFactoryImp

2

javax.xml.parsers

DocumentBuilderFactory

newInstance(String, ClassLoader)

com.cosminexus.jaxp.impl.parsers.jaxp.DocumentBuilderFactoryImpl

3

SAXParserFactory

newInstance(String, ClassLoader)

com.cosminexus.jaxp.impl.parsers.jaxp.SAXParserFactoryImpl

4

javax.xml.stream

XMLEventFactory

newFactory(String, ClassLoader)

com.cosminexus.stax.xml.stream.events.ZephyrEventFactory

5

javax.xml.stream.XMLEventFactory※

6

XMLInputFactory

newFactory(String, ClassLoader)

com.cosminexus.stax.xml.stream.ZephyrParserFactory

7

javax.xml.stream.XMLInputFactory※

8

XMLOutputFactory

newFactory(String, ClassLoader)

com.cosminexus.stax.xml.stream.ZephyrWriterFactory

9

javax.xml.stream.XMLOutputFactory※

10

javax.xml.transform

TransformerFactory

newInstance(String, ClassLoader)

com.cosminexus.jaxp.impl.transform.processor.TransformerFactoryImpl

11

javax.xml.validation

SchemaFactory

newInstance(String, String, ClassLoader)

com.cosminexus.jaxp.impl.parsers.jaxp.validation.XMLSchemaFactory

12

javax.xml.xpath

XPathFactory

newInstance(String, String, ClassLoader)

com.cosminexus.jaxp.impl.xpath.jaxp.XPathFactoryImpl

注※

Developer's Kit for Java 09-60以降でサポート

6.1.1　javax.xml.transform.stax.StAXSourceクラスおよびjavax.xml.transform.stax.StAXResultクラスのサポート範囲

XML Processorの08-50以降では，javax.xml.transform.stax.StAXSourceクラスおよびjavax.xml.transform.stax.StAXResultクラスを使用できます。

JAXP1.4およびJAXBに定義されているメソッドの一部は，javax.xml.transform.stax.StAXSourceクラスおよびjavax.xml.transform.stax.StAXResultクラス，またはこれらのクラスが持つFEATUREフィールドを引数として利用します。ただし，一部サポートしていないメソッドもあるため，サポートの有無を次の表に示します。

表6‒4　StAXSourceクラスまたはStAXResultクラスを引数に使用するメソッドのサポート状況

項番

パッケージ名

クラス名

メソッド名

サポート有無

1

javax.xml.transform

TransformerFactory

getAssociatedStylesheet

　(Source, String, String, String)

×

2

getFeature(String)

×

3

newTemplates(Source)

○

4

newTransformer(Source)

○

5

Transformer

transform(Source, Result)

○

6

javax.xml.transform.sax

SAXTransformerFactory

newTransformerHandler(Source)

×

7

newXMLFilter(Source)

○

8

SAXSource

sourceToInputSource(Source)

×

9

TransformerHandler

setResult(Result)

○

10

javax.xml.validation

SchemaFactory

newSchema(Source)

×

11

newSchema(Source[])

×

12

Validator

validate(Source)

○

13

validate(Source, Result)

○

14

javax.xml.bind

JAXB

marshal(Object, Result)

×

15

unmarshal(Source, Class<T>)

×

16

Marshaller

marshal(Object, Result)

×

17

Unmarshaller

unmarshal(Source)

×

18

unmarshal(Source, Class<T>)

×

19

javax.xml.stream

XMLOutputFactory

createXMLEventWriter(Result)

○

20

createXMLStreamWriter(Result)

○

21

XMLInputFactory

createXMLEventReader(Source)

○

22

createXMLStreamReader(Source)

○

（凡例）

○：サポートしています。

×：サポートしていません。

6.1.2　その他の注意事項

JAXP1.4について，これまで説明したもの以外の注意事項を次に示します。

参考

関連する注意事項があるため，必要に応じて「6.4　StAXに関する注意事項」も参照してください。

表6‒5　JAXP1.4使用時の注意事項

項番

注意事項

1

StAXはShift_JIS切り替え機能をサポートしていません。

Shift_JIS切り替え機能を指定したDOMパーサ，またはSAXパーサによって作成されたNode，Source，ResultなどをStAXのAPIの引数として渡した場合の動作は保証しません。

2

StAXはShift_JIS切り替え機能をサポートしていません。

XSLTまたはXSLTCトランスフォーマの入出力に，StAXSourceまたはStAXResultを使用した場合の動作は保証しません。

3

XSLTに次のフィーチャーが追加されましたが，XML Processorは常にfalseを返します。

http://javax.xml.transform.stax.StAXSource/feature

http://javax.xml.transform.stax.StAXResult/feature

6.2　DOMパーサに関する注意事項

DOMパーサに関する注意事項を次の表に示します。

表6‒6　DOMパーサに関する注意事項

項番

注意事項

1

マルチスレッドプログラミングをする場合，DocumentBuilderFactoryクラスはスレッドセーフではありません。したがって，複数のスレッドが同時に同一のDocumentBuilderFactoryインスタンスにアクセスしてはいけません。スレッド間の競合を避けるため，次のどちらかの方法を使用してください。

各スレッドに1つのDocumentBuilderFactoryインスタンスを持つ。

各スレッドが排他的にDocumentBuilderFactoryインスタンスにアクセスする。

2

マルチスレッドプログラミングをする場合，DocumentBuilderクラスはスレッドセーフではありません。したがって，複数のスレッドが同時に同一のDocumentBuilderインスタンスを使用してはいけません。スレッド間の競合を避けるため，次の方法を使用してください。

各スレッドに1つのDocumentBuilderインスタンスを持つ。

3

マルチスレッドプログラミングをする場合，DOMツリーはスレッドセーフではありません。したがって，parseメソッドによって生成された同一のDOMツリーに対して，複数のスレッドが同時にアクセスしてはいけません。更新系メソッドだけではなく，参照系メソッドでも同時にアクセスしてはいけません。スレッド間の競合を避けるため，次の方法を使用してください。

各スレッドが排他的にDOMツリーにアクセスする。

4

マルチスレッドプログラミングをする場合，org.w3c.dom，org.w3c.dom.bootstrap，org.w3c.dom.lsパッケージで規定されたオブジェクトはスレッドセーフではありません。したがって，複数のスレッドが同時にこれらのオブジェクトにアクセスしてはいけません。更新系メソッドだけではなく，参照系メソッドでも同時にアクセスしてはいけません。スレッド間の競合を避けるため，次の方法を使用してください。

各スレッドが排他的にこれらのオブジェクトにアクセスする。

5

DocumentインタフェースのcreateAttributeメソッドまたはcreateAttributeNSメソッドを使用してAttrノードを生成する場合は，AttrインタフェースのsetValueメソッドで値を設定してください。値が設定されていない状態で，NodeインタフェースのgetChildNodesメソッドでNodeListを取得した場合，そのNodeListの動作は保証しません。

6

NodeインタフェースのinsertBeforeメソッドやappendChildメソッドを使用して，すでにElementノードを持つDocumentノードに対して要素を追加する場合，NodeインタフェースのreplaceChildメソッドを使用した場合と同じ結果になります。

7

DocumentBuilderクラスの「InputStreamやInputSourceを引数とするparseメソッド」でエラーが発生したとき，エラーハンドラへ渡されるSAXParseExceptionにgetSystemIdメソッドを適用するとnullが返される場合があります。エラー発生元のシステム識別子を返すようにする場合は，parseメソッドを次のように使用してください。

parse(InputStream is, String systemId)メソッドで，システム識別子を引数systemIdに指定する。

parse(InputSource is)メソッドで，システム識別子を設定したInputSourceを引数isに指定する。

8

BOM(Byte Order Mark)付きのUTF-16で保存されたXML文書をparse(InputSource is)メソッドで解析する場合，InputSourceにsetEncodingメソッドを適用するときは引数に"UTF-16"を指定してください。

9

内部エンティティを定義する文字列中に，477文字以上の要素名が含まれていると，java.lang.IndexOutOfBoundsException例外が発生する場合があります。

6.3　SAXパーサに関する注意事項

SAXパーサに関する注意事項を次の表に示します。

表6‒7　SAXパーサに関する注意事項

項番

注意事項

1

マルチスレッドプログラミングをする場合，SAXParserFactoryクラスはスレッドセーフではありません。したがって，複数のスレッドが同時に同一のSAXParserFactoryインスタンスにアクセスしてはいけません。スレッド間の競合を避けるため，次のどちらかの方法を使用してください。

各スレッドに1つのSAXParserFactoryインスタンスを持つ。

各スレッドが排他的にSAXParserFactoryインスタンスにアクセスする。

2

マルチスレッドプログラミングをする場合，SAXParserクラスはスレッドセーフではありません。したがって，複数のスレッドが同時に同一のSAXParserインスタンスを使用してはいけません。スレッド間の競合を避けるため，次の方法を使用してください。

各スレッドに1つのSAXParserインスタンスを持つ。

3

マルチスレッドプログラミングをする場合，org.xml.sax，org.xml.sax.ext，org.xml.sax.helpersパッケージで規定されたオブジェクトはスレッドセーフではありません。したがって，複数のスレッドが同時にこれらのオブジェクトにアクセスしてはいけません。更新系メソッドだけではなく，参照系メソッドでも同時にアクセスしてはいけません。スレッド間の競合を避けるため，次の方法を使用してください。

各スレッドが排他的にこれらのオブジェクトにアクセスする。

4

SAXパーサは，1つの文字列データを複数の文字列（チャンク）に分割し，複数のcharactersイベントとしてアプリケーションに報告することが許されています。したがって，ContentHandlerの実装では，文字列データが分割されることを意識する必要があります。

ContentHandlerの実装例を次に示します。この例では，charactersイベントが発生するたびに文字列データをバッファリングしていき，endElementイベントが報告された時点で文字列データの終端と見なしています。

class MyHandler implements ContentHandler {

String str = null;

StringBuffer buffer = null;

　:

public void startElement(String uri, String localName, String qName, Attributes atts)

throws SAXException {

buffer = new StringBuffer();

}

:

public void characters(char c[], int start, int length) throws SAXException {

buffer.append(c, start, length);

}

　:

public void endElement(String uri, String name, String qname) throws SAXException {

str = buffer.toString();

}

　:

5

XMLReaderFactory クラスのcreateXMLReader(String className)メソッドを使用し，XMLReader の生成を行う場合は，引数classNameに"com.cosminexus.jaxp.impl.parsers.parsers.SAXParser"を指定してください。XMLReader の生成例を次に示します。

XMLReader reader =

XMLReaderFactory.createXMLReader("com.cosminexus.jaxp.impl.parsers.parsers.SAXParser");

6

SAXParserクラスの「InputStreamやInputSourceを引数とするparseメソッド」でエラーが発生したとき，エラーハンドラへ渡されるSAXParseExceptionにgetSystemIdメソッドを適用するとnullが返される場合があります。エラー発生元のシステム識別子を返すようにする場合は，parseメソッドを次のように使用してください。

parse(InputStream is, …, String systemId)メソッドで，システム識別子を引数systemIdに指定する。

parse(InputSource is, …)メソッドで，システム識別子を設定したInputSourceを引数isに指定する。

7

BOM(Byte Order Mark)付きのUTF-16で保存されたXML文書をparse(InputSource is, …)メソッドで解析する場合，InputSourceにsetEncodingメソッドを適用するときは引数に"UTF-16"を指定してください。

8

内部エンティティを定義する文字列中に，477文字以上の要素名が含まれていると，java.lang.IndexOutOfBoundsException例外が発生する場合があります。

9

次の両方の条件に該当する場合，java.lang.IllegalStateException例外が発生することがあります。

ValidatorHandler.getTypeInfoProviderメソッドでTypeInfoProviderオブジェクトを取得する。

SAXのendElementイベントのイベントハンドラで，1.で示すオブジェクトに対してgetElementTypeInfoメソッドを呼び出す。

6.4　StAXに関する注意事項

StAXに関する注意事項を次の表に示します。

表6‒8　StAXに関する注意事項

項番

注意事項

1

StAX1.0仕様書には，動作が明確に定義されていないメソッドがあります。動作が明確に定義されていないメソッドの動作は，実装に依存します。引数を事前に確認するなどして，未規定の動作がないように対処してください。

動作が未規定の場合の動作例を次に示します。

例1：Javadocの例外欄に示されていない種別の例外が発生する。

引数にnullを指定した場合の動作が規定されていないため，NullPointerExceptionが発生する。

例2：不当な順番でメソッドを呼び出した場合の動作が規定されていないため，例外が発生する。

XMLStreamWriterインタフェースのwriteStartDocumentメソッドを呼び出す前にwriteEndDocumentメソッドを呼び出すと，XMLStreamExceptionが発生する。

例3：矛盾が生じるような引数でメソッド呼び出しをした場合，その引数が無視される。

XMLEventFactoryインタフェースのcreateStartElement, createEndElementメソッドに引数として指定する要素名が異なると，createEndElementメソッドに指定した引数が無視される。

2

XMLStreamReaderインタフェースのメソッドの一部は，Javadocでの説明と各APIの説明との間に差異があります。XML Processorは，APIの説明に従って動作します。

説明に差異のあるメソッドと差異の内容を次に示します。

IllegalStateException例外が発生しない（Javadocでは説明なし）

getCharacterEncodingScheme()

getEncoding ()

getVersion()

getNamespaceURI()

getNamespaceURI(String prefix)

getPrefix()

standaloneSet()

isStandalone()

Javadocとは異なる例外が発生する（JavadocではIllegalStateException例外が発生）

getElementText()

nextTag()

next()

3

［条件］

XMLInputFactoryのcreateXMLStreamReader(String systemId, InputStream stream)メソッドの引数systemIdと引数streamが異なるXML文書を指す場合です。

［標準仕様］

動作の規定なし。

［XML Processorの動作］

引数streamが有効になります。

ただし，引数streamがnullの場合は，引数systemIdが有効になります。

4

［条件］

XMLInputFactoryのcreateXMLStreamReader(String systemId, Reader reader)メソッドの引数systemIdと引数readerが異なるXML文書を指す場合です。

［標準仕様］

動作の規定なし。

［XML Processorの動作］

引数readerが有効になります。

ただし，引数readerがnullの場合は，引数systemIdが有効になります。

5

［条件］

XML文書の属性宣言と名前空間宣言に対して，javax.xml.stream.XMLStreamReaderインタフェースのgetEventType()メソッドを実行する場合です。

［標準仕様］

XMLStreamReaderのJavadocには，属性と名前空間のパースに関する説明がありますが，パースによってイベントが発生するかどうかについての明確な規定はありません。

［XML Processorの動作］

ATTRIBUTEイベント型やNAMESPACEイベント型が戻されることはありません。

START_ELEMENTイベント型が戻されたときに，属性および名前空間を処理してください。

6

［条件］

XMLStreamReaderインタフェースのメソッドうち，次に示すメソッドの引数indexに，属性数または名前空間宣言数を超えた値を指定する場合です。

getAttributeLocalName(int index)

getAttributeName(int index)

getAttributeNamespace(int index)

getAttributePrefix(int index)

getAttributeType(int index)

getAttributeValue(int index)

getNamespaceURI(int index)

isAttributeSpecified(int index)

［標準仕様］

動作の規定なし。

［XML Processorの動作］

isAttributeSpecified(int index)メソッドは，戻り値がfalseになります。

それ以外のメソッドは，戻り値がnullになります。

7

［条件］

COMMENTイベント型に対しXMLStreamReaderインタフェースのgetTextCharacters(int sourceStart, char[] target, int targetStart, int length)メソッドを実行する場合です。

［標準仕様］

Javadocの説明とXMLStreamReaderの説明との間で次の差異があります。

Javadoc

CHARACTERS，SPACE，またはCDATAに関連づけられたテキストを取得。

XMLStreamReader

getTextCharacters メソッドはCOMMENTイベント型に対して有効。

［XML Processorの動作］

COMMENTイベントに関連づけられたテキストを取得します。

8

［条件］

次のすべての条件に該当する場合です。

XMLStreamWriterインタフェースのgetPrefix(String uri)メソッドを実行する。

1.の引数uriの名前空間が複数の接頭辞にバインドされている。

［標準仕様］

動作の規定なし。

［XML Processorの動作］

バインドされている接頭辞のうちの1つが戻り値となります。

9

［条件］

次のすべての条件に該当する場合です。

XMLStreamWriterインタフェースのsetPrefix(String prefix, String uri)メソッドを実行する。

1.の引数prefixの接頭辞がすでに異なる名前空間にバインドされている。

［標準仕様］

動作の規定なし。

［XML Processorの動作］

setPrefixで指定されたURIでバインド先の接頭辞を再設定します。

10

［条件］

次のすべての条件に該当する場合です。

XML文書がUTF-16BEまたはUTF-16LEでエンコードされている。

XML宣言のエンコーディング指定がUTF-16である。

XMLStreamReaderのgetEncodingメソッド，またはStartDocumentのgetCharacterEncodingSchemeメソッドを使用してXML文書のエンコーディングを取得する。

［標準仕様］

XML文書自身またはXML宣言のエンコーディングのどちらを返すのかが，規定されていません。

［XML Processorの動作］

XML宣言に指定したエンコーディングではなく，XML文書自身のエンコーディング（UTF-16BEまたはUTF-16LE）を返します。

11

［条件］

XMLEventFactoryクラスのcreateStartElementおよびcreateEndElement, createAttributeメソッドの引数に，名前空間URIを指定する場合です。

［標準仕様］

引数に指定した名前空間URIが名前空間宣言として出力XML文書に書き出されるのかどうか，規定されていません。

［XML Processorの動作］

引数に指定した名前空間URIは，名前空間宣言として出力XML文書に書き出しません。

createNamespaceメソッドを使用して，名前空間宣言を明示的に作成してください。

12

［条件］

XMLStreamReaderインタフェースを使用して，外部エンティティをパースする場合です。

［標準仕様］

外部エンティティを展開するかどうかが規定されていません。

［XML Processorの動作］

EntityReferenceイベントは生成しません。

エンティティ参照を展開したものに対するイベント（CHARACTERS, START_ELEMENTなど）を生成します。

13

XMLEventFactoryクラスのcreateAttribute(String prefix, String namespaceURI, String localName, String value)メソッドの引数prefixには，""を指定できません。

14

XMLEventFactoryクラスのcreateIgnorableSpace(String content)メソッドの引数contentには，空白以外の文字列を指定しないでください。

15

XMLInputFactoryクラスのjavax.xml.stream.isSupportingExternalEntitiesプロパティのデフォルト値はtrueです。

16

次に示すXMLInputFactoryクラスのプロパティにnullを指定するには，setEventAllocatorメソッド，setXMLReporterメソッド，またはsetXMLResolverメソッドを使用します。setPropertyメソッドは使用しないでください。

javax.xml.stream.allocator

javax.xml.stream.reporter

javax.xml.stream.resolver

17

次に示すXMLInputFactoryクラスのプロパティの指定は，javax.xml.stream.supportDTDプロパティの値にfalseが設定されていても影響されません。

javax.xml.stream.isReplacingEntityReferences

javax.xml.stream.isSupportingExternalEntities

18

［条件］

XMLEventWriterクラスのadd(XMLEventReader reader)メソッドで，入力XMLに次の要素や属性が含まれる場合，出力XMLと入力XMLとで形式が異なります。

空要素（例：<element1/>）

XML宣言のencoding属性

XML宣言のstandalone属性

［XML Processorの動作］

空要素の場合は開始タグと終了タグだけが出力される（例：<element1></element1>）。

XML宣言は<?xml version="1.0" ?>が出力される。

19

XMLEventFactoryクラスのcreateStartElementメソッドで生成したStartElementイベントに対するgetNamespaceContext()メソッドの戻り値は，nullになります。

20

ISO-10646-UCS-4エンコーディングは使用できません。

21

バージョンが1.1のXML文書は使用できません。

22

StAXでは，次の部分に補助文字を指定できません。

DTD内の公開識別子

DTD内のシステム識別子

内部解析対象実体

属性値

コメント

CData

23

Charactersイベントは，分割して報告される場合があります。

StAXパーサは，1つの文字列データを複数の文字列（チャンク）に分割して，複数のCharactersイベントとしてアプリケーションに報告することもできます。そのため，アプリケーション側では，Charactersイベントが連続して発生することを意識する必要があります。

24

［条件］

START_ELEMENT/END_ELEMENT以外のイベント型に対して，XMLStreamReaderインタフェースのgetName()メソッドを実行する場合です。

［XML Processorの動作］

IllegalArgumentException例外が発生します。IllegalStateException例外は発生しません。

25

［条件］

接頭辞を持たない要素に対して，XMLStreamReaderインタフェースのgetPrefix()メソッドまたはgetAttributePrefix(int index)メソッドを実行する場合です。

［XML Processorの動作］

戻り値は，""(XMLConstants.DEFAULT_NS_PREFIX)となります。

26

［条件］

名前空間を持つ属性に対して，XMLStreamReaderインタフェースのgetAttributeValue(String namespaceURI,String localName)メソッドで引数namespaceURIにnullを，引数localNameに属性のローカル名を指定する場合です。

［XML Processorの動作］

戻り値は，nullとなります。属性値は取得されません。

27

［条件］

END_DOCUMENTイベント型またはENTITY_REFERENCEイベント型に対して，XMLStreamReaderインタフェースのgetEncoding()メソッドまたはgetVersion()メソッドを実行する場合です。

［XML Processorの動作］

END_DOCUMENTイベント型の場合，NullPointerException例外が発生します。

ENTITY_REFERENCEイベント型の場合，戻り値がnullとなります。

28

［条件］

XMLStreamReaderインタフェースのisAttributeSpecified(int index)メソッドを実行する場合です。

［XML Processorの動作］

次のように戻り値が異なります。

XML文書内に明示的に指定された属性の場合：true

DTD内で暗黙的に指定されたデフォルト属性の場合：false

29

［条件］

ENTITY_REFERENCEイベント型に対して，XMLStreamReaderインタフェースのhasName()メソッドを実行する場合です。

［XML Processorの動作］

戻り値はtrueとなります。

30

［条件］

DTDイベント型に対して，XMLStreamReaderインタフェースのgetText()メソッドを実行する場合です。

［XML Processorの動作］

「DOCTYPE宣言の文字列値」を返します。DTD内部サブセットがある場合も同様です。「DTD内部サブセットの文字列値」は返されません。

31

［条件］

内部エンティティ参照を含む要素のコンテンツに対して，XMLStreamReaderインタフェースのgetElementText()メソッドを実行する場合です。

［XML Processorの動作］

戻り値は，内部エンティティ参照の置換テキストが2回連結された文字列となります。

32

［条件］

次のどちらかに該当する場合です。

ENTITY宣言が存在しないXML文書をXMLStreamReaderインタフェースを使用して読み取り，DTDイベント型でXMLStreamReaderインタフェースのgetProperty("javax.xml.stream.notations")メソッドを実行する。

NOTATION宣言が存在しないXML文書をXMLStreamReaderインタフェースを使用して読み取り，DTDイベント型でXMLStreamReaderインタフェースのgetProperty("javax.xml.stream.entities")メソッドを実行する。

［XML Processorの動作］

戻り値は，要素のないjava.util.Listとなります。

33

［条件］

次のすべての条件に該当する場合です。

パラメタエンティティ定義の中にDTD宣言を記述する。

DOCTYPE宣言で1.のパラメタエンティティを使用する。

1.および2.のXML文書をStAXでパースする。

XMLStreamReaderのgetTextメソッド，またはjavax.xml.stream.events.DTDインタフェースを使用してDTD宣言のテキストを取得する。

［XML Processorの動作］

取得したDTD宣言のテキストが不当になります。

34

［条件］

XML宣言の擬似属性の属性値に不当な文字列を指定した場合です。

［XML Processorの動作］

com.cosminexus.stax.xml.stream.internal.xni.XNIException例外が発生します。

また，メッセージ中の{}内に詳細文字列が出力されない場合があります。

（例）

com.cosminexus.stax.xml.stream.internal.xni.XNIException:

The standalone document declaration value must be "yes" or "no", not "{0}".

35

［条件］

次に示す，どれかのメソッドを実行した場合です。

XMLStreamException.getLocation()メソッド

XMLEvent.getLocation()メソッド

XMLStreamReader.getLocation()メソッド

［XML Processorの動作］

例外が発生した場所を特定するための近似値として，Location情報を取得します。

36

［条件］

次のすべての条件に該当する場合です。

XML文書に「:」で始まる要素名が含まれる。

StAXパーサの名前空間が有効になっている。

2.のStAXパーサで1.のXML文書をパースする。

［標準仕様］

パースエラーが発生します。

［XML Processorの動作］

パースは正常終了します。

37

［条件］

XMLEventFactoryクラスのcreateStartDocument(String encoding, String version, boolean standalone)メソッドのstandaloneパラメタにtrueを設定する場合です。

［標準仕様］

standaloneの状態がtrueのXML文書が生成されます。

［XML Processorの動作］

standalone宣言が生成されません。

38

［条件］

次のすべての条件に該当する場合です。

version宣言が存在しないXML文書をXMLEventReaderでパースする。

StartDocumentインタフェースのgetVersionメソッドを実行する。

［標準仕様］

デフォルト値の1.0を返します。

［XML Processorの動作］

nullを返します。

39

［条件］

XML文書内の次の部分に対して，XMLEventReaderクラスのnextEvent()メソッド実行をする場合です。

空白文字列

CDATAセクション

記法宣言

［XML Processorの動作］

空白文字列は，CHARACTERSイベント型となります。SPACEイベント型にはなりません。

CDATAセクションは，CHARACTERSイベント型となります。CDATAイベント型にはなりません。

記法宣言に対するNOTATION_DECLARATIONイベントは発生しません。

40

［条件］

XML文書内の次の部分に対して，XMLStreamReaderインタフェースのgetEventType()メソッドを実行する場合です。

空白文字列

CDATAセクション

［XML Processorの動作］

空白文字列もCDATAセクションもCHARACTERSイベント型となるため，CHARACTERSイベント型として処理してください。

41

［条件］

次のすべての条件に該当する場合です。

namespaceURIが接頭辞にバインドされていない。

XMLStreamWriterインタフェースの次に示すメソッドの引数namespaceURIに，1.を指定する。

writeAttribute(String prefix, String namespaceURI, String localName, String value)

［XML Processorの動作］

属性だけが出力されます。名前空間宣言(xmlns:prefix="namespaceURI")は出力されません。

42

次に示すjavax.xml.stream.eventsパッケージに含まれるインタフェースでは，writeAsEncodedUnicode(Writer writer)メソッドは使用できません。

Attribute

Characters

Comment

DTD

EndDocument

EndElement

EntityDeclaration

EntityReference

Namespace

NotationDeclaration

ProcessingInstruction

StartDocument

StartElement

XMLEvent

43

javax.xml.stream.utilパッケージに含まれるXMLEventAllocatorインタフェースのallocate(XMLStreamReader reader, XMLEventConsumer consumer)メソッドは，使用できません。

44

マルチスレッドプログラミングの場合，XMLInputFactoryクラスはスレッドセーフではありません。そのため，複数のスレッドが同時に同じXMLInputFactoryインスタンスにアクセスしないように注意してください。

スレッド間の競合を避けるため，次のどちらかの方法を採用してください。

各スレッドに1つのXMLOutputFactoryインスタンスを持つ。

各スレッドが排他的にXMLOutputFactoryインスタンスにアクセスする。

45

マルチスレッドプログラミングの場合，XMLOutputFactoryクラスはスレッドセーフではありません。そのため，複数のスレッドが同時に同じXMLOutputFactoryインスタンスにアクセスしないように注意してください。

スレッド間の競合を避けるため，次のどちらかの方法を採用してください。

各スレッドに1つのXMLOutputFactoryインスタンスを持つ。

各スレッドが排他的にXMLOutputFactoryインスタンスにアクセスする。

46

マルチスレッドプログラミングの場合，XMLEventFactoryクラスはスレッドセーフではありません。そのため，複数のスレッドが同時に同じXMLEventFactoryインスタンスにアクセスしないように注意してください。

スレッド間の競合を避けるため，次のどちらかの方法を採用してください。

各スレッドに1つのXMLEventFactoryインスタンスを持つ。

各スレッドが排他的にXMLEventFactoryインスタンスにアクセスする。

47

マルチスレッドプログラミングの場合，XMLStreamReaderインタフェースはスレッドセーフではありません。そのため，複数のスレッドが同時に同じXMLStreamReaderインスタンスを使用しないように注意してください。

スレッド間の競合を避けるため，スレッドごとに1つのXMLStreamReaderインスタンスを持つ必要があります。

48

マルチスレッドプログラミングの場合，XMLStreamWriterインタフェースはスレッドセーフではありません。そのため，複数のスレッドが同時に同じXMLStreamWriterインスタンスを使用しないように注意してください。

スレッド間の競合を避けるため，スレッドごとに1つのXMLStreamWriterインスタンスを持つ必要があります。

49

マルチスレッドプログラミングの場合，XMLEventReaderクラスはスレッドセーフではありません。そのため，複数のスレッドが同時に同じXMLEventReaderインスタンスを使用しないように注意してください。

スレッド間の競合を避けるため，スレッドごとに1つのXMLEventReaderインスタンスを持つ必要があります。

50

マルチスレッドプログラミングの場合，XMLEventWriterクラスはスレッドセーフではありません。そのため，複数のスレッドが同時に同じXMLEventWriterインスタンスを使用しないように注意してください。

スレッド間の競合を避けるため，スレッドごとに1つのXMLEventWriterインスタンスを持つ必要があります。

51

javax.xml.stream.XMLResolverインタフェースのresolveEntityメソッドの引数namespaceは，常にnullになります。

52

javax.xml.stream.XMLResolverインタフェースのresolveEntityメソッドの戻り値のうち，XMLStreamReader型およびXMLEventReader型のオブジェクトはサポートしていません。

［標準仕様］

このリソースの戻り値の型は，次のどれかです。

java.io.InputStream

javax.xml.stream.XMLStreamReader

java.xml.stream.XMLEventReader

53

次に示すイベントに対するgetLocation()メソッドの戻り値はnullです。

javax.xml.stream.events.Attribute

javax.xml.stream.events.Namespace

javax.xml.stream.events.NotationDeclaration

javax.xml.stream.events.EntityDeclaration

54

XMLOutputFactoryクラスのうち，次に示すメソッドの引数resultにシステム識別子を指定していないStAXResultは，指定できません。

createXMLEventWriter(Result result)

createXMLStreamWriter(Result result)

55

［条件］

次のすべての条件に該当する場合です。

javax.xml.stream.isRepairingNamespacesプロパティにtrueを指定する。

XMLStreamWriterインタフェースのうち，次に示すどれかのメソッドを実行する。

writeAttribute(prefix, namespaceURI, localName, value)

writeStartElement(prefix, localName, namespaceURI)

writeEmptyElement(prefix, localName, namespaceURI)

引数namespaceURIがデフォルトの名前空間URIと等しい。

引数prefixが「""」でもnullでもない。

［標準仕様］

接頭辞は書き込まれません。

［XML Processorの動作］

接頭辞が書き込まれます。

56

［条件］

次のすべての条件に該当する場合です。

javax.xml.stream.isRepairingNamespacesプロパティにtrueを指定する。

XMLStreamWriterインタフェースのうち，次に示すどれかのメソッドを実行する。

writeAttribute(prefix, namespaceURI, localName, value)

writeStartElement(prefix, localName, namespaceURI)

writeEmptyElement(prefix, localName, namespaceURI)

引数namespaceURIバインドがあり，異なる接頭辞にバインドしている。

［標準仕様］

接頭辞がランダムに生成されます。

（例）

xmlns:{generated}="namespaceURI" {generated}:localName="value"

<{generated}:localName xmlns:{generated}="namespaceURI">

［XML Processorの動作］

ランダムな接頭辞は生成されません。

（例）

xmlns:prefix="namespaceURI" prefix:localName="value"

<prefix:localName xmlns:prefix="namespaceURI">

57

［条件］

次のすべての条件に該当する場合です。

javax.xml.stream.isRepairingNamespacesプロパティを指定しない，またはfalseを指定する。

XMLStreamWriterインタフェースのwriteAttribute(prefix, namespaceURI, localName, value)メソッドを実行する。

引数namespaceURIはバインドがない。

引数prefixは「""」でもnullでもない。

［標準仕様］

名前空間宣言が生成されます。

［XML Processorの動作］

名前空間宣言が生成されません。

58

［条件］

次のすべての条件に該当する場合です。

javax.xml.stream.isRepairingNamespacesプロパティを指定しない，またはfalseを指定する。

XMLStreamWriterインタフェースのうち，次に示すどれかのメソッドを実行する。

writeAttribute(prefix, namespaceURI, localName, value)

writeStartElement(prefix, localName, namespaceURI)

writeEmptyElement(prefix, localName, namespaceURI)

引数namespaceURIバインドがあり，異なる接頭辞にバインドしている。

［標準仕様］

XMLStreamException例外が発生します。

［XML Processorの動作］

エラーにはなりません。次のように書き込まれます。

prefix:localName="value"

<prefix:localName>

59

［条件］

次のすべての条件に該当する場合です。

javax.xml.stream.isRepairingNamespacesプロパティを指定しない，またはfalseを指定する。

XMLStreamWriterインタフェースの次のどれかのメソッドを実行する。

writeAttribute(prefix, namespaceURI, localName, value)

writeStartElement(prefix, localName, namespaceURI)

writeEmptyElement(prefix, localName, namespaceURI)

引数namespaceURIがデフォルトの名前空間URIと等しい。

引数prefixが「""」でもnullでもない。

［標準仕様］

接頭辞は書き込まれません。

［XML Processorの動作］

次に示す接頭辞が書き込まれます。

prefix:localName="value"

<prefix:localName>

60

［条件］

次のすべての条件に該当する場合です。

javax.xml.stream.isRepairingNamespacesプロパティを指定しない，またはfalseを指定する。

XMLStreamWriterインタフェースのwriteAttribute(prefix, namespaceURI, localName, value)メソッドを実行する。

引数namespaceURIがデフォルトの名前空間URIと等しい。

引数prefixが「""」またはnullである。

［標準仕様］

接頭辞は書き込まれません。

［XML Processorの動作］

XMLStreamException例外が発生します。

61

［条件］

次のすべての条件に該当する場合です。

javax.xml.stream.isRepairingNamespacesプロパティにtrueを指定する。

XMLStreamWriterインタフェースのwriteEmptyElement(prefix, localName, namespaceURI)メソッドを実行する。

引数prefixが「""」である。

［標準仕様］

prefix == "" || null の場合，デフォルトの名前空間として処理されます。接頭辞は生成または書き込まれません。

namespaceURI がバインドされていない場合は，xmlns宣言が生成または書き込まれます。

［XML Processorの動作］

接頭辞はランダムに生成されます。デフォルトの名前空間としては処理されません。

62

［条件］

XMLInputFactoryクラスのうち，次に示すメソッドの引数encodingに"ISO-10646-UCS-2"が，引数streamにencoding擬似属性"ISO-10646-UCS-2"が指定されたXML文書を指定する場合です。

createXMLEventReader(stream, encoding)

createXMLStreamReader(stream, encoding)

［XML Processorの動作］

com.cosminexus.stax.xml.stream.internal.xni.XNIException例外が発生します。

［回避策］

encoding指定のない，createXMLEventReaderメソッドまたはcreateXMLStreamReaderメソッドで処理してください。

63

［条件］

次のすべての条件に該当する場合です。

StartElementイベントのgetNamespaceContext()メソッドでNamespaceContextを取得する。

1.で取得したNamespaceContextに対して，接頭辞xmlや接頭辞xmlnsの名前空間URIを取得する。

［標準仕様］

接頭辞xmlはhttp://www.w3.org/XML/1998/namespaceにバインドされています。

接頭辞xmlnsはhttp://www.w3.org/2000/xmlns/にバインドされています。

［XML Processorの動作］

名前空間コンテキストに接頭辞xmlや接頭辞xmlnsの情報はありません。

64

XMLEventReaderでXML文書を読み込む場合，standalone属性の有無とは関係なく，StartDocumentイベントのstandaloneSet()メソッドの戻り値はtrueになります。

［標準仕様］

XML文書のエンコーディング宣言でstandalone属性が設定されていた場合だけ，戻り値がtrueになります。

65

DTDイベントのgetEntities()メソッドおよびgetNotations()メソッドは，常にnullを返します。

［回避策］

javax.xml.stream.entitiesプロパティおよびjavax.xml.stream.notationsプロパティを使用することで，これらの情報にアクセスできます。詳細は，XMLStreamReaderのJavadocを参照してください。

66

［条件］

XMLInputFactoryクラスのcreateXMLEventReader(Source source)メソッドまたはcreateXMLStreamReader(Source source)メソッドに対して，システム識別子が指定されていない型を指定する場合です。該当する型を次に示します。

DOMSource

SAXSource

StAXSource

［XML Processorの動作］

XMLStreamException例外が発生します。

67

DTDイベントのgetProcessedDTD()メソッドの戻り値は，常にnullです。

68

EndelementイベントのgetNamespaces()メソッドの戻り値は，常に空のIteratorです。

［XML Processorの動作］

範囲外になった名前空間のIteratorを返します。

69

［条件］

次のすべての条件に該当する場合です。

XML文書中の文字データの中に，CDATAセクション終了区切り子("]]>")が単独で含まれる。

（例）

<?xml version="1.0" encoding="UTF-8" ?>

<root>te]]>xt</root>

1.の文字データをXMLStreamReaderまたはXMLEventReaderインタフェースで読み取り，next()メソッドなどで次の構文解析イベントを取得する。

［標準仕様］

XMLStreamReaderインタフェースまたはXMLEventReaderインタフェースからXMLStreamException例外が発生します。

［XML Processorの動作］

XMLStreamReaderインタフェースの場合

XMLStreamReaderインタフェースのイベント型がCHARACTERSのときに実行できるgetTextXXXX()メソッドの実行結果に「]]>」が含まれます。

getText()メソッドを実行すると「]]>」を含む文字列が返されます。

getTextCharacters()メソッドを実行すると，’]’’]’’>’を含む配列が返されます。

getTextCharacters(int sourceStart, char[] target, int targetStart, int length)メソッドを実行すると，char配列targetには’]’’]’’>’が含まれます。

getTextLength()メソッドを実行すると，「]]>」を含む文字列の長さが返されます。

XMLEventReaderインタフェースの場合

nextEvent()メソッドで返されるCharactersオブジェクトに対してgetData()メソッドを実行すると，「]]>」を含む文字列が返されます。

70

XMLOutputFactoryクラスのcreateXMLEventWriter(OutputStream stream)メソッドやcreateXMLStreamWriter(OutputStream stream)メソッドで出力エンコーディングを指定しない場合，XMLEventWriterやXMLStreamWriterはシステムのデフォルト文字コードで出力されます。

71

XMLEventFactoryクラスのcreateStartDocument()メソッドの実行結果は，createStartDocument(String encoding, ...)メソッドの引数encodingにUTF-8を指定した場合と同じです。

72

［条件］

次のすべての条件に該当する場合です。

XMLOutputFactoryクラスのcreateXMLEventWriterメソッドやcreateXMLStreamWriterメソッドで指定する出力エンコーディングが，UTF-8またはUTF-16以外である。

作成されたXMLEventWriterやXMLStreamWriterで，2バイトコードを含むXML文書を出力する。

出力するXML文書のエンコーディングの指定が次に示すどちらかの条件に該当する。

XMLOutputFactoryクラスのcreateXMLEventWriterメソッドで指定する出力エンコーディングとXMLEventFactoryクラスのcreateStartDocumentメソッドで指定する出力XML宣言のencoding擬似属性が一致していない。

XMLStreamWriterインタフェースのwriteStartDocumentメソッドの引数encodingを指定していない。

［XML Processorの動作］

出力エンコーディングがUTF-8およびUTF-16以外の，encoding擬似属性のない不正なXML文書を出力します。

［回避策］

XMLOutputFactoryクラスのcreateXMLEventWriterメソッドやcreateXMLStreamWriterメソッドのencoding指定には，UTF-8を指定してください。

73

［条件］

次のすべての条件に該当する場合です。

XMLOutputFactoryのjavax.xml.stream.isRepairingNamespacesプロパティにBoolean.FALSEを設定する。

1.のXMLOutputFactoryから，XMLStreamWriterまたはXMLEventWriterを作成する。

2.のXMLStreamWriterまたはXMLEventWriterからStAXResultを作成する。

［XML Processorの動作］

上記の条件で作成したStAXResultを次に示すメソッドのどちらかの引数に指定して，名前空間宣言を含むXML文書を処理すると，XMLStreamException例外が発生します。

javax.xml.validation.Validatorクラスのvalidate(Source source, Result result)メソッド

javax.xml.transform.Transformerクラスのtransform(Source source, Result result)メソッド※

注※　ただし，このメソッドはスタイルシートを使わない恒等変換の場合だけ該当します。

［回避策］

XMLOutputFactoryのjavax.xml.stream.isRepairingNamespacesプロパティにはBoolean.TRUEを設定してください。

6.5　スキーマ検証に関する注意事項

スキーマ検証に関する注意事項を次の表に示します。

表6‒9　スキーマ検証に関する注意事項

項番

注意事項

1

XMLパーサにエンティティリゾルバを登録する場合は，エンティティリゾルバのresolveEntityメソッドの戻り値であるInputSourceに必ずシステム識別子を設定してください。設定しないと，xsd:importやxsd:includeで指定したスキーマ文書の場所の解決に失敗してエラーとなる場合があります。

6.6　XSLT/XSLTC共通の注意事項

XSLT/XSLTC共通の注意事項を次の表に示します。

表6‒10　XSLT/XSLTC共通の注意事項

項番

注意事項

1

マルチスレッドプログラミングをする場合，TransformerFactoryクラス，およびTransformerFactoryXSLTCクラスはスレッドセーフではありません。したがって，複数のスレッドが同時に同一のTransformerFactoryインスタンス，およびTransformerFactoryXSLTCインスタンスにアクセスしてはいけません。スレッド間の競合を避けるため，次のどちらかの方法を使用してください。

各スレッドにTransformerFactoryインスタンス，およびTransformerFactoryXSLTCインスタンスを持つ。

各スレッドが排他的にTransformerFactoryインスタンス，およびTransformerFactoryXSLTCインスタンスにアクセスする。

2

マルチスレッドプログラミングをする場合，Transformerクラスはスレッドセーフではありません。したがって，複数のスレッドが同時に同一のTransformerインスタンスにアクセスしてはいけません。スレッド間の競合を避けるため，次の方法を使用してください。

各スレッドにTransformerインスタンスを持つ。

3

マルチスレッドプログラミングをする場合，SAXTransformerFactoryクラス，TemplatesHandlerオブジェクト，TransformerHandlerオブジェクトはスレッドセーフではありません。したがって，各スレッドは排他的にこれらのオブジェクトにアクセスするようにしてください。

4

XSLTトランスフォーマとXSLTCトランスフォーマは同一の機能を提供しますが，エラー発生時に出力するメッセージは異なる場合があります。

5

xsl:attribute要素のnamespace属性に"http://www.w3.org/1999/XSL/Transform"を指定した場合，出力される属性の名前空間接頭辞がXSLTとXSLTCとで異なります。ただし，名前空間を有効に設定したパーサにとっては，名前空間接頭辞そのものは意味を持ちません。

6

xsl:attribute要素およびxsl:processing-instruction要素のname属性にQNameでない名前を指定した場合，XSLTではwarningイベントが発生しますが，XSLTCではerrorイベントが発生します。

7

name属性以外の属性値が異なるxsl:decimal-format要素が複数存在する場合に発生するエラーイベントは，XSLTではfatalErrorイベントが発生し，XSLTCではwarningイベントが発生します。

8

xsl:element要素またはxsl:attribute要素のname属性には，"xml"で始まる名前空間接頭辞を持つ名前を指定しないでください。

9

xsl:element要素，xsl:attribute要素，またはxsl:processing-instruction要素のname属性が，空文字列になる変数参照である場合，XSLTではwarningイベントが発生しますが，XSLTCではerrorイベントが発生します。

10

xsl:element要素のname属性がない場合，XSLTではerrorイベントが発生しますが，XSLTCではwarningイベントが発生します。

11

xsl:namespace-alias要素を使った場合，出力される属性の名前空間接頭辞がXSLTとXSLTCとで異なります。ただし，名前空間を有効に設定したパーサにとっては，名前空間接頭辞そのものは意味を持ちません。

12

xsl:number要素のformat属性に指定するフォーマットトークンには，"1"，" 1の前に任意の個数の0が続いたもの"，"A"，"a"，"i"，"I"のどれかを指定してください。

13

xsl:number要素のlevel属性が"any"の場合，count属性に属性ノードを表すパターンを指定すると，XSLTとXSLTCとで動作が異なります。XSLTでは属性ノードがカウントされませんが，XSLTCでは属性ノードがカウントされます。

14

xsl:output要素のdoctype-system属性に空文字列を指定しないでください。同様に，TransformerクラスのsetOutputPropertyメソッドを用いてdoctype-systemプロパティに空文字列を指定しないでください。

15

xsl:output要素のmethod属性には"xml"，"html"，"text"のうちのどれか1つを指定してください。

16

xsl:processing-instruction要素のname属性に，評価結果が空文字列になるようなXPath式を記述すると，XSLTではwarningイベントが発生しますが，XSLTCではerrorイベントが発生します。

17

xsl:value-of要素のselect属性に変数参照を記述すると，TransformerExceptionが発生します。

18

XSLTとXSLTCでは"document(/)"の評価結果が異なります。XSLTではスタイルシートのルート要素として評価され，XSLTCでは空のノード集合として評価されます。

19

document関数の第一引数に文字列を指定するとき，その文字列に次に該当するXML文書を指定した場合，XSLTCはXSLTとエラーレベルが異なります。

存在しないXML文書

整形式でないXML文書

20

format-number関数のフォーマットパターン文字列に通貨記号（#x00A4）を含めてもエラーにならないことがあります。

21

system-property関数の引数には，"xsl:version"，"xsl:vendor"，"xsl:vendor-url"のうちのどれか1つを指定してください。

22

埋め込みスタイルシートを使った変換で，処理命令"xml-stylesheet"の擬似属性"href"で指定したIDに対応するスタイルシート要素が複数存在する場合，XSLTとXSLTCでは適用されるテンプレートが異なります。XSLTでは最後に現れたテンプレートが適用され，XSLTCでは最初に現れたテンプレートが適用されます。

23

トランスフォーマ機能で，出力プロパティに，未サポートのエンコーディングが指定されている場合，アプリケーションでトランスフォーマにエラーリスナーを登録しても，エラーメッセージ（KECX02322-W）は，エラーリスナーに報告されず，標準出力ストリームへ出力されます。なお，XSLTCの場合，上記エラーメッセージが標準出力ストリームへ出力されるのに加えて，エラーメッセージ（KECX07076-W）がエラーリスナーに報告されます。メッセージの詳細については，マニュアル「アプリケーションサーバメッセージ(構築／運用／開発用)」の「11.　KECX（XML Processorが出力するメッセージ）」を参照してください。

24

変換結果をHTML形式で出力した場合，XSLTとXSLTCとでは要素間の改行出力に差異があります。ただし，HTML文書では，要素間の改行は意味を持たないため問題ありません。

25

次の条件がすべて重なるとき，DOMResultオブジェクトのsetNode（Node node）メソッドを実行すると，IllegalStateException例外ではなく，IllegalArgumentException例外が発生します。

DOMResultオブジェクトのnextSiblingがnullではない。

nextSiblingが引数nodeの子でない。

この場合は，setNodeメソッドの例外を処理するcatch節で，IllegalStateException例外だけでなくIllegalArgumentException例外もキャッチしてください。

26

スタイルシート内でQNameとして評価される場所（xsl:element要素のname属性，key関数の第一引数など）に，XML1.0規格で名前として使用することが許されていない文字（Unicode補助文字，全角数字など）が使用されても，エラーにならないで処理が続行される場合があります。このような場合，トランスフォーマに出力メソッドとして"xml"を指定し，出力バージョンとして"1.0"を指定しても，出力される文書はXML1.0規格に準拠しません。

27

内部エンティティを定義する文字列中に，477文字以上の要素名が含まれていると， java.lang.IndexOutOfBoundsException例外が発生する場合があります。

28

次に示すDOMResultのコンストラクタ引数にDocumentオブジェクトを指定する場合は，DocumentBuilderクラスのnewDocumentメソッドで作成した，新しいDocumentオブジェクトを指定してください。

DOMResult(Node node)

DOMResult(Node node, String systemId)

29

値が重複したID型属性を含むXML文書に対して，id関数を使ったXSLTスタイルシートを適用した場合，id関数の結果が不正になることがあります。

30

次の条件の両方に該当する場合，トランスフォーマの変換処理の実行速度が大幅に低下します。

入力XML文書が大量の実体参照を含む。

トランスフォーマの出力先がDOMResultである。

31

次のすべての条件に該当する場合，TransformerFactoryクラスのnewTemplatesメソッドまたはnewTransformerメソッドを呼び出すときにfatalErrorイベントが発生します。メソッドの戻り値はnullとなります。

トランスフォーマとして，XSLTCではなくXSLTを使っている。

XMLInputFactoryクラスのcreateXMLStreamReaderメソッドまたはcreateXMLEventReaderメソッドの引数にシステム識別子を指定しないで呼び出して，XMLStreamReaderまたはXMLEventReaderを作成する。

StAXSourceのコンストラクタ引数に2.で作成したXMLStreamReaderまたはXMLEventReaderを指定する。

TransformerFactoryクラスのnewTemplatesメソッドまたはnewTransformerメソッドの引数に，3.で作成したStAXSourceを指定する。

次のどれかの方法で対策してください。

XSLTの代わりにXSLTCを使用する。

createXMLStreamReaderメソッドまたはcreateXMLEventReaderメソッドの引数に，システム識別子を指定する。

StAXSource以外のSourceを使用する。

32

次のすべての条件に該当する場合，トランスフォーマの出力結果のXML宣言にencoding擬似属性が出力されません。また，1.と2.の条件が重なる場合，standalone擬似属性が出力されません。

トランスフォーマの出力にStAXResultを指定する。

XSLTスタイルシートまたはトランスフォーマの出力プロパティの設定で，出力メソッドに「xml」を指定している。

1.のStAXResultにXMLStreamWriterまたはUTF-8以外の出力エンコーディングを指定したXMLEventWriterを指定する。

33

次のすべての条件に該当する場合，トランスフォーマの出力結果にXML宣言が出力されません。

トランスフォーマの出力にStAXResultを指定する。

XSLTスタイルシートまたはトランスフォーマの出力プロパティの設定で，出力メソッドに「xml」を指定する。

XSLTスタイルシートのテンプレートにマッチするノードが，入力XML文書内に存在しない。

34

次のすべての条件に該当する場合，トランスフォーマの出力結果の内容に関係なく，出力メソッドとして「xml」が仮定されます。

トランスフォーマの出力にStAXResultを指定する。

XSLTスタイルシートまたはトランスフォーマの出力プロパティの設定で，出力メソッドを指定していない。

35

トランスフォーマの出力にStAXResultを使った場合，XSLTスタイルシートまたはトランスフォーマの出力プロパティに指定した次のプロパティは無効になります。

omit-xml-declaration

doctype-system

doctype-public

cdata-section-elements

36

トランスフォーマの出力にStAXResultを使った場合，XSLTスタイルシートまたはトランスフォーマの出力プロパティで，次のプロパティに不当な値を指定してもエラーが通知されないで，指定は無効となります。

version

encoding

37

次のすべての条件に該当する場合，トランスフォーマの出力結果の中に，disable-output-escaping属性に「yes」を指定したxsl:text要素の内容が，エスケープされないで出力されます。

トランスフォーマの出力にStAXResultを指定する。

XSLTスタイルシート内のxsl:text要素のdisable-output-escaping属性に「yes」を指定する。

また，出力された文字列の前後に次の処理命令が付加されます。

（例）

<?javax.xml.transform.disable-output-escaping ?>&lt;<?javax.xml.transform.enable-output-escaping ?>

38

次のすべての条件に該当する場合，トランスフォーマの出力結果のXML宣言より前に文字を出力します。

トランスフォーマの出力にStAXResultを指定する。

XSLTスタイルシートまたはトランスフォーマの出力プロパティの設定で，出力メソッドに「xml」を指定する。

出力ツリーのルート要素の前（プロローグ部分）に文字を出力する。

39

JDK17以降を使用している場合に，トランスフォーマの入力にStAXSourceを指定してルート要素より前に処理命令があるXML文書をXML変換するとき，変換時に行うXML文書のパース処理でルート要素より前にある処理命令がパースされます。

40

JDK17以降を使用している場合に，トランスフォーマの出力にXMLEventWriterを設定したStAXResultを指定してXML変換をすると，変換結果のXML文書にあるXML宣言の終了記号の直前に空白が入ります。

（変換例）

<?xml version="1.0"△?>

（凡例）　△：空白

6.7　XSLTに関する注意事項

XSLTに関する注意事項を次に示します。

6.7.1　エラーを通知しないケース

表6‒11　XSLTに関する注意事項（エラーを通知しないケース）

項番

注意事項

1

xsl:copy-of要素のselect属性に，ノード集合以外のオペランドを"|"演算子で結合した式が書かれた場合，XSLTトランスフォーマはエラーを通知しません。

2

xsl:for-each要素のselect属性がXPath式として許されない文字（"~"，"#"など）を含む場合，XSLTトランスフォーマはエラーを通知しません。

3

xsl:output要素のcdata-section-elements属性にQName規則に合致しない文字列を指定した場合，XSLTトランスフォーマはエラーを通知しません。

4

element-available関数およびfunction-available関数に文字列型以外の引数を指定した場合，XSLTトランスフォーマはエラーを通知しません。

6.7.2　その他の注意事項

表6‒12　XSLTに関する注意事項（その他）

項番

注意事項

1

JDK17以降を使用している場合に，xsl:number要素のgrouping-size属性に指定できない負の値を指定したとき，TransformerExceptionが発生します。

2

xsl:preserve-space要素およびxsl:strip-space要素のelements属性には空文字列以外の文字列を指定してください。

3

XSLTを使って変換を行う場合，xsl:strip-space要素またはxsl:preserve-space要素のelements属性に"*"を指定すると，名前空間接頭辞付きの要素が空白の削除対象，または保存対象として選択されない場合があります。名前空間接頭辞付きの要素を空白の削除対象または保存対象とする場合は，elements属性に名前空間接頭辞付きの要素名を指定してください。

4

format-number関数の第二引数には，長さが1文字以上のフォーマットパターンを指定してください。

5

出力プロパティのmethod属性に"html"を指定し，cdata-section-elements属性に要素名を指定した場合，cdata-section-elements属性が無視されず，指定した要素の内容がCDATAセクションとして出力されます。

6

JDK17以降を使用している場合に，次のクラスを指定するとき，--add-exportsオプションに"java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED"を設定する必要があります。

StAXSource（トランスフォーマの入力に指定）

StAXResult（トランスフォーマの出力に指定）

6.8　XSLTCに関する注意事項

XSLTCに関する注意事項を次に示します。

6.8.1　スタイルシートサイズの注意事項

表6‒13　XSLTCに関する注意事項（スタイルシートサイズ）

項番

注意事項

1

XSLTCには，処理可能なスタイルシートサイズの上限があります。18,000バイトを超えるスタイルシートを処理すると，KECX07058-Eのエラーが発生して処理を中止する場合があります。ただし，スタイルシートサイズの上限は，スタイルシートの内容によって変動します。メッセージの詳細については，マニュアル「アプリケーションサーバメッセージ(構築／運用／開発用)」の「11.　KECX（XML Processorが出力するメッセージ）」を参照してください。

6.8.2　変換処理性能に関する注意事項

表6‒14　XSLTCに関する注意事項（変換処理性能）

項番

注意事項

1

「3.2.1(1)　同一のXSLTスタイルシートを使って複数のXML文書を変換する場合」で示したケースに該当するすべての場合について，XSLTCトランスフォーマの変換処理性能がXSLTトランスフォーマより高いことを保証するものではありません。XSLTCトランスフォーマを使用する場合は，実際に使用するXSLTスタイルシートおよび変換対象のXML文書を使って性能を評価することを推奨します。

2

XSLTCを使って変換する場合，次の条件がすべて重なるスタイルシートでは繰り返し処理される回数に比例してメモリ使用量が増加します。最大の繰り返し処理回数を想定してメモリ設計をしてください。

<xsl:variable>や<xsl:param>で変数やパラメタに次のどちらかを設定している。

・結果ツリーフラグメント（select属性ではなく，要素内容として書かれたテンプレートによって定義される値）

・ノードセット

1.が繰り返し処理される。

例1：変数に結果ツリーフラグメントを設定した例

　<xsl:for-each select="/ns1:root/ns1:Data">

　　<xsl:variable name="V1">

　　　<xsl:element name="RTF_ROOT" namespace="">

　　　　<xsl:copy-of select="." />

　　　</xsl:element>

　　</xsl:variable>

　　<xsl:element name="ELE1" namespace="">

　　　<xsl:copy-of select="$V1" />

　　</xsl:element>

　</xsl:for-each>

例2：パラメタに結果ツリーフラグメントを設定した例

　<xsl:template match="/">

　　<xsl:for-each select="/ns1:root/ns1:Data">

　　　<xsl:call-template name="t2">

　　　　<xsl: with-param name="P1">

　　　　　<xsl:element name="RTF1" namespace="">

　　　　　　<xsl:copy-of select="." />

　　　　　</xsl:element>

　　　　</xsl: with-param>

　　　</xsl:call-template>

　　</xsl:for-each>

　</xsl:template>

　<xsl:template name="t2">

　　<xsl:param name="P1"/>

　　<xsl:element name="ELE1" namespace="">

　　　<xsl:copy-of select="$V1" />

　　</xsl:element>

　</xsl:template>

例3：変数にノードセット（document()関数を使用して異なるXML文書を読み込む）を設定した例

　<xsl:for-each select="/ns1:root/ns1:Data">

　　<xsl:variable name="V1" select="document(@refdoc)"/>

　　<xsl:element name="ELE1" namespace="">

　　　<xsl:copy-of select="$V1/*" />

　　</xsl:element>

　</xsl:for-each>

6.8.3　XSLT要素の注意事項

表6‒15　XSLTCに関する注意事項（XSLT要素）

項番

注意事項

1

xsl:apply-imports要素が処理されません。

2

テンプレートがxsl:with-paramによってパラメタとしてノード集合を受け取った場合，そのパラメタをxsl:apply-templates要素のselect属性で参照すると，それ以降，同じパラメタを参照してもノード集合を取得できなくなります。

3

xsl:attribute要素の子要素がxsl:copyの場合，出力される属性値が空になります。

4

xsl:attribute要素の内容にxsl:value-of要素を指定する場合は，select属性に指定するXPath式を絶対ロケーションパスで記述してください。

5

xsl:attribute-set要素がuse-attribute-sets属性で自分自身を参照（循環参照）する場合，XSLTCではスタックオーバーフローが発生します。

6

すべての属性の属性値が等しいxsl:decimal-format要素を複数個定義した場合，XSLTCはエラーを通知します。

7

xsl:element要素またはxsl:attribute要素のname属性には属性値テンプレートを指定しないでください。

8

次の条件がすべて重なるとき，要素が属する名前空間が不正になります。

xsl:element要素の子要素にxsl:attribute要素がある。

xsl:element要素のname属性が接頭辞付きの名前で，namespace属性の指定がある。

xsl:attribute要素のname属性が接頭辞付きの名前で，namespace属性の指定がある。

xsl:elementとxsl:attributeのname属性に指定された接頭辞が同じで，namespace属性の値が異なる。

上記現象が発生するスタイルシートの例を次に示します。

<xsl:template match="/">

　<xsl:element name="child1" namespace="AAA">

　　　<xsl:element name="A:child2" namespace="XXX">

　　　　<xsl:attribute name="A:attr" namespace="AAA">1</xsl:attribute>

　　　</xsl:element>

　</xsl:element>

</xsl:template>

9

xsl:for-each要素のselect属性に述部を持つXPath式を指定する場合，述部に「ノードを比較対象とする式」を指定しないでください。この場合，スタイルシートを次のように変更してください。

xsl:for-each要素のselect属性のXPath式から述部を削除してください。

xsl:for-each要素の子にxsl:if要素を挿入して，test属性に1.で削除した述部の内容を指定してください。

スタイルシートの変更例を次に示します。

（変更前）

<xsl:template match="/">

　<xsl:for-each select="element[sub='x']">

　　<xsl:value-of select="."/>

　</xsl:for-each>

</xsl:template>

（変更後）

<xsl:template match="/">

<xsl:for-each select="element">

<xsl:if test="sub='x'">

<xsl:value-of select="."/>

</xsl:if>

</xsl:for-each>

</xsl:template>

10

xsl:for-each要素のselect属性に「"descendant::node()"または"descendant-or-self::node()"を含むXPath式」を指定しないでください。要素ノードおよびテキストノードを選択する目的でこのようなXPath式を使用する場合は，スタイルシートを次のように変更してください。

"descendant::node()"を"descendant::node()|descendant::text()"に置き換えてください。

"descendant-or-self::node()" を"descendant-or-self::node()|descendant-or-self::text()"に置き換えてください。

11

xsl:if要素またはxsl:when要素のtest属性に「self軸と述部を両方持つXPath式」を指定しないでください。この場合，スタイルシートを次のように変更してください。

xsl:if要素またはxsl:when要素のtest属性のXPath式から，述部を削除してください。

xsl:if要素またはxsl:when要素の子にxsl:if要素を挿入して，そのtest属性に1.で削除した述部の内容を指定してください。

スタイルシートの変更例を次に示します。

（変更前）

<xsl:template match="/element/sub">

　<xsl:if test="self::sub[attribute::attr='x']">

　　<xsl:value-of select="."/>

　</xsl:if >

</xsl:template>

（変更後）

<xsl:template match="/element/sub">

　<xsl:if test="self::sub">

　　<xsl:if test="attribute::attr='x'">

　　　<xsl:value-of select="."/>

　　</xsl:if>

　　</xsl:if >

</xsl:template>

12

xsl:import要素のhref属性の値が空文字列または空白だけの場合，errorイベントが発生し，エラーメッセージとして"null"が出力されます。

13

xsl:number要素のcount属性に"node()"を含むパターンを指定しないでください。要素ノードを番号付けする目的で"node()"を使用する場合は，代わりに"*"または"要素名"を使用してください。

14

xsl:number要素またはxsl:decimal-format要素のgrouping-separator属性に複数の空白文字列や1文字以上の文字列，または全角文字を指定した場合，エラーにはならず，指定した文字列で区切られた値が出力されます。

15

xsl:number要素のcount属性に"/"を指定した場合，XSLTでは"1"が出力されますが，XSLTCではjava.lang.VerifyErrorが発生します。

16

xsl:number要素のfrom属性に"/"を指定した場合，XSLTでは"1"が出力されますが，XSLTCではjava.lang.VerifyErrorが発生します。

17

xsl:output要素のdoctype-public属性には空文字列以外の文字列を指定してください。同様に，TransformerクラスのsetOutputPropertyメソッドを用いてdoctype-publicプロパティを設定する場合も，空文字列以外の文字列を指定してください。

18

xsl:processing-instruction要素のname属性に，処理命令のターゲット名として許されない"XML"を指定した場合，"<?XML?>"という不正な処理命令が出力されます。

19

xsl:sortのdata-type属性に不正な値"NUMBER"（大文字）を指定した場合，デフォルト動作（"text"が指定された場合と同じ順序でソートする）が行われません。

20

xsl:sortのorder属性に不正な値"DESCENDING"（大文字）を指定した場合，デフォルト動作（"ascending"が指定された場合と同じ順序でソートする）が行われません。

21

xsl:template要素のmatch属性に「"node()"を含み，かつ，その後ろにロケーションパスが続くXPath式」を指定しないでください。要素ノードを選択する目的で"node()"を使用する場合は，代わりに"*"を使用してください。スタイルシートの変更例を次に示します。

（変更前）

<xsl:template match="/node()/sub">

<result><xsl:value-of select="."/></result>

</xsl:template>

（変更後）

<xsl:template match="/*/sub">

<result><xsl:value-of select="."/></result>

</xsl:template>

22

xsl:template要素の子要素としてトップレベル要素を書いた場合，無視されずに有効な子要素として処理されます。

23

xsl:value-of要素のselect属性に，負のゼロを引数とするstring関数を記述した場合，XSLTでは"0"が出力されますが，XSLTCでは"-0"が出力されます。

24

xsl:variable要素の子要素にxsl:call-template要素を指定し，かつ，xsl:call-templateで呼び出されたテンプレート内に名前空間接頭辞を持つリテラル要素がある場合，xsl:copy-of要素でその変数が示す要素をコピーすると，要素の名前空間宣言が正しくコピーされません。

25

リテラル結果要素にxsl:extension-element-prefixes属性を指定して拡張要素とした場合，拡張要素の子要素として書かれたxsl:fallback要素が無視されます。代わりにxsl:stylesheet要素にextension-element-prefixes属性を指定してください。

26

スタイルシート内で仕様上，許されない場所に子要素を書いた場合（例：xsl:stylesheet要素の子要素としてリテラル要素を書いた場合，xsl:namespace-alias要素の子要素としてxsl:text要素が現れた場合など），エラーにはならないで，不正な子要素が無視されます。

6.8.4　XPath式の注意事項

表6‒16　XSLTCに関する注意事項（XPath式）

項番

注意事項

1

document関数にXPath式を続けて指定する場合，"//"は使用しないで，代わりに"/descendant-or-self::node()/"を使用してください。

2

最上位要素の中でcurrent関数を使用しないでください。

3

XPath式の中でノードテスト"node()"を使用した場合，ノードを正しく取得できません。

4

XPath式に，"*"を含むノードテストと論理演算子を組み合わせたXPath式を書いた場合，XPath式の構文解析中にエラーが発生します。

5

変数およびパラメタの値が，結果ツリーフラグメント（select属性ではなく，要素内容として書かれたテンプレートによって定義される値）の場合，そのテンプレートの中に変数参照があると，NullPointerExceptionが発生する場合があります。

6.8.5　エラーを通知しないケース

要素や属性の指定内容が不当な場合や，関数の引数が不正な場合など，XSLTCがエラーを通知しないケースがあります。XSLTCがエラーを通知しないケースを次の表に示します。

表6‒17　XSLTCに関する注意事項（エラーを通知しないケース）

項番

注意事項

1

xsl:apply-templates要素の子要素としてxsl:sort要素とxsl:with-param要素以外のスタイルシート要素を指定した場合。

2

xsl:apply-templates要素のselect属性に空文字列を指定した場合。

3

xsl:comment要素の要素内容にテキスト以外を指定した場合。

4

xsl:decimal-format要素の次に挙げた属性に2文字以上の値を指定した場合。

decimal-separator

grouping-separator

minus-sign

percent

per-mille

zero-digit

pattern-separator

5

xsl:element要素またはxsl:attribute要素のname属性に接頭辞で修飾した要素名を指定し，かつ，namespace属性に空文字列を指定した場合。

6

xsl:for-each要素の先頭以外の子要素としてxsl:sortを指定した場合。

7

xsl:import要素に要素内容を指定した場合。

8

xsl:import要素がトップレベル要素の先頭要素でない場合や，xsl:import要素やxsl:include要素がトップレベル要素でない場合。

9

xsl:key要素のuse属性にkey関数を含むXPath式を指定した場合。

10

xsl:message要素をxsl:stylesheet要素の子要素として指定した場合。

11

xsl:message要素のterminate属性に"yes"，"no"以外の値を指定した場合。

12

xsl:namespace-alias要素のstylesheet-prefix属性やresult-prefix属性に指定した接頭辞に対応する名前空間宣言がない場合。

13

xsl:namespace-alias要素のstylesheet-prefix属性やresult-prefix属性の指定がない場合。

14

xsl:namespace-alias要素に要素内容を指定した場合。

15

xsl:number要素のgrouping-size属性にNumber規則に合致しない文字列を指定した場合。

16

xsl:number要素のlang属性およびlevel属性に不当な値を指定した場合。

17

xsl:number要素のletter-value属性に不当な値を指定した場合。

18

xsl:number要素のgrouping-separator属性に，値が空文字となる変数参照を指定した場合。

19

xsl:output要素のversion属性に不当な値を指定した場合。

20

xsl:output要素のindent属性に不当な値を指定した場合。

21

xsl:output要素のstandalone属性に不当な値を指定した場合。

22

xsl:output要素のomit-xml-declaration属性に不当な値を指定した場合。

23

xsl:param要素のselect属性に空文字列を指定した場合。

24

xsl:sort要素のdata-type属性，order属性，またはcase-order属性に不正な値を指定した場合。

25

xsl:sort要素のdata-type属性，order属性，またはcase-order属性が空文字列になる変数参照である場合。

26

xsl:sort要素のdata-type属性，order属性，またはcase-order属性に大文字の値を指定した場合，小文字で指定されたものとして扱われます。

27

xsl:strip-space要素，xsl:preserve-space要素，xsl:apply-imports要素など，仕様上は要素内容を持てない要素に要素内容を指定した場合。

28

xsl:stylesheet要素のversion属性に不当な値を指定した場合。

29

xsl:stylesheet要素のexclude-result-prefixes属性に指定した接頭辞に対応する名前空間URIが，この属性を持つ要素で有効でない場合。

30

xsl:stylesheet要素の中にxsl:stylesheet要素を指定した場合。

31

xsl:template要素のmatch属性およびmode属性に空文字列を指定した場合。

32

xsl:template要素にname属性の指定がなく，match属性の指定もない場合。

33

xsl:template要素またはxsl:apply-templates要素のmode属性に空文字列を指定した場合。

34

xsl:template要素のpriority属性に空文字列を指定した場合。

35

最初のxsl:template要素より前にリテラル結果要素が現れた場合。

36

xsl:template要素にmode属性があり，match属性がない場合。

37

複数のxsl:with-param要素が同じ値のname属性を持っている場合。

38

xsl:text要素のdisable-output-escaping属性に"yes"，"no"以外の値を指定した場合。

39

xsl:value-of要素のdisable-output-escaping属性に"yes"または"no"以外の値を指定した場合。

40

xsl:variable要素のselect属性に空文字列を指定した場合。

41

xsl:variable要素またはxsl:param要素に，select属性とテキスト内容の両方が存在する場合。

42

xsl:with-param要素のselect属性に空文字列を指定した場合。

43

次の関数呼び出しの引数の数が不正な場合。

number関数

boolean関数

lang関数

concat関数

44

document関数の第二引数が空文字列の場合。

45

format-number関数の第三引数に空文字列を指定した場合。

46

key関数の第一引数に存在しないキー名を指定した場合。

47

unparsed-entity-uri関数の引数の個数が不正な場合。

6.8.6　その他の注意事項

表6‒18　XSLTCに関する注意事項（その他）

項番

注意事項

1

XSLTCを使った場合，デフォルトのエラーリスナーはエラー時に例外をスローします。

2

ErrorListenerのwarningメソッドやerrorメソッドの実装が例外をスローしない場合，スタイルシート解析時に警告やエラーが発生するとトランスレットの作成ができないため，変換ができません。

3

エラーメッセージ中のエラーIDの前に，エラー原因となったファイルのファイル名と行番号が出力される場合があります。

4

SAXTransformerFactoryクラスのnewTemplatesHandlerメソッドで作成したTemplatesHandlerオブジェクトをXMLReaderクラスのsetContentHandlerメソッドでパーサに登録して変換処理を行う場合，エラーのあるスタイルシートを処理してもエラーが出力されません。

5

SAXTransformerFactoryを使って変換を行う場合，エラーリスナーの設定にかかわらず，スタイルシートのエラーがエラーリスナーに通知されません。

6

XSLTCを使って変換する場合，1つのxsl:namespace-alias要素のstylesheet-prefix属性とresult-prefix属性の両方に"#default"を指定すると，NullPointerExceptionが発生します。

7

XSLTCを使って変換を行う場合，インポート優先順位が異なる2つのテンプレートがname属性とmatch属性を持ち，name属性の値が同じであるとき，インポート優先順位が低い方のテンプレートが無視されます。

8

XSLTCを使って変換する場合，スタイルシートとJAXPインタフェースの両方で出力プロパティのcdata-section-elements属性を設定すると，スタイルシート内で定義された値がJAXPインタフェースで設定された値によって上書きされます。

9

XSLTCを使って変換する場合，DocumentFragmentから作ったDOMSourceを返すように実装したURIResolverを使用すると，正しい変換処理が実行されません。

10

出力メソッドにHTML出力を指定した場合，xsl:element要素のname属性に"{name()}"または"{name( . )}"を指定すると，NullPointerExceptionが発生します。

11

XSLTCを使って変換する場合，XML Processorの実装内部のデータの個数が65,536以上になると，TransformerExceptionが発生します。

実装内部のデータとは，次に示すタイミングで作成されるデータです。

入力XML文書の読み込み時

入力XML文書のノード数（DOMノード同等）が32,768ごとに1つ追加作成します。

次の指定があるスタイルシートで処理する時

<xsl:variable>や<xsl:param>で変数やパラメタにノードセットや結果ツリーフラグメント（select属性ではなく，要素内容として書かれたテンプレートによって定義される値）を設定している場合に処理件数分作成します。

12

JDK17以降を使用している場合に，トランスフォーマの入力にStAXSourceを指定するとき，--add-exportsオプションに"java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED"と"java.xml/com.sun.org.apache.xml.internal.utils=ALL-UNNAMED"を設定する必要があります。

13

JDK17以降を使用している場合に，トランスフォーマの出力にStAXResultを指定するとき，--add-exportsオプションに"java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED"を設定する必要があります。

6.9　javax.xml.datatypeパッケージに関する注意事項

javax.xml.datatypeパッケージに関する注意事項を次の表に示します。

表6‒19　javax.xml.datatypeパッケージに関する注意事項

項番

注意事項

1

マルチスレッドプログラミングをする場合，javax.xml.datatypeパッケージで規定されたオブジェクトはスレッドセーフではありません。したがって，各スレッドは排他的にこれらのオブジェクトにアクセスするようにしてください。

2

DatatypeFactoryクラスの各メソッドでIllegalArgumentExceptionが発生したとき，getMessage()メソッドでは，各メソッドに指定したパラメタが戻ります。

3

DatatypeFactoryクラスのnewXMLGregorianCalendarメソッド，newXMLGregorianCalendarDateメソッド，newXMLGregorianCalendarTimeメソッドで，月を表すフィールドに4，6，9，11のどれかを設定したとき，日を表すフィールドに31を設定してもエラーが発生しません。

4

DatatypeFactoryクラスのnewXMLGregorianCalendarメソッドおよびnewXMLGregorianCalendarTimeメソッドの引数millisecondには，0から999までの値を指定してください。

5

月を表すフィールドが1のDurationオブジェクトと，日を表すフィールドが28のDurationオブジェクトを比較したとき，結果は次のようになります。

compareメソッドで比較したときは，DatatypeConstants.EQUALが戻ります。

equalsメソッドで比較したときは，trueが戻ります。

6

DatatypeFactoryクラスのnewDuration(long durationInMilliSeconds)メソッド，newDurationDayTime(long durationInMilliSeconds)メソッド，またはnewDurationYearMonth(long durationInMilliSeconds)メソッドで作成したDurationオブジェクトは，DatatypeConstants.DURATION_DAYTIME型になります。したがって，このDurationオブジェクトの月を表すフィールド，日を表すフィールドの値は0になります。

7

XMLGregorianCalendarクラスのsetHourメソッド，およびsetTimeメソッドの引数hourには，0から23までの値を指定してください。また，DatatypeFactoryクラスのnewXMLGregorianCalendarメソッド，newXMLGregorianCalendarTimeメソッドの引数の「時間を表すフィールド」には，0から23までの値を指定してください。

8

JAXP1.4仕様書では，XMLGregorianCalendarクラスのisValidメソッドは「Validate instance by getXMLSchemaType() constraints.」と定義されています。XML Processorでは，次の制約をすべて満たしているときにtrueを返します。

月を表すフィールドが2のとき，日を表すフィールドが28以内（うるう年以外の場合），または29以内（うるう年の場合）である。

年を表すフィールドが0ではない。

9

XMLGregorianCalendarクラスのequalsメソッドの引数がnullのとき，NullPointerException例外は発生せずにfalseが戻ります。

10

DatatypeConstants.GMONTH型のXMLGregorianCalendarオブジェクトにtoString, toXMLFormatメソッドを適用して得られる字句表現は，W3C XML Schema 1.0 Part 2（second edition）仕様書のセクション3.2.14で規定された文字列「--MM」ではなく，second editionより前の仕様書で規定された文字列「--MM--」になります。

6.10　javax.xml.validationパッケージに関する注意事項

javax.xml.validationパッケージに関する注意事項を次の表に示します。

表6‒20　javax.xml.validationパッケージに関する注意事項

項番

注意事項

1

マルチスレッドプログラミングをする場合，SchemaFactoryクラス，Validatorクラス，ValidatorHandlerクラス，TypeInfoProviderクラスはスレッドセーフではありません。したがって，各スレッドは排他的にこれらのオブジェクトにアクセスするようにしてください。

2

SchemaFactoryクラスのnewInstance(String schemaLanguage)メソッドの引数に指定可能なURIは"http://www.w3.org/2001/XMLSchema"だけです。

3

SchemaFactoryクラスのisSchemaLanguageSupportedメソッドには，

"http://www.w3.org/2001/XMLSchema"を指定してください。その他のスキーマ言語を指定した場合は，falseが戻ります。

4

SchemaFactoryクラスのnewSchema(Source[] schemas)メソッドの引数schemasの配列要素には，それぞれ異なるtargetNamespaceを持つスキーマ文書を指定してください。同一のtargetNamespaceを持つスキーマ文書，またはtargetNamespaceを持たないスキーマ文書を複数個指定すると，インデックスの小さい配列要素のスキーマ文書が優先されます。

5

次の条件でSchemaFactoryクラスのnewSchema(Source[] schemas)メソッドを実行すると，例外が発生しない場合があります。

引数schemasの配列要素が，正しいスキーマ文書と不正なスキーマ文書の両方を含んでいる。

この問題は，次のようにして回避できます。

SchemaFactoryオブジェクトのエラーハンドラで，error, fatalErrorメソッドに渡される例外オブジェクトを保存しておく。

newSchemaメソッドの呼び出し後に，1.で例外オブジェクトが保存されたかどうかチェックして，保存されていればその例外オブジェクトをスローする。

6

Validatorクラスのvalidateメソッドによって，ID型の属性の定義を含むスキーマ文書を用いてXML文書を検証する場合は，validate(DOMSource, DOMResult)ではなく，validate(SAXSource)，validate(DOMSource)，validate(SAXSource, SAXResult)のどれかのメソッドを使用してください。

7

次の条件がすべて重なるとき，Validatorクラスのvalidate(Source source, Result result)メソッドを実行すると，DOMException例外が発生する場合があります。

引数resultがDOMResultオブジェクトである。

DOMResultオブジェクトに設定された「結果ツリーを含むDOMノード」が子ノードを持つDocumentオブジェクトである。

したがって，2.のDocumentオブジェクトには子ノードを持たせないようにしてください。

8

スキーマ文書の中にxsd:ENTITY型，およびxsd:ENTITIES型が含まれるとき，ValidatorHandlerクラスを用いたスキーマ検証はサポートしていません。このような場合は，例えばValidatorクラスなどのほかの方法でスキーマ検証するようにしてください。

9

スキーマ文書で定義されていない要素および属性から取得したTypeInfoオブジェクトは，妥当性検証失敗時には，xsd:anyType型のTypeInfoオブジェクトと同じになります。

10

Validatorクラスのvalidate(Source)およびvalidate(Source, Result)の引数SourceにDOMSourceオブジェクトを指定する場合，DOMSourceオブジェクトが保持するNodeオブジェクトは，次に示すすべての条件に従う必要があります。

名前空間を有効に設定したパーサによって生成されている。

例えば，setNamespaceAware(true)を適用したDocumentBuilderFactoryで生成したDocumentBuilderなど。

妥当性検証をしないパーサによって生成されている。

例えば，setValidating (false)を適用したDocumentBuilderFactoryで生成したDocumentBuilderなど。

11

Validatorクラスのvalidate(Source)，validate(Source, Result)の引数SourceにSAXSourceオブジェクトを指定する場合に，そのSAXSourceオブジェクトがXMLReaderオブジェクトを使用するとき，XMLReaderオブジェクトは次に示すすべての条件に従う必要があります。

名前空間を有効に設定したXMLReaderオブジェクトである。

例えば，setNamespaceAware(true)を適用したSAXParserFactoryでSAXParserを生成し，そのSAXParserから取り出したXMLReaderオブジェクトなど。

妥当性検証をしないXMLReaderオブジェクトである。

例えば，setValidating (false)を適用したSAXParserFactoryでSAXParserを生成し，そのSAXParserから取り出したXMLReaderオブジェクトなど。

12

次の条件がすべて重なるとき，例外コードがNO_MODIFICATION_ALLOWED_ERRであるDOMException例外が発生する場合があります。

SchemaFactoryクラスのnewSchema(Source)およびnewSchema(Source[])の引数にDOMSourceオブジェクトを指定して，これらのメソッドを実行する。

1.のDOMSourceオブジェクトがラップしているDOMツリーを更新する。

13

javax.xml.validation.SchemaFactoryクラスのnewSchemaメソッドに，XMLReaderを設定したSAXSourceを指定する場合，指定するXMLReaderは次の条件に従う必要があります。

SAX2のフィーチャー"http://xml.org/sax/features/namespace-prefixes"の値が"true"である。

14

Validatorクラスのvalidate(Source, Result)メソッドの引数に，StAXSourceとStAXResultを指定する場合，StAXSourceとStAXResultには同じエンコーディングを指定してください。

15

［条件］

ValidatorHandlerに設定したContentHandlerのendElementイベントでjavax.xml.validation. TypeInfoProviderクラスのgetElementTypeInfo()メソッドを実行する場合です。

［XML Processorの動作］

IllegalStateException例外がスローされます。TypeInfoオブジェクトは返されません。

6.11　javax.xml.xpathパッケージに関する注意事項

javax.xml.xpathパッケージに関する注意事項を次の表に示します。

表6‒21　javax.xml.xpathパッケージに関する注意事項

項番

注意事項

1

マルチスレッドプログラミングをする場合，XPathFactoryクラスはスレッドセーフではありません。したがって，複数のスレッドが同時に同一のXPathFactoryインスタンスにアクセスしてはいけません。スレッド間の競合を避けるため，次のどちらかの方法を使用してください。

各スレッドに1つのXPathFactoryインスタンスを持つ。

各スレッドが排他的にXPathFactoryインスタンスにアクセスする。

2

マルチスレッドプログラミングをする場合，XPathFactoryクラスのnewInstanceメソッドで生成されるXPathインスタンス，およびXPathインタフェースのcompileメソッドで生成されるXPathExpressionインスタンスはスレッドセーフではありません。したがって，複数のスレッドが同時に同一のXPathインスタンス，およびXPathExpressionインスタンスにアクセスしてはいけません。スレッド間の競合を避けるため，次の方法を使用してください。

各スレッドに1つのXPathインスタンス，およびXPathExpressionインスタンスを持つ。

3

XPathFactoryクラスのnewInstance(String uri)メソッドの引数に指定可能なURIは"http://java.sun.com/jaxp/xpath/dom"だけです。

4

次のメソッドを用いて，コンテキストを参照するようなXPath式を評価する場合は，引数itemにnullではないコンテキストを指定してください。

XPathインタフェースのevaluate(String expression, Object item, QName returnType)メソッド

XPathインタフェースのevaluate(String expression, Object item)メソッド

XPathExpressionインタフェースのevaluate(Object item, QName returnType)メソッド

XPathExpressionインタフェースのevaluate(Object item)メソッド

5

この表の項番4で示したメソッドの引数itemには，Document，DocumentFragment，Element，Text，Attr，ProcessingInstruction，Commentのどれかのオブジェクトを指定してください。

6

XPathFunctionインタフェースを実装するクラスのevaluateメソッドの戻り値の型，および， XPathVariableResolverインタフェースを実装するクラスのresolveVariableメソッドの戻り値の型は，java.lang.String，java.lang.Boolean，java.lang.Number，org.w3c.Node，org.w3c.NodeListのどれかにしてください。

7

javax.xml.xpathパッケージのメソッドで例外が発生した場合，発生した例外オブジェクトにgetMessageメソッドを適用した戻り値がnullになり詳細メッセージを取得できないことがあります。この場合，例外オブジェクトにgetCauseメソッドを適用して「ラップされた例外オブジェクト」を取得し，これにgetMessageメソッドを適用することで，詳細なメッセージを取得できる場合があります。

8

and，or，mod，div演算子の前後には，空白を入れてください。

（例）"1000 div 10"

9

次のすべての条件が重なるXPath式はサポートしません。

| 演算子のオペランドのそれぞれにノードセットを返すXPath関数を指定して，ノードセットの和集合を作成する。

1.で作成したノードセットの和集合に述語を適用する。

10

次のすべての条件が重なるXPath式はサポートしません。

local-name，namespace-uri，nameのどれかの関数を使用する。

1.で示した関数の引数に次の式を指定する。

　　self::node()/descendant::prefix1:* (※)

この場合，1.で示した関数の引数を次の式に変更することで回避できます。

　　self::node()/self::node()/descendant::prefix1:* (※)

注※：prefix1は，任意の名前空間接頭辞を表します。

11

属性ノード，名前空間ノードにfollowing-sibling軸を適用したXPath式はサポートしません。

12

| 演算子のオペランドがロケーションセット以外のXPath式はサポートしません。

13

名前空間接頭辞と名前空間URIの組が等しい名前空間ノードが複数存在するとき，それらの名前空間ノードに軸を適用するXPath式はサポートしません。

14

値が重複したID型属性を含むXML文書に対してid関数を適用した場合，id関数の結果が不正になることがあります。

15

JDK17以降を使用している場合に，XPathインタフェースのevaluate(String expression, Object item, QName returnType)メソッドの第2引数にnullやノード数が0のNodeListを設定したとき，スローされるXPathExpressionExceptionに含まれる原因がNullPointerExceptionの詳細メッセージを含むTransformerExceptionになります。

6.12　org.w3c.domパッケージに関する注意事項

org.w3c.domパッケージに関する注意事項を次の表に示します。

表6‒22　org.w3c.domパッケージに関する注意事項

項番

注意事項

1

DOMConfigurationオブジェクトに設定可能なパラメタを表6-23に示します。設定可能なパラメタは，getParameterNamesメソッドの戻り値，およびcanSetParameterメソッドの戻り値とは一致しません。また，設定不可の値を設定しても，例外が発生しない場合があります。設定不可の値を設定した場合の動作は保証しません。

2

DOMConfigurationオブジェクトのパラメタ名は，大文字と小文字が区別されません。

3

DOM Level 3では，従来のDOM Level 2のインタフェースに対して新しいメソッドが追加されています。例えば，AttrインタフェースにはisIdメソッドが追加されています。通常のアプリケーションプログラムがこれらのインタフェースをimplementsすることはありませんが，もしimplementsしている場合は，DOM Level 3で追加されたメソッドの実装をアプリケーションに追加する必要があります。

4

XMLSchemaで属性のデフォルト値を定義して，その属性に対応するAttrノードを削除したとき，getSpecifiedメソッドの戻り値がfalseである属性ノードは生成されません。

5

DocumentオブジェクトのnormalizeDocumentメソッドはサポートしていません。

6

DocumentオブジェクトのadoptNodeメソッドはサポートしていません。代わりに，DocumentオブジェクトのimportNodeメソッドとNodeオブジェクトのremoveChildメソッドを組み合わせて使用してください。

7

DocumentオブジェクトのgetInputEncodingメソッドおよびEntityオブジェクトのgetInputEncodingメソッドはサポートしていません。

8

次の条件がすべて重なるとき，DocumentオブジェクトのrenameNode(Node n, String namespaceURI, String qualifiedName)メソッドを実行してもDOMException例外は発生しません。

引数nが名前空間をサポートしないAttrオブジェクトである。

引数namespaceURIがnullである。

引数qualifiedNameが不正な修飾名である。

また，引数nにElementまたはAttrオブジェクトを指定し，かつ，引数qualifiedNameにnullを指定した場合，DOMException例外ではなくNullPointerException例外が発生します。

9

Attrオブジェクト，Textオブジェクト，EntityReferenceオブジェクト，CDATASectionオブジェクト，DocumentTypeオブジェクト，DocumentFragmentオブジェクトのgetBaseURIメソッドではURIの取得ができません。

10

TextオブジェクトのreplaceWholeText(String)メソッドはEntityReferenceノードを含まないDOMツリーに適用してください。

11

DOMLocatorオブジェクトのgetByteOffsetの戻り値は常に-1です。

12

DOMErrorHandlerオブジェクトのhandleErrorメソッドの引数DOMErrorにgetRelatedDataメソッドを適用したときの戻り値のオブジェクトは，Nodeオブジェクトとは限りません。エラーメッセージを表すStringオブジェクトが戻り値となる場合があります。

13

パースして取得したDocumentオブジェクトに対して，insertBeforeメソッドまたはappendChildメソッドで不当なノードを追加した場合でも，DOMException例外が発生しないことがあります。

14

次のすべての条件に該当する場合，要素ノードに対するgetSchemaTypeInfoメソッド呼び出しの戻り値が不正になります。

XMLスキーマ文書でunionによる派生型の要素を定義する。

1.のスキーマ文書を使って妥当性検証パースを実施する。

2.によって作成したDOMから，1.に該当する要素ノードを取得し，getSchemaTypeInfoメソッドを呼び出す。

表6‒23　DOMConfigurationオブジェクトに設定可能なパラメタ

パラメタの名前

設定可能な値

canonical-form

false

cdata-sections

true，false

check-character-normalization

false

comments

true，false

datatype-normalization

false

element-content-whitespace

true

entities

true，false

error-handler

DOMErrorHandlerオブジェクト

infoset

true，false

namespaces

true

namespace-declarations

true，false

normalize-characters

false

schema-location

設定できません。

schema-type

設定できません。

split-cdata-sections

true，false

validate

false

validate-if-schema

false

well-formed

true

resource-resolver

LSResourceResolverオブジェクト

6.13　org.w3c.dom.bootstrapパッケージに関する注意事項

org.w3c.dom.bootstrapパッケージに関する注意事項を次の表に示します。

表6‒24　org.w3c.dom.bootstrapパッケージに関する注意事項

項番

注意事項

1

DOMImplementationRegistryクラスのgetDOMImplementationメソッド，およびgetDOMImplementationListメソッドの引数とする文字列には空文字列以外を指定してください。

6.14　org.w3c.dom.lsパッケージに関する注意事項

org.w3c.dom.lsパッケージに関する注意事項を次の表に示します。

表6‒25　org.w3c.dom.lsパッケージに関する注意事項

項番

注意事項

1

DOMImplementationLSインタフェースのcreateLSParser(short mode, String schemaType)メソッドの引数modeにはDOMImplementationLS. MODE_SYNCHRONOUSだけを指定できます。また，引数schemaTypeにはnull，"http://www.w3.org/2001/XMLSchema"，"http://www.w3.org/TR/REC-xml"のどれかを指定できます。

2

LSParserオブジェクトにgetDomConfigメソッドを適用して得られるDOMConfigurationオブジェクトに設定可能なパラメタを表6-26に示します。これに加えて，「6.12　org.w3c.domパッケージに関する注意事項」の表6-23に示したパラメタも設定可能です。設定可能なパラメタは，getParameterNamesメソッドの戻り値，およびcanSetParameterメソッドの戻り値とは一致しません。また，設定不可の値を設定しても，例外が発生しない場合があります。設定不可の値を設定した場合の動作は保証しません。

3

LSParserオブジェクトのcharset-overrides-xml-encodingパラメタに値を設定しても，無視されます。

4

LSParserインタフェースのparseWithContextメソッドはサポートしていません。

5

LSParserオブジェクトのsetNewLineメソッドはサポートしていません。

6

LSParserオブジェクトでは，XML1.1文書を解析できません。

7

LSParserオブジェクトのstartElementメソッドは，ルート要素については呼び出されません。

8

LSParserオブジェクトでの解析時，およびLSSerializerオブジェクトでの直列化時にLSException例外が発生したとき，getMessage()メソッドの戻り値がnullになる場合があります。この場合は，LSParserFilterやLSSerializerFilterのユーザ実装クラスで例外が発生している可能性があります。

9

LSSerializerオブジェクトにgetDomConfigメソッドを適用して得られるDOMConfigurationオブジェクトに設定可能なパラメタを表6-27に示します。これに加えて，「6.12　org.w3c.domパッケージに関する注意事項」の表6-23に示したパラメタも設定可能です。設定可能なパラメタは，getParameterNamesメソッドの戻り値，およびcanSetParameterメソッドの戻り値とは一致しません。また，設定不可の値を設定しても，例外が発生しない場合があります。設定不可の値を設定した場合の動作は保証しません。

10

LSSerializeオブジェクトのwrite，writeToString，およびwriteToURIメソッドの引数nodeArgに，Document，DocumentFragment，Element以外のノードを指定した場合，それらのノードは直列化されません。

11

LSSerializeオブジェクトのwrite，writeToString，およびwriteToURIメソッドは，名前空間が無効なノードを直列化できません。

12

LSSerializerインタフェースのgetNewLineメソッドで得られる行末シーケンス文字のデフォルト値は，"¥n"です。

13

ProcessingInstructionオブジェクトが持つ処理命令の内容に文字列「?>」が含まれるとき，そのProcessingInstructionオブジェクトを直列化してもエラーは通知されません。

14

LSParserでパースした場合，Documentオブジェクトから取得したDocumentTypeオブジェクトの内容を変更してもDOMException例外が発生しないことがあります。

表6‒26　DOMConfigurationオブジェクトに設定可能なパラメタ（LSParserオブジェクト）

パラメタの名前

設定可能な値

charset-overrides-xml-encoding

true，false

disallow-doctype

false

ignore-unknown-character-denormalizations

true

supported-media-types-only

false

表6‒27　DOMConfigurationオブジェクトに設定可能なパラメタ（LSSerializerオブジェクト）

パラメタの名前

設定可能な値

discard-default-content

true，false

format-pretty-print

false

ignore-unknown-character-denormalizations

true

xml-declaration

true，false

6.15　org.xml.sax.extパッケージに関する注意事項

org.xml.sax.extパッケージに関する注意事項を次の表に示します。

表6‒28　org.xml.sax.extパッケージに関する注意事項

項番

注意事項

1

Attributes2ImplクラスのaddAttributeメソッドはサポートしていません。

代わりに，AttributesImplクラスのaddAttributeメソッドを使用し，アプリケーションを次のように変更してください。

（変更前）

Attributes2Impl myAtt = new Attributes2Impl();

String type = "ID";

myAtt.addAttribute("http://hitachi-xmlprocessor.com/", "attr", "ht:attr", type, "value");

:

（変更後）

AttributesImpl myAtt = new AttributesImpl();

String type = "ID";

myAtt.addAttribute("http://hitachi-xmlprocessor.com/", "attr", "ht:attr", type, "value");

Attributes2Impl myAtt2 = new Attributes2Impl(myAtt);

int position = myAtt2.getLength() -1;

myAtt2.setSpecified(position, true);

myAtt2.setDeclared (position, !"CDATA".equals(type));

:

2

Locator2ImplクラスのgetXMLVersionメソッド，getEncodingメソッドはサポートしていません。

6.16　XIncludeに関する注意事項

XIncludeに関する注意事項を次の表に示します。

表6‒29　XIncludeに関する注意事項

項番

注意事項

1

xi:include要素のxpointer属性に指定可能なスキーマは，element()スキーマと簡略ポインタだけです。

2

xi:include要素のxpointer属性に簡略ポインタを指定する場合，その簡略ポインタは「DTDでID型と定義した属性」の属性値である必要があります。「XML Schemaでxsd:ID型と定義した属性」の属性値は指定できません。

6.17　実装依存仕様に関する注意事項

XML Schemaの実装に依存した仕様を次の表に示します。

表6‒30　データ型に関する実装依存仕様

データ型

最大値

最大桁数

duration型

(形式：PnYnMnDTnHnMnS)

nY(年)

○

−

nM(月)

○

nD(日)

○

nH(時)

○

nM(分)

○

nS(秒)

1秒以上

○

1秒未満

○

date型

(形式：CCYY-MM-DD)

CCYY

("9999"を超える場合，桁数の追加ができる)

○

gYearMonth型

(形式：CCYY-MM)

gYear型

(形式：CCYY)

dateTime型

(形式：CCYY-MM-DDThh:mm:ss)

CCYY

("9999"を超える場合，桁数の追加ができる)

1秒未満

(ssに続く，小数点以下に1秒未満の値を指定できる)

○

time型

(形式：hh:mm:ss)

1秒未満

(ssに続く，小数点以下に1秒未満の値を指定できる)

○

base64Binary型

△

◎

hexBinary型

◎

decimal型

◎

integer型

◎

nonPositiveInteger型

◎

nonNegativeInteger型

◎

negativeInteger型

◎

positiveInteger型

◎

（凡例）

○：指定できる値は，最大2147483647です。

△：指定する値の最大値の規定はありません。

◎：指定できる最大桁数は，メモリに依存します。

−：該当しません。

表6‒31　制約ファセットに関する実装依存仕様

制約ファセット

最大値

最大桁数

length

○

−

minLength

○

maxLength

○

totalDigits

○

fractionDigits

○

maxInclusive

△

◎

maxExclusive

◎

minInclusive

◎

minExclusive

◎

（凡例）

○：指定できる値は，最大2147483647です。

△：指定する値の最大値の規定はありません。

◎：指定できる最大桁数は，メモリに依存します。

−：該当しません。

表6‒32　出現回数の指定に関する実装依存仕様

出現回数の指定

最大値

最大桁数

minOccurs

○

−

maxOccurs

○

（凡例）

○：指定できる値は，最大2147483647です。

−：該当しません。

6.18　スキーマキャッシュ機能に関する注意事項

スキーマキャッシュ機能に関する注意事項を次に示します。

6.18.1　性能に関する注意事項

ディスクキャッシュを使用した場合，キャッシュをファイルから読み込んでオブジェクトに展開する処理の分だけ，オーバーヘッドが大きくなります。そのため，キャッシュを使用しない場合より性能が低下することがあります。

6.18.2　エラー出力に関する注意事項

キャッシュの構築中に発生したエラーは，標準エラー出力ストリームではなく，エラーファイルに出力されます。エラーファイルに出力された内容を確認するには，J2EEサーバの起動後にcachestateコマンドに-dオプションを指定して実行し，エラー情報を出力してください。

6.18.3　スキーマ定義ファイルに関する注意事項

スキーマ定義ファイルに関する注意事項を次の表に示します。

表6‒33　スキーマ定義ファイルに関する注意事項

項番

注意事項

1

schema_xxxプロパティの設定値の末尾に記載された",D"は，ディスクキャッシュ指定子と見なされるため，",D"で終わるスキーマ文書ファイル名は使用しないでください。

2

xsd:importによって参照されるスキーマ文書は，スキーマ定義ファイルの指定とは関係なく，常にメモリ上にキャッシュされます。xsd:includeまたはxsd:redefineによって参照されるスキーマ文書は，参照元のスキーマ文書のgrammarオブジェクトに吸収されるため，キャッシュ場所（メモリまたはディスク）も参照元のスキーマ文書と同じになります。

3

検証で使用するスキーマ文書が，http://java.sun.com/xml/jaxp/properties/schemaSourceプロパティで「InputStream」および「オブジェクトの配列」の形で指定された場合，検証時にキャッシュが使用されません。

キャッシュを使用できるのは，スキーマ文書が「String」，「File」，「InputSource」のどれかの形で指定された場合だけです。ただし，InputSourceの場合，getSystemIdメソッドでシステム識別子が取得できる必要があります。

4

キャッシュの構築中にパースエラーが発生した場合，エラーレベルにかかわらず，エラーの原因となったスキーマ文書およびその文書を参照するスキーマ文書はキャッシュされません。

5

＜JAXP_DIR＞※の下のcache_infoディレクトリ（INFOディレクトリ）以下には，スキーマキャッシュ機能がキャッシュ構築・削除で使用する内部ファイル（INFOファイル）が格納されます。このため，＜JAXP_DIR＞※のディスク使用量が100%を超えた場合，キャッシュ機能が正常に動作しなくなるおそれがあります。

6

diskcache_pathプロパティで指定したディレクトリ以下のディレクトリやファイルは，スキーマキャッシュ機能によって変更・削除されます。そのため，diskcache_pathプロパティにはシステムが使用するディレクトリを指定しないでください。

7

エンティティリゾルバを使用して，外部参照の解決を行う必要のあるXMLスキーマ文書をスキーマ定義ファイルに指定した場合，キャッシュ構築時に外部参照の解決が行えません。そのため，スキーマ文書の解析に失敗し，キャッシュが構築されません。

注※

Application Serverをインストールしたディレクトリ下の，jaxpディレクトリのことです。

6.18.4　キャッシュの再構築・削除に関する注意事項

キャッシュの再構築・削除に関する注意事項を次の表に示します。

表6‒34　キャッシュの再構築・削除に関する注意事項

項番

注意事項

1

キャッシュの再構築時は，スキーマ定義ファイルに指定されたすべてのスキーマ文書を解析してgrammarオブジェクトを構築するため，パース処理に掛かる時間が増加します。

このため，cacheonコマンド実行後の最初のパースは，通常よりも処理に時間が掛かります。

2

キャッシュの再構築時，およびJ2EEサーバ起動・終了時には，diskcache_pathで指定したディレクトリ以下にある，J2EEサーバ名と同じ名前のディレクトリが削除されます。このため，diskcache_pathで指定したディレクトリに，J2EEサーバ名と同じ名前のファイルまたはディレクトリを生成しないでください。

3

キャッシュ構築後に，スキーマ定義ファイルのdiskcache_pathのディレクトリ指定を変更した場合，J2EEサーバの終了時や，cacheoffコマンドおよびcacheonコマンド実行時にディスクキャッシュが削除されないおそれがあります。その場合，残っているファイルを手動で削除してください。

6.19　高速パース機能に関する注意事項

高速パース機能に関する注意事項を次に示します。

6.19.1　解析結果オブジェクトの設定に関する注意事項

表6‒35　高速パース機能に関する注意事項（解析結果オブジェクトの設定）

項番

注意事項

1

事前解析時の名前空間の有効・無効は，解析時の名前空間の有効・無効に合わせる必要があります。これらが異なる場合，解析結果が不正になるおそれがあります。

2

エンティティ参照を解決するとき，事前解析時のエンティティリゾルバで解決した結果と，解析時のエンティティリゾルバで解決した結果は一致している必要があります。これらの結果が異なる場合，高速化の効果が得られないおそれがあります。

6.19.2　解析結果オブジェクトを利用するXMLパーサに関する注意事項

表6‒36　高速パース機能に関する注意事項（解析結果オブジェクトを利用するXMLパーサ）

項番

注意事項

1

解析結果オブジェクトを利用するパーサの次のフィーチャーをfalseに設定した場合，高速化の効果が得られない場合があります。

http://xml.org/sax/features/external-general-entities

http://xml.org/sax/features/external-parameter-entities

6.19.3　XML1.1に関する注意事項

表6‒37　高速パース機能に関する注意事項（XML1.1）

項番

注意事項

1

高速パース機能では，XML1.1はサポートしていません。このため，XML1.1文書を事前解析するとエラーが発生します。また，XML1.1文書を高速パース機能の対象に設定しても，高速パース機能は適用されません。

6.19.4　XIncludeに関する注意事項（高速パース機能）

表6‒38　高速パース機能に関する注意事項（XInclude）

項番

注意事項

1

XIncludeで取り込むファイルの解析に対しては，高速パース機能は適用されません。

6.19.5　絶対パスの指定方法に関する注意事項

表6‒39　高速パース機能に関する注意事項（絶対パスの指定方法）

項番

注意事項

1

絶対パスを指定する場合は，パス区切り文字に"/"を使用してください。

2

Windowsの場合，絶対パスにはドライブ名を含めてください。

Windowsの場合とUNIXの場合の，絶対パスの指定例を次に示します。

Windowsの場合

D:/home/xml/training/training1.xml

UNIXの場合

/home/xml/training/training1.xml

6.19.6　事前解析用XML文書に関する注意事項

表6‒40　高速パース機能に関する注意事項（事前解析用XML文書）

項番

注意事項

1

事前解析用XML文書に記述できる要素名および属性名の長さには上限があります。事前解析用XML文書に記述されている最も長い要素名および属性名の文字数を足した長さ※が21,000文字を超える場合，KECX09607-Eのエラーが発生して処理が中止されることがあります。メッセージの詳細については，マニュアル「アプリケーションサーバ メッセージ(構築／運用／開発用)」の「11.　KECX（XML Processorが出力するメッセージ）」を参照してください。

注※

例えば，次のXML文書では，最も長い要素名（elementまたはcontent）の文字数は7で，最も長い属性名（index）の文字数は5なので，これらを足した文字数は12になります。

6.19.7　チューニング情報に関する注意事項

表6‒41　高速パース機能に関する注意事項（チューニング情報）

項番

注意事項

1

パース対象XML文書のシステム識別子のパス区切り文字には"/"を使用してください。

2

コンストラクタ引数に相対パスを指定して作成したFileオブジェクトを，PreparsedObjectFactoryクラスのnewPreparsedObjectメソッドに指定すると，チューニングサマリファイルおよび詳細ファイルに出力される事前解析用XML文書のファイル名のパス区切り文字が，次に示すように重複して出力される場合があります。

Preparsed XML: C:¥¥a.xml

6.19.8　解析性能に関する注意事項

表6‒42　高速パース機能に関する注意事項（解析性能）

項番

注意事項

1

外部エンティティ参照を含むXML文書に高速パース機能を適用すると，通常の解析と比べ，解析性能が向上しない場合があります。外部エンティティ参照を含むXML文書に高速パース機能を適用する場合は，事前に性能評価を行ってください。

6.20　JAXBに関する注意事項

JAXBに関する注意事項を次に示します。

6.20.1　共通の注意事項

共通の注意事項を次の表に示します。

表6‒43　JAXBに関する注意事項（共通）

項番

注意事項

1

JAXB仕様書が規定するメソッドがスローする例外オブジェクトにgetMessageメソッドを適用すると戻り値がnullになり，詳細メッセージを取得できないことがあります。この場合，例外オブジェクトにgetCauseメソッドを適用して「ラップされた例外オブジェクト」を取得し，これにgetMessageメソッドを適用することで，詳細なメッセージを取得できる場合があります。また，JAXBException例外およびそのサブクラスの場合は，toStringメソッドを適用することで，詳細なメッセージを取得できる場合があります。

2

JAXB仕様書では，メソッド，スキーマコンパイラ，スキーマジェネレータの動作が明確に定義されていない個所があります。この場合，動作は実装に依存します。また，引数にnullを指定した場合，JavadocではNullpointerException以外の例外が発生すると規定されていても，この実装ではNullPointerExceptionが発生することがあります。引数の事前チェックをするなどの手段によって，動作が規定されていない状態にならないようにしてください。

（例1）Javadocの例外欄に示されていない種別の例外が発生する（引数にnullを指定した場合，NullPointerExceptionが発生するなど）。

（例2）スキーマコンパイラの動作が規定されていない状態で生成したJavaソースを用いてマーシャル，アンマーシャルを実行したとき，動作は規定されません。

3

ISO-10646-UCS-4エンコーディングは使用できません。

4

バージョンが1.1のXML文書は使用できません。

5

Unicodeの補助文字は使用できません。

6

ユーザアプリケーションにJAXB1の実装を同梱することはできません。

6.20.2　スキーマコンパイラに関する注意事項

スキーマコンパイラに関する注意事項を次の表に示します。

項番1〜項番28の注意事項に該当するスキーマは，スキーマコンパイラで処理しないでください。項番29〜項番44については，注意事項に留意して使用してください。

表6‒44　JAXBに関する注意事項（スキーマコンパイラ）

項番

注意事項

1

［条件］

繰り返し指定のある内容モデルに次のすべての条件が該当する場合です。

nillable="true"を指定した要素定義が存在する。

内容モデルがmixedではなく，ワイルドカードを含まない。

内容モデルの要素定義がxs:listやxs:IDREFのxmlデータ型またはxs:listやxs:IDREFから派生したデータ型を持っていない。

内容モデルのすべての要素定義に対し，型が同じJavaデータ型にバインドされる二つの異なった要素定義が存在しない。

（例）

<xs:complexType>

　<xs:sequence maxOccurs="unbounded">

　　<xs:element name="A" type="xs:string" />

　　<xs:element name="B" type="xs:int" nillable="true" />

　　<xs:element name="C" type="xs:float" nillable="true"/>

　　<xs:element name="D" type="xs:double" />

　 </xs:sequence>

</xs:complexType>

［XML Processorの動作］

コレクションの最適化を適用します。@XmlElementRefs/@XmlElementRefではなく@XmlElements/@XmlElementでアノテートされたコレクションを出力します。この出力javaソースを使用してアンマーシャル・マーシャルを実行した場合，不正な動作をすることがあります。

2

［条件］

次のすべての条件に該当する場合です。

xs:schema要素のtargetNamespace属性に「www.com1.hitachi」などWindowsの予約デバイス名を含む。

Windows上でスキーマコンパイラを実行する。

［XML Processorの動作］

エラーが発生します。

（例）

[ERROR] .¥hitachi¥com1¥ObjectFactory.java（指定されたパスが見つかりません。[errno=3, syscall=CreateFileW]）

3

［条件］

xs:schema要素のtargetNamespace属性に指定したURIを":"または"/"で分割した文字列の先頭文字が，次のすべての条件に該当する場合です。

Character.isJavaIdentifierStartの戻り値がfalseとなる。

Character.isJavaIdentifierPartの戻り値がfalseとなる。

［XML Processorの動作］

不正なパッケージ名であるというエラーが発生します。

（例）

[ERROR] The package name 'publicid.__-.w3c.dtd_html_4_01.en' used for this schema is not a valid package name.

4

［条件］

xs:schema要素のtargetNamespace属性およびxmlns属性に指定するURIが，次の文字だけで構成されている場合です。

ピリオド(.)

スラッシュ(/)

文字列"www"

［XML Processorの動作］

java.lang.ArrayIndexOutOfBoundsExceptionなどの，規定されていない例外が発生する場合があります。

5

［条件］

次のどちらかの条件に該当する場合です。

繰り返し指定のない内容モデルにxs:any要素が複数存在する。

複合型の拡張で，基底型と拡張型の両方が要素内容としてxs:any型を含んでいる。

［XML Processorの動作］

1つの一般的内容プロパティではなく，複数のプロパティの生成を試みて，エラーが発生します。一般的内容プロパティの詳細については，JSR 222 The Java Architecture for XML Binding 2.1の6.12.3を参照してください。

（例）

[ERROR] Property "Any" is already defined. Use &lt;jaxb:property> to resolve this conflict.

なお，jaxb:propertyカスタムバインディングを指定し，複数の@XmlAnyElement注釈されたプロパティを出力したjavaソースを使用してアンマーシャル・マーシャルを実行した場合，不正な動作をすることがあります。

6

［条件］

次のどちらかの条件に該当する場合です。

型を派生したとき，派生した型のcomplexType要素のmixed属性の属性値が"true"である。

型を派生したとき，基底型のmixed属性の属性値が"true"である。

［XML Processorの動作］

派生した型の子要素を取得するメソッドが生成されません。

7

［条件］

次のすべての条件に該当する場合です。

xs:simpleType要素に対して，jaxb:typesafeEnumMemberを子要素として持つjaxb:typesafeEnumClassカスタムバインディングが存在する。また，jaxb:typesafeEnumMemberにはname属性が指定されている。

1.のxs:simpleTypeの下位要素であるxs:enumeration要素に対してjaxb:typesafeEnumMemberカスタムバインディングが指定されていて，name属性が指定されている。

1.と2.のname属性の属性値が異なる。

［XML Processorの動作］

条件1.のname属性を基に，Javaクラスの列挙定数名を生成します。

8

［条件］

次のどれかに示すXMLスキーマ要素に，カスタムバインディングを指定する場合です。

xs:attributeGroup要素にjaxb:typesafeEnumClassを指定する。

xs:complexContent要素の子要素であるxs:extension要素にjaxb:typesafeEnumClassを指定する。

xs:simpleType要素の子要素であるxs:restriction要素，またはその子要素のxs:maxExclusive/xs:maxInclusive/xs:minExclusive/xs:maxLength/xs:patternファセットにjaxb:typesafeEnumClass/jaxb:typesafeEnumMember/jaxb:propertyを指定する。

xs:restriction要素の子要素のxs:totalDigits/xs:whiteSpaceファセットにjaxb:schemaBindingsを指定する。

［XML Processorの動作］

このようなスキーマ文書を用いた場合のJAXB実行時の動作は規定されていません。

9

［条件］

次のすべての条件に該当する場合です。

map属性が"false"であるようなjaxb:schemaBindingsカスタムバインディングが存在する。

jaxb:classまたはjaxb:typesafeEnumClassカスタムバインディングが存在する。

［XML Processorの動作］

カスタムバインディングが不正であるというエラーが出力されます。

（例）

[ERROR] compiler was unable to honor this class customization. It is attached to a wrong place, or its inconsistent with other bindings.

10

［条件］

匿名複合型で型定義されている局所要素定義（＝xs:complexTypeを子要素として持つxs:element）に対しjaxb:classカスタムバインディングを指定する場合です。

［XML Processorの動作］

エラーが出力されます。

（例）

Exception in thread "main" java.lang.IllegalArgumentException: Illegal class inheritance loop. Outer class <要素名> may not subclass from inner class: <要素名>

11

［条件］

複合型定義のxs:restrictionの中で指定されたxs:choice, xs:sequenceまたはxs:allに対し，jaxb:propertyカスタムバインディングを指定する場合です。

［XML Processorの動作］

エラーが出力されます。

（例）

[ERROR] compiler was unable to honor this property customization. It is attached to a wrong place, or its inconsistent with other bindings.

12

［条件］

次のすべての条件に該当する場合です。

xs:complexType要素にjaxb:typesafeEnumClassカスタムバインディングを指定する。

1.のカスタムバインディング指定のmap属性に"true"または"1"または"0"を指定する。

［XML Processorの動作］

KECX06051-E cvc-enumeration-valid: Value 'true' is not facet-valid with respect to enumeration '[false]'. It must be a value from the enumeration.が発生します。

map属性に指定した"true"は正しい値ですが，xs:complexType要素にjaxb:typesafeEnumClassカスタムバインディングを指定すること自体が不正です。

13

［条件］

次のどちらかの条件に該当する場合です。

jaxb:propertyのcollectionType属性に次のどれかを指定する。

・空文字列

・java.util.Listを実装していないクラス

・java.util.Listを実装しているが，完全修飾でないクラス

jaxb:globalBindingsのcollectionType属性に次のどちらかを指定する。

・java.util.Listを実装していないクラス

・java.util.Listを実装しているが，完全修飾でないクラス

［XML Processorの動作］

エラーは発生しないで，javaクラスが生成されます。

14

［条件］

jaxb:globalBindingsのcollectionType属性に空文字列を指定する場合です。

［XML Processorの動作］

java.lang.StringIndexOutOfBoundsException例外をスローします。

15

［条件］

次のどれかの条件に該当する場合です。

jaxb:classカスタムバインディングで次の両方の属性を指定する。

・ref属性

・排他であるname属性

jaxb:classカスタムバインディングで次の両方の属性を指定する。

・ref属性

・排他であるimplClass属性

jaxb:typesafeEnumClassカスタムバインディングで次の両方の属性を指定する。

・ref属性

・排他であるname属性

jaxb:typesafeEnumClassカスタムバインディングで次の両方の属性を指定する。

・ref属性

・排他であるmap属性

［XML Processorの動作］

エラーは発生しません。このような場合のJAXB実行時の動作は規定されていません。

16

［条件］

次のすべての条件に該当する場合です。

xs:element大域要素定義，またはxs:element局所要素定義に，jaxb:classカスタムバインディングを指定する。

jaxb:classカスタムバインディングでimplClass属性を指定する。

［XML Processorの動作］

エラーは発生しません。このような場合のJAXB実行時の動作は規定されていません。

17

［条件］

次のすべての条件に該当する場合です。

列挙ファセットのxs:simpleType定義に，jaxb:typesafeEnumClassカスタムバインディングを指定する。

jaxb:typesafeEnumClassのmap属性に"true"，"1"，または"0"を指定する。

［XML Processorの動作］

エラーが出力されます。map属性を指定していない場合，デフォルトの動作は，"true"または"1"を指定したときの動作となります。

18

［条件］

次のすべての条件に該当する場合です。

局所または大域属性宣言に対して，jaxb:propertyカスタムバインディングを指定する。

generateElementProperty属性に"true"，"false"，"1"，または"0"を指定する。

［XML Processorの動作］

エラーは出力されないで，プロパティを含むjavaソースが出力されます。

19

［条件］

次のすべての条件に該当する場合です。

同じ型でname属性が異なる複数の要素宣言に対して，jaxb:propertyカスタムバインディングを指定する。

generateElementProperty属性に"false"を指定する。

［XML Processorの動作］

エラーは出力されないで，JAXBElementを含むjavaソースが出力されます。

20

［条件］

次のどちらかの条件に該当する場合です。

jaxb:baseType要素のname属性に，デフォルト基底型と同じ継承階層にないクラスを指定する。

jaxb:baseType要素のname属性に，完全修飾されたJavaクラス名ではないクラスを指定する。

［XML Processorの動作］

エラーは出力されないで，javaソースが出力されます。

21

［条件］

jaxb:propertyカスタムバインディングのattachmentRef属性を使用する場合です。

［XML Processorの動作］

スキーマコンパイル中に次のエラーが出力されます。

[ERROR] KECX06031-E cvc-complex-type.3.2.2: Attribute 'attachmentRef' is not allowed to appear in element 'jaxb:property'.

22

［条件］

jaxb:globalBindingsカスタムバインディングのunderscoreBinding属性に，"asWordSeparator"または"asCharInWord"以外の文字列を指定する場合です。

［XML Processorの動作］

NullPointerException例外をスローします。

23

［条件］

jaxb:globalBindingsカスタムバインディングのtypesafeEnumMemberName属性に，"skipGeneration"を指定する場合です。

［XML Processorの動作］

次のエラーが出力されます。

KECX06051-E cvc-enumeration-valid: Value 'skipGeneration' is not facet-valid with respect to enumeration '[generateError, generateName]'. It must be a value from the enumeration.

［回避策］

typesafeEnumMemberName属性を指定しない場合，デフォルトの動作は"skipGeneration"の動作となります。

24

［条件］

次のjaxb:globalBindingsカスタムバインディングのカスタム化指定を，複数指定した場合です。

name属性の値が異なるxmlType属性で，そのxmlType属性の値が同じjaxb:javaType

uid属性の値が異なるjaxb:serializable

［XML Processorの動作］

このような場合のJAXB実行時の動作は規定されていません。

25

［条件］

次のすべての条件に該当する場合です。

jaxb:globalBindingsカスタムバインディングのoptionalProperty属性に，"primitive"を指定する。

スキーマに，次のどれかのローカル要素定義がある。

・minOccurs="0"が指定されているプリミティブ型の要素

・xs:choiceの中で定義されたプリミティブ型の要素

［XML Processorの動作］

primitive型ではなく，ラッパークラス型で出力されます。

26

［条件］

次のすべての条件に該当する場合です。

jaxb:globalBindingsカスタムバインディングのgenerateElementProperty属性に，"false"を指定する。

スキーマに同一の型で異なる名前の要素が複数存在するなど，JAXBElement型のプロパティとなる指定が存在する。

［XML Processorの動作］

エラーは発生しません。このような場合のJAXB実行時の動作は規定されていません。

27

［条件］

バイナリ型の単純内容を持ったxs:complexTypeに，jaxb:inlineBinaryDataを指定する場合です。

［XML Processorの動作］

カスタムバインディングが不正であるというエラーが出力されます。

（例）

[ERROR] compiler was unable to honor this inlineBinaryData customization. It is attached to a wrong place, or its inconsistent with other bindings.

28

［条件］

次のどれかの条件に該当する場合です。

jaxb:javaTypeのname属性に，存在しないjavaデータ型を指定する。

jaxb:javaTypeのparseMethod属性，またはprintMethod属性を指定し，name属性にプリミティブ型を指定する。

jaxb:javaTypeのname属性に，String型の1つの引数を持つコンストラクタが定義されていないjavaデータ型を指定する。

［XML Processorの動作］

エラーは発生しません。

29

標準仕様では，カスタムバインディングjaxb:javadocを用いることで，生成されるJavaクラスのドキュメンテーションコメントの内容をカスタマイズする方法が規定されています。jaxb:javadocを指定しない場合でも，デフォルトのドキュメンテーションコメントが生成されますが，その内容は標準仕様では規定されていません。

30

［条件］

xs:totalDigits，xs:maxExclusive，xs:maxInclusive，xs:minExclusive，xs:minInclusiveファセットのどれかで指定された範囲が，intまたはlongの範囲に収まるような単純型定義が存在する場合です。

［XML Processorの動作］

xs:totalDigitsファセットを用いた場合は，常にjava.math.BigIntegerが生成されます。

xs:maxExclusive，xs:maxInclusive，xs:minExclusive，xs:minInclusiveファセットを用いた場合は，JSR 222 The Java Architecture for XML Binding 2.1の6.2.2に示されているアルゴリズムに従ってJava型が生成されます。

31

［条件］

次のどれかを含むモデルグループ定義が存在する場合です。

匿名の複合型定義

enum typeにマップされるxs:enumerationファセット定義

要素クラスにマップされる内容モデル

［XML Processorの動作］

作成されるクラス名に，モデルグループ名は付けられません。

32

［条件］

xs:element局所要素定義にjaxb:classカスタムバインディングを指定する場合です。

［XML Processorの動作］

JAXBElement<T>を継承する，作成されたクラスを返す要素ファクトリメソッドを作成します。

（例）

public class ObjectFactory {

　public Base.Bar createBaseBar(String value) {

　　return new Base.Bar(value);

　}

　・・・・

}

注

Base.Barは，JAXBElement<T>を継承したクラスです。

33

［条件］

次のすべての条件に該当する場合です。

xs:element大域要素定義が存在する。

1.のabstract属性の値が"true"である。

［XML Processorの動作］

要素定義に対応する要素ファクトリメソッドは生成されますが，そのファクトリメソッドを使用してインスタンスを生成できません。

34

［条件］

スキーマ文書が次のどちらかに該当する場合です。

内容モデルに，要素名が同じで名前空間が異なる要素定義が指定されている。

内容モデルに，要素名が「classまたはClass」と「clazzまたはClazz」である要素定義が，両方とも含まれる。

［XML Processorの動作］

名前衝突エラーにならないで，@XmlElementRef/@XmlElementRefsでアノテートされた一般的内容リストとして処理されます。内容リストの詳細については，JSR 222 The Java Architecture for XML Binding 2.1の6.12.3を参照してください。

35

［条件］

xs:anyのprocessContents属性に"lax"または"skip"を指定する場合です。

［XML Processorの動作］

バインドされるプロパティのデータ型は，processContents属性が"lax"の場合，java.lang.Object型，"skip"の場合org.w3c.dom.Element型となります。

36

［条件］

xs:element要素のfixed属性を指定する場合です。

［XML Processorの動作］

指定したfixed属性の値は，生成されるJavaソースの@XmlElementおよび@XmlElementDeclのdefaultValue要素に反映されません。

［回避策］

fixed属性の値をデフォルト値として反映させたい場合は，fixed属性ではなくdefault属性を指定してください。

37

［条件］

xs:enumeration要素のvalue属性に，生成されるjava定数識別子が衝突するような文字列を指定する場合です。

（例）

「name-with-dashes」と「name_with_dashes」

［XML Processorの動作］

列挙定義を出力しません。エラーは発生しません。

38

［条件］

xs:schema要素のtargetNamespace属性に指定したURIが，次のすべての条件に該当する場合です。

トップレベルドメイン（com，gov，net，org，eduなど）を含まない。

国別コードを含まない。

［XML Processorの動作］

生成されるjavaソースのパッケージ名はドメイン名が逆順にされ，"www."は削除されます。

39

［条件］

要素名や属性名に次のどれかを指定する場合です。

javaキーワード

javaリテラル（"true"，"false"，"null"）

java.lang.Objectクラスで定義されているメソッド名

javax.xml.bindクラスで定義されているメソッド名

［XML Processorの動作］

名前衝突エラーにならないで，フィールドやメソッド名が生成されます。javaキーワードやjavaリテラルの場合"_"を付けたフィールド名が作成されます。

40

［条件］

再定義された複合型定義が存在する場合です。

［XML Processorの動作］

再定義された複合型定義は，"_"が付加されたクラス名でなく，接頭辞Originalが付加されたクラス名が生成されます。

41

［条件］

次のすべての条件が該当する場合です。

モデルグループ定義が存在する。

jaxb:schemaBindingsカスタムバインディングで，jaxb:modelGroupNameのsuffix属性，またはprefix属性を指定する。

［XML Processorの動作］

モデルグループ定義はクラスにマッピングされないため，jaxb:modelGroupNameの指定は生成されるソースに反映されません。

42

［条件］

次のすべての条件が該当する場合です。

jaxb:globalBindingsカスタムバインディングのunderscoreBinding属性に，"asCharInWord"を指定する。

xs:elementのname属性，またはfixed属性を指定したxs:attributeのname属性に，アンダーラインが含まれる。

2.がxs:attributeのname属性の場合に，jaxb:globalBindingsのfixedAttributeAsConstantProperty属性に"true"を指定している。

［XML Processorの動作］

仕様書と異なるjava識別子が生成されます。

（例）

xs:elementのname属性の場合

child_element＝＞getChild_Element（正しくはgetChild_element）

xs:attributeのname属性の場合

child_attribute＝＞CHILD___ATTRIBUTE（正しくはCHILD_ATTRIBUTE）

43

［条件］

次のすべての条件が該当する場合です。

jaxb:globalBindingsカスタムバインディングのenableJavaNamingConventions属性に，"true"を指定または属性を指定しない。

<jaxb:schemaBindings>の子要素であるjaxb:packageのname属性に，java識別子として不正な値を指定する。

［XML Processorの動作］

適切なjava識別子への変換が実施されません。

44

［条件］

jaxb:globalBindingsカスタムバインディングで，uid属性のないjaxb:serializableを指定する場合です。

［XML Processorの動作］

エラーは発生しません。このような場合のJAXB実行時の動作は規定されていません。

6.20.3　スキーマジェネレータに関する注意事項

スキーマジェネレータに関する注意事項を次の表に示します。

項番1〜項番32，56，57，59の注意事項に該当するJavaソースは，スキーマジェネレータで処理しないでください。項番33〜項番55，項番58，60，61については，注意事項に留意して使用してください。

表6‒45　JAXBに関する注意事項（スキーマジェネレータ）

項番

注意事項

1

JAXBマッピングアノテーションは，JAXB仕様で指定範囲が制約されています。次の例のように，JAXB仕様の指定範囲外の個所にJAXBマッピングアノテーションを指定した場合，エラーにならないことがあるため注意してください。指定した場合のJAXB実行時の動作は規定されていません。

（例）

パッケージに指定できないJAXBマッピングアノテーションをパッケージに指定した。

トップレベルでないクラスに@XmlRootElement，および@XmlTypeを指定した。

フィールドに@XmlEnumValueを指定した。

列挙型に@XmlRegistryを指定した。

同時に指定できると記載されていないJAXBマッピングアノテーションを同時に指定した。

2

［条件］

次の組み合わせのJAXBマッピングアノテーションのどれかを同時に指定する場合です。

@XmlAttributeと@XmlValue

@XmlAttributeと@XmlMimeType

@XmlElementと@XmlValue

［XML Processorの動作］

エラーを出力します。スキーマは生成しません。

（例）

@XmlAttributeと@XmlValueの場合

mypackage.ChildType#name has mutually exclusive annotations @javax.xml.bind.annotation.XmlAttribute and @javax.xml.bind.annotation.XmlValue

@XmlAttributeと@XmlMimeTypeの場合

javax.xml.bind.annotation.XmlMimeType annotation cannot be placed here

3

［条件］

transientフィールドに次のどれかを指定する場合です。

@XmlAttribute

@XmlElement

@XmlElements

@XmlElementWrapper

@XmlList

@XmlMimeType

@XmlValue

@XmlAnyElement

［XML Processorの動作］

エラーが発生します。

（例）

Transient field "child" cannot have any JAXB annotations.

4

［条件］

staticフィールドに次のどれかを指定する場合です。

@XmlElement

@XmlElements

@XmlElementWrapper

@XmlList

@XmlMimeType

@XmlValue

@XmlAnyElement

@XmlID

@XmlIDREF

［XML Processorの動作］

エラーは発生しません。

5

［条件］

@XmlElementsに@XmlElementを一つも指定しない場合です。

［XML Processorの動作］

不正なスキーマが出力されます。

6

［条件］

@XmlJavaTypeAdapterを一つも含まない@XmlJavaTypeAdaptersを指定する場合です。

［XML Processorの動作］

@XmlJavaTypeAdaptersが指定されなかったかのようなスキーマを出力します。

7

［条件］

value要素が空の配列である@XmlSeeAlsoを指定する場合です。

［XML Processorの動作］

@XmlSeeAlsoが指定されなかったかのようなスキーマを出力します。

8

［条件］

@XmlElementWrapper，@XmlAttribute，@XmlElement，@XmlRootElement，@XmlElementDeclのどれかのname要素に，空文字列を指定する場合です。

［XML Processorの動作］

@XmlElementWrapper，または@XmlElementの場合，name要素が指定されていないときと同様に，フィールド名やプロパティ名から要素名を生成します。

@XmlAttributeの場合，<xs:attribute name="" .../>という不正な属性定義を生成します。

@XmlRootElement，または@XmlElementDeclの場合，<xs:element name="" .../>という不正な要素定義を生成します。

9

［条件］

次のすべての条件に該当する場合です。

パラメタ化されたコレクション型のフィールドまたはJavaBeanプロパティに@XmlElementを付ける。または，配列型かパラメタ化されたリスト型のJavaBeanプロパティに@XmlElementsを付ける。

1.の@XmlElementのtype要素を明示的に指定する。

［XML Processorの動作］

@XmlElementのtype要素に関する制約は適用されません。このようなJavaソースを用いた場合のJAXB実行時の動作は規定されていません。制約の詳細については，JSR 222 The Java Architecture for XML Binding 2.1の8.9.1.2およびJavadocを参照してください。

10

［条件］

次のすべての条件に該当する場合です。

パラメタ化されたコレクション型のフィールドまたはJavaBeanプロパティに@XmlElementsを指定する。

1.の@XmlElementsの要素に，複数の@XmlElementを指定する。

［XML Processorの動作］

エラーは発生しません。しかし，このスキーマおよびjavaソースを使用してアンマーシャルを実行しても正しく処理されません。

［回避策］

パラメタ化されたコレクション型のプロパティまたはJavaBeanフィールドに複数の要素定義を指定したい場合は，@XmlElementRefsおよび@XmlElementRefを使用しJAXBElementのコレクション型として処理してください。

11

［条件］

@XmlElementのdefaultValue要素に，@XmlElementを指定したフィールドまたはJavaBeanプロパティの型に対して不適切な値を指定する場合です。

［XML Processorの動作］

default属性に不適切な値が指定された要素定義のスキーマ文書を生成し，エラーは発生しません。しかし，このスキーマを設定したUnmarshallerでアンマーシャルを実行すると，スキーマ不正のエラー（KECX06161-E）になります。生成されるスキーマは不正なものとなります。

12

［条件］

次のすべての条件に該当する場合です。

@XmlSchemaのnamespace要素に空文字列以外の値を指定する。

@XmlSchemaのxmlns要素に@XmlNsを指定する。

2.に指定した@XmlNsのprefix要素の値が"tns"かつnamespace要素の値が1.の値と異なる。

［XML Processorの動作］

エラーが出力されずスキーマは生成できません。

13

［条件］

次のすべての条件に該当する場合です。

プリミティブ型のフィールドまたはJavaBeanプロパティに対して，@XmlAttributeを付ける。

1.で指定した@XmlAttributeにrequired要素を指定しないか，"false"を指定する。

［XML Processorの動作］

生成される属性定義のuse属性値は，常に"required"です。

14

［条件］

次のすべての条件に該当する場合です。

単純型リストにマップされるクラスが存在する。

1.のクラスを型パラメタとして持つListインスタンスに，@XmlListを指定する。

［XML Processorの動作］

エラーは発生しないで，@XmlListを反映したスキーマが生成されます。

15

［条件］

次のすべての条件に該当する場合です。

@XmlRootElement，およびname要素が空文字列の@XmlTypeをクラスに付ける。

1.のクラスのフィールドまたはJavaBeanプロパティの型が，1.のクラス自身である。

［XML Processorの動作］

エラーが出力されずスキーマは生成できません。

［回避策］

2.のフィールドまたはJavaBeanの名前を，要素クラス名と同じ（ただし，XML名→Java名の変換規則による変換後の名前）にしてください。

（例）

@XmlRootElement

@XmlType(name="")

public class ItemType { public ItemType itemType;}

16

［条件］

次のすべての条件に該当する場合です。

複合型にマッピングされるクラスにabstract修飾子を指定する。

1.のクラスのフィールドまたはJavaBeanプロパティに，@XmlValueを付ける。

1.のクラスのフィールドまたはJavaBeanプロパティに，@XmlAttributeを付ける。

［XML Processorの動作］

生成されるxs:complexType要素には，abstract属性が付けられません。

17

［条件］

列挙型に@XmlEnumを指定します。そのvalue要素に，単純型にマッピングされないクラス（例：java.lang.Object）を指定する場合です。

［XML Processorの動作］

エラーは出力されません。このようなJavaソースを用いた場合のJAXB実行時の動作は規定されていません。

18

［条件］

列挙定数に@XmlEnumValueを指定します。そのvalue要素に，@XmlEnum.value()型に対して不当な字句表現を指定する場合です。

［XML Processorの動作］

エラーは出力されません。このようなJavaソースを用いた場合のJAXB実行時の動作は規定されていません。

19

［条件］

次のすべての条件に該当する場合です。

@XmlRootElement，およびname要素が空文字列の@XmlTypeをクラスに付ける。

フィールドまたはJavaBeanプロパティの型が1.のクラスであるようなクラスが存在する。

2.のフィールドまたはJavaBeanプロパティがマッピングする要素名と，1.がマッピングする要素名が異なる。

（例）

public class Root {　　

　　// 条件2.と3.のフィールド名がchildTypeであれば，要素参照が生成される。

　　protected ChildType child;

}

// 条件1.のクラス

@XmlRootElement

@XmlType(name = "")

public class ChildType {

　　public String fname;

}

［XML Processorの動作］

要素定義（name属性）が生成されます。

20

［条件］

次のすべての条件に該当する場合です。

@XmlRootElement，およびname要素が空文字列の@XmlTypeをクラスに付ける。

フィールドまたはJavaBeanプロパティの型が1.のクラスであるようなクラスが存在する。

2.のフィールドまたはJavaBeanプロパティがマッピングする要素名と1.がマッピングする要素名が，一致する。

2.のフィールドまたはJavaBeanプロパティに指定した@XmlElementのdefaultvalue要素に，"¥u0000"以外を指定する。

（例）

public class Root {

　　@XmlElement(defaultValue="default") // 条件4.

　　 protected ChildType childType; // 条件2.，3.

　}

// 条件1.のクラス

@XmlRootElement

@XmlType(name = "")

public class ChildType {

　　public String fname;

}

［XML Processorの動作］

default属性を持つ要素定義（name属性）が生成されます。

21

［条件］

JavaBeanプロパティが，setterメソッドまたはgetterメソッドの一方が存在しないような，不当なものである場合です。

［XML Processorの動作］

setterメソッドおよびgetterメソッドの両方が存在する正しいJavaBeanであるかのように，スキーマが生成されます。エラーは発生しません。

このようなJavaソースを用いた場合のJAXB実行時の動作は規定されていません。

22

［条件］

JAXBマッピングアノテーションの要素に，不当なスキーマ文書を生成するような指定が存在する場合です。

（例）

　 @XmlRootElementpublic

　 class ItemType {

　　　　@XmlElement(name="A")

　　　　public String item1;　　　

　　　　@XmlElement(name="A")

　　　　public String item2;

　　}

　@XmlElement(name="A")では，異なるフィールドに同一の要素名（"A"）を指定しています。

［XML Processorの動作］

エラーチェックがされないで，不当なスキーマ文書が生成されることがあります。

23

［条件］

JAXBマッピングアノテーションのnamespace要素にXML Schema仕様固有の名前空間URIを表す文字列"http://www.w3.org/2001/XMLSchema"を指定する場合です。

［XML Processorの動作］

この名前空間URIをtargetNamespace属性に持つスキーマ文書は生成されません。なお，この名前空間URIを指定する用途はなく，指定する意味はありません。

24

［条件］

@XmlElementsおよび@XmlMixedを同時に指定した場合です。

［XML Processorの動作］

エラーが出力されずスキーマは生成できません。

25

［条件］

次のすべての条件に該当する場合です。

@XmlElementRefを指定したフィールドやプロパティのデータ型がJAXBElementである。

@XmlElementRef.name()と@XmlElementRef.namespace()が，@XmlRegistryで注釈されたクラス内の@XmlElementDecl注釈を伴う要素ファクトリメソッドである，次のJAXBマッピングアノテーションとそれぞれ同じである。

・@XmlElementDecl.name()

・@XmlElementDecl.namespace()

@XmlElementRef.namespace()に"##default"を指定する。

［XML Processorの動作］

エラーが出力されずスキーマは生成できません。

26

［条件］

type要素のない@XmlSchemaType注釈をパッケージに指定する場合です。

［XML Processorの動作］

エラーは出力されません。このようなJavaソースを用いた場合のJAXB実行時の動作は規定されていません。

27

［条件］

クラス中に複数の@XmlIDで注釈している場合です。

［XML Processorの動作］

エラーにはならないで，スキーマが生成されます。

28

［条件］

次のどれかの条件に該当する場合です。

java.lang.Object型のコレクション型のプロパティに，@XmlID注釈の付いたプロパティが含まれない。

java.lang.Object型のプロパティに，@XmlID注釈の付いたプロパティが含まれない。

java.lang.Object型のコレクション型のプロパティに，@XmlID注釈の付いたフィールドが含まれない。

java.lang.Object型のプロパティに，@XmlID注釈の付いたフィールドが含まれない。

［XML Processorの動作］

エラーにはならないで，スキーマが生成されます。

29

［条件］

「あるクラスとそのスーパークラスで，@XmlAnyElementで注釈されたJavaBeanプロパティは1つだけである」という制限使用制約に反した，次のような記述をする場合です。

クラスに@XmlAnyElementを指定したフィールドやプロパティが複数存在する。

あるクラスとそのスーパークラスで，それぞれ@XmlAnyElementを指定したフィールドやプロパティが存在する。

［XML Processorの動作］

エラーは出力されません。このようなJavaソースを用いた場合のJAXB実行時の動作は規定されていません。

30

［条件］

@XmlAttachmentRefを，フィールドまたはJavaBeanプロパティに付ける場合です。

［XML Processorの動作］

生成される要素定義のminOccurs属性値は0になります。

31

［条件］

次のjava型をスキーマ文書にマッピングする場合です。

char, Boolean, Character, Byte, Short, Integer, Long, Float, Double, byte[]

［XML Processorの動作］

それぞれ，xs:unsignedShort，xs:boolean，xs:unsignedShort，xs:byte，xs:short，xs:int，xs:long，xs:float，xs:double，xs:base64Binary型にマッピングされます。

32

［条件］

package文にtype要素を持たない@XmlJavaTypeAdapterを指定する場合です。

［XML Processorの動作］

エラーは発生しないで，@XmlJavaTypeAdapter指定が有効なスキーマが生成されます。

33

［条件］

static finalフィールド，またはpublic staticフィールドに@XmlAttributeを付ける場合です。

［XML Processorの動作］

生成されるxs:attribute要素に，fixed属性は付けられません。

34

［条件］

required要素の値がfalseである@XmlElementを，プリミティブ型複数次元配列のフィールドまたはJavaBeanプロパティに指定する場合です。

［XML Processorの動作］

minOccurs属性の値は0になります。

35

［条件］

@XmlList，@XmlJavaTypeAdapter，@XmlAttachmentRef，@XmlMimeTypeのどれかを，メソッドのパラメタに付ける場合です。

［XML Processorの動作］

これらのJAXBマッピングアノテーションの指定は無視されます。

36

［条件］

パッケージにlocation要素を持たない@XmlSchemaを指定する場合です。

［XML Processorの動作］

location要素のデフォルト値は"##generate"と解釈されます。

37

［条件］

@XmlTypeを列挙型に付ける場合です。

［XML Processorの動作］

生成されるxs:simpleTypeに，final属性は付けられません。

38

［条件］

次のすべての条件に該当する場合です。

@XmlSchemaのnamespace要素に名前空間URIを指定する。

@XmlSchemaのxmlns要素に@XmlNsを指定し，そのnamespaceURI要素に名前空間URIを指定する。

1.と2.の名前空間URIが同じ文字列である。

［XML Processorの動作］

条件1.と条件2.の名前空間宣言が別々に生成されます。生成されたスキーマを使用しても問題はありません。

39

［条件］

連続する大文字で始まるクラス名または列挙型名が存在する場合です。

［XML Processorの動作］

クラス名または列挙型名の先頭の連続する大文字を小文字に変換したものが，XML名にマッピングされます。

40

［条件］

@XmlElementWrapperのnillable要素にtrueを指定する場合です。

［XML Processorの動作］

生成するスキーマの要素定義にはminOccurs="0"が指定されます。

41

［条件］

次のどれかの条件に該当する場合です。

@XmlElementをフィールドまたはJavaBeanプロパティに付ける。

@XmlElementWrapperをフィールドまたはJavaBeanプロパティに付ける。

@XmlRootElementをクラスまたは列挙型に付ける。

［XML Processorの動作］

xs:element要素にfinal属性とblock属性は付けられません。また，xs:schema要素にfinalDefault属性とblock属性は付けられません。

42

［条件］

@XmlValueをフィールドまたはJavaBeanプロパティに付ける場合です。

［XML Processorの動作］

生成されるxs:simpleType要素またはxs:complexType要素に，final属性は付けられません。

43

［条件］

絶対パスが"#"を含むディレクトリでcsmschemagenコマンドを実行する場合です。

（例）

　　　cd C:¥jaxb¥abc#xyz¥test

　　　csmschemagen mypackage¥TEST.java

［XML Processorの動作］

生成されるスキーマ文書のxs:import要素のschemaLocation属性の値が不正になります。

［回避策］

絶対パスが"#"を含まないディレクトリでcsmschemagenコマンドを実行してください。

44

［条件］

csmschemagenコマンドの-dオプションの引数に出力先ディレクトリを指定しない場合です。

（例）

　　csmschemagen -d mypackage¥TEST.java

［XML Processorの動作］

スキーマは出力されません。また，このときエラーが出力されないことがあります。

45

［条件］

プロパティやフィールドで，@XmlSchemaTypeのnameおよび@XmlElementのtypeに，異なる型にマッピングする値を指定する場合です。

［XML Processorの動作］

@XmlSchemaTypeのnameに指定されたデータ型の，要素定義のスキーマ文書が生成されます。

46

［条件］

次のすべての条件に該当する場合です。

フィールドまたはJavaBeanプロパティに，それらが含まれるクラスの名前空間とは異なるnamespace要素の@XmlElementを指定する。

フィールドまたはJavaBeanプロパティに，@XmlIDまたは@XmlIDREFを指定する。

［XML Processorの動作］

指定された@XmlIDまたは@XmlIDREFは，生成される大域要素定義に反映されません。

47

［条件］

@XmlElementDeclのsubstitutionHeadName要素に，""以外を指定する場合です。

［XML Processorの動作］

xs:element要素のsubstitutionGroup属性が出力されません。

48

［条件］

@XmlElementDeclのdefaultValue要素に，"¥u0000"以外を指定する場合です。

［XML Processorの動作］

xs:element要素のdefault属性が出力されません。

49

［条件］

次のすべての条件に該当する場合です。

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)をパッケージやクラスに指定する。

1クラス内に，アルファベット順でない@XmlAttribute注釈された複数のフィールドやプロパティがある。

［XML Processorの動作］

属性がアルファベット順にソートされたスキーマが生成されます。

50

［条件］

トップレベルでない内部クラスに，@XmlAccessorType，および@XmlAccessorOrderを指定する場合です。

［XML Processorの動作］

エラーにはならないで，指定の注釈が有効となります。

51

［条件］

システムのエンコーディングと異なるエンコーディングのJavaソースを指定した場合です。

［XML Processorの動作］

エラーが出力されず，不正なスキーマが生成されたりします。

52

［条件］

次のすべての条件に該当する場合です。

複数値のフィールドまたはJavaBeanプロパティに@XmlElementRefを付加する。

1.の@XmlElementRefのrequired要素が指定されていない，またはrequired要素にtrueが指定されている。

［XML Processorの動作］

minOccurs属性の値は，0になります。

53

［条件］

次のすべての条件に該当する場合です。

-encodingオプションに不当なエンコーディングを指定する。

-encodingオプション以外のオプションを指定しない。

［XML Processorの動作］

エラーが出力されず，スキーマも生成されません。

54

［条件］

次のどれかの条件に該当する場合です。

カレントディレクトリまたは-dオプションで指定したディレクトリに書き込み権限がない場合。

-dオプションでディレクトリ以外を指定した場合。

カレントディレクトリまたは-dオプションで指定したディレクトリに書き込み権限のないスキーマ文書がすでに存在する場合。

-dオプションまたは-encodingオプションを指定しjavaソースを指定しない場合。

Cosminexus 09-70 以降のバージョンであること。

［XML Processorの動作］

エラーを出力せずコマンドを終了します。

6.20.4　実行時の注意事項

実行時の注意事項を次の表に示します。

表6‒46　JAXBに関する注意事項（実行時）

項番

注意事項

1

マルチスレッドプログラミングをする場合，javax.xml.bindで始まる名前のパッケージで規定されたオブジェクトはスレッドセーフではありません（例外として，javax.xml.bind.JAXBContextクラスはスレッドセーフです）。したがって，複数のスレッドが同時にこれらのオブジェクトにアクセスしてはいけません。スレッド間の競合を避けるため，次の方法を使用してください。

各スレッドが排他的にこれらのオブジェクトにアクセスする。

2

アンマーシャル，マーシャル時には，製品の内部でスキーマジェネレータと類似の処理が実行される場合があります。したがって，スキーマジェネレータの注意事項も参照してください。

3

xs:ENTITY型またはxs:ENTITIES型を使用したスキーマ文書を検証モードでアンマーシャルまたはマーシャルを実行しないでください。実行した場合，エンティティが宣言されていないというエラーが発生します。

（例）

KECX06252-E UndeclaredEntity: Entity 'id1' is not declared.

4

［条件］

次のすべての条件に該当する場合です。

Unmarshallerのunmarshal(org.w3c.dom.Node node)メソッドを実行する。

nodeパラメタにorg.w3c.dom.Documentまたはorg.w3c.dom.Element以外のNodeオブジェクトを指定する。

［XML Processorの動作］

IllegalArgumentException例外が発生します。

（例）

java.lang.IllegalArgumentException: Unexpected node type: [#text: String]

5

［条件］

次のすべての条件に該当する場合です。

例外をスローする整列化イベントコールバックメソッド(beforeMarshal/afterMarshal)をクラスに定義する。

上記イベントコールバックメソッドが呼ばれるインスタンス文書を出力するようなマーシャルを実行する。

［XML Processorの動作］

マーシャルプロセスは終了しますが，IllegalStateException例外がスローされます。

6

［条件］

次のすべての条件に該当する場合です。

パッケージレベルで@XmlJavaTypeAdapterを指定する。

クラスまたは列挙型に対し@XmlJavaTypeAdapterを指定する。

インスタンス文書に1.および2.で指定した@XmlJavaTypeAdapterが有効となるデータ型定義がある。

1.〜3.の条件のもとでアンマーシャルまたはマーシャルを実行する。

［XML Processorの動作］

クラス，列挙型に対する@XmlJavaTypeAdapterよりも，そのクラスのパッケージレベルで指定された @XmlJavaTypeAdapterが優先されます。動作が標準仕様と異なるため，このようなjavaソースは処理対象としないでください。

7

［条件］

handleEventメソッドの中でJavaコンテンツツリーを変更した場合です。

［XML Processorの動作］

MarshalExceptionをスローします。

8

［条件］

次のすべての条件に該当する場合です。

マーシャルを実行する。

marshalメソッドの引数jaxbElementがJAXBElementオブジェクトである。

2.のJAXBElementコンストラクタのnameパラメタに指定したQNameオブジェクトのlocalPart，prefixのどちらかがNCNameではない。

［XML Processorの動作］

marshalメソッドは正常終了しますが，整形式ではないXML文書が生成されます。

9

［条件］

次のすべての条件に該当する場合です。

@XmlEnumのvalue要素がjavax.xml.namespace.QName.classである。

@XmlEnumValueのvalue要素がQNameを表すリテラル文字列である。

JAXBContext.newInstance()メソッドの引数に，1.および2.を含むJavaクラスを指定して実行する。

［XML Processorの動作］

JAXBException例外が発生します。このようなjavaソースは処理対象としないでください。

10

［条件］

次のすべての条件に該当する場合です。

ValidationEventLocatorインタフェースのgetURLメソッドを実行する。

アンマーシャル対象のオブジェクトのURLが，RFC2396に指定できない文字を含んでいる（ディレクトリ名，ファイル名からURLが自動生成される場合も含む）。

［XML Processorの動作］

getURLメソッドの戻り値は，RFC2396で指定できない文字をそのまま含みます。

11

［条件］

次のすべての条件に該当する場合です。

型がプリミティブ型であるstaticフィールドに，@XmlAttributeを指定する。

1.のJavaソースをマーシャルする。

［XML Processorの動作］

マーシャル時に不当な例外が発生します。このようなjavaソースは処理対象としないでください。

（例）

Exception in thread "main" java.lang.IncompatibleClassChangeError

12

［条件］

Java値クラスのsetterメソッドの引数にnullを指定する場合です。

［XML Processorの動作］

NullPointerExceptionが発生します。

［回避策］

setterメソッド呼び出し部分のコードを，次のように変更してください。

(変更前)

items.setId(null);

(変更後)

items.setId(new String[] {});

13

［条件］

次のすべての条件に該当する場合です。

インスタンス文書の要素にxsi:type属性の指定がある。

1.に指定された型がJAXBマップ型でない。

1.，2.でアンマーシャルを実行する。

［XML Processorの動作］

アンマーシャルが正常終了します。

要素は，xsi:typeによる型の置換をしないでアンマーシャルされます。

14

検証モードのマーシャル実行でエラーが発生した場合，エラーになる前までの内容の不正なXML（非整形なXML）が出力される場合があります。

15

jaxb.formatted.outputプロパティを指定してマーシャルを実行したとき，出力されるXML文書の改行コードは0x0Aになります。

16

マーシャルを実行したとき，出力されるXML文書のXML宣言にstandalone="yes" 擬似属性が出力されます。

17

［条件］

Marshallerインタフェースのmarshal(Object jaxbElement，Node node)メソッドの引数nodeにElement，Document，DocumentFragment以外のNodeオブジェクトを指定する場合です。

［XML Processorの動作］

DOMExceptionを例外スローします。

（例）

org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: KECX01304-E An attempt was made to insert a node where it is not permitted.

18

［条件］

次のすべての条件に該当する場合です。

スキーマ文書で「デフォルト値が指定されているxs:list型の要素」を宣言している。

1.をスキーマコンパイラに適用し，生成されたJava値クラスを用いてXML文書をアンマーシャルする。

2.のJava値クラスのインスタンスをgetメソッドで取得する。

［XML Processorの動作］

取得したインスタンスには，スキーマ文書で定義したデフォルト値が含まれません。

19

［条件］

次のすべての条件に該当する場合です。

@XmlAttachmentRefをフィールド，JavaBeanプロパティ，パラメタのどれかに付ける。

1.のJavaソースをスキーマジェネレータに入力する。

2.で生成したスキーマ文書で妥当性検証を実行する。

［XML Processorの動作］

生成されるスキーマの要素定義，属性定義での，type属性値は{http://ws-i.org/profiles/basic/1.1/xsd}swaRefになります。

名前空間{http://ws-i.org/profiles/basic/1.1/xsd}の定義は次に示すxs:importとして生成されます。

<xs:import namespace="http://ws-i.org/profiles/basic/1.1/xsd" schemaLocation="http://ws-i.org/profiles/basic/1.1/swaref.xsd"/>

このため，生成したスキーマ文書で妥当性検証を実行すると，XMLパーサがhttpプロトコルを用いてhttp://ws-i.org/profiles/basic/1.1/swaref.xsdを参照します。javax.xml.validation.Validator#setResourceResolverメソッドを使用して適切なorg.w3c.dom.ls.LSResourceResolverインスタンスを設定することで，任意の場所に存在するswaref.xsdを参照させることができます。

20

［条件］

次のすべての条件に該当する場合です。

jaxb:typesafeEnumClassカスタムバインディングを指定する。

1.のスキーマ文書をスキーマコンパイラに入力する。

2.で列挙型のfromValueメソッドが生成され，その引数に列挙定数以外を指定して呼び出す。

［XML Processorの動作］

IllegalArgumentException例外が発生します。

21

［条件］

次のすべての条件に該当する場合です。

package-info.javaが存在する。

JAXBContext.newInstance(Class... classesToBeBound)を実行後，スキーマ生成やアンマーシャル，マーシャルのメソッドを実行する。

［XML Processorの動作］

package-info.javaを事前にコンパイルしていない場合，処理対象となりません。

22

［条件］

次のすべての条件に該当する場合です。

@XmlAnyElement(lax = true)を，Object型のフィールドまたはJavaBeanプロパティのどちらかに付加する。

要素がスキーマ要素定義に一致しないが，その要素のxsi:type属性に指定された型名がスキーマで定義されているインスタンス文書をアンマーシャルする。

［XML Processorの動作］

JAXBオブジェクト（スキーマ要素定義に対応するJavaクラスのオブジェクト）が生成されないで，DOMノードが生成されます。

23

［条件］

次に示すどれかのクラスで，setEventHandlerメソッドの引数にnullを指定する場合です。

Unmarshallerクラス

Marshallerクラス

Binder<Node>クラス

［XML Processorの動作］

getEventHandlerメソッドで取得したイベントハンドラは，setEventHandlerメソッドを実行しなかった場合のイベントハンドラと異なり，JAXB1.0のデフォルトイベントハンドラ（DefaultValidationEventHandler）となります。このような指定をした場合の動作は保証しません。

24

［条件］

次のすべての条件に該当する場合です。

Binder<Node>クラスのsetPropertyメソッドで，jaxb.encodingプロパティにデフォルト以外の値を設定する。

Binder<Node>クラスのmarshalメソッドを実行する。

［XML Processorの動作］

設定されたプロパティは有効となりません。

25

［条件］

次のすべての条件に該当する場合です。

Binder<Node>クラスのsetPropertyメソッドでjaxb.formatted.outputプロパティを設定しない，またはfalseの値を設定する。

Binder<Node>クラスのmarshalメソッドを実行する。

［XML Processorの動作］

プロパティの設定に関係なく，改行およびインデントが処理されたXMLデータが出力されます。

26

［条件］

javax.xml.bind.Binder<XmlNode>クラスのunmarshal(XmlNode xmlNode, Class<T> declaredType)に，次のように指定する場合です。

declaredTypeに指定したクラスに一致しないxmlNodeを指定する。

［XML Processorの動作］

例外は発生しません。このような場合のJAXB実行時の動作は規定されていないため，保証しません。

27

［条件］

javax.xml.bind.Binder<XmlNode>クラスのupdateXML(Object jaxbObject, XmlNode xmlNode)に，次のように指定する場合です。

引数jaxbObjectにunmarshalおよびmarshalで関連づけられていない，JAXBオブジェクトを指定する。

引数xmlNodeに関連づけられたあとに削除されたDOMノードを指定する。

［XML Processorの動作］

このような場合のJAXB実行時の動作は規定されていないため，保証しません。

28

［条件］

javax.xml.bind.Binder<XmlNode>クラスのupdateXMLメソッドを実行する場合です。

［XML Processorの動作］

JAXBオブジェクトに関連づけられた既存のXMLツリーを更新しないで，新しいXMLツリーが作成されます。そのため，既存のXMLツリーに次の情報が含まれる場合，それらの情報はメソッド実行後保持されません。

コメント

PI

JAXBにバインドされないXML要素または属性

また，updateXML(Object jaxbObject, XmlNode xmlNode)メソッドの戻り値は，引数のxmlNodeと同じノードにはなりません。そのため，updateXMLメソッドを繰り返し実行する場合，引数xmlNodeに同じ値を指定しないでください。

29

［条件］

javax.xml.bind.Binder<XmlNode>クラスのupdateXMLメソッドを実行する場合です。

［XML Processorの動作］

javax.xml.bind.Binder<XmlNode>クラスの実装が持つ，JAXBオブジェクトツリーとXMLノードの関連づけが不正になります。

そのため，メソッド実行後，戻り値をgetJAXBNode(XmlNode xmlNode)の引数に指定した実行結果は，nullとなります。また，updateXMLメソッドを繰り返し実行した場合，NullPointerException例外が発生します。

［回避策］

次のように変更し，updateXMLメソッドの呼び出しに加えて，javax.xml.bind.Binder<XmlNode>クラスのupdateJAXBメソッドの呼び出しを実施してください。

（変更前）

binder.updateXML(rootbinder);

（変更後）

Node node = binder.updateXML(rootbinder);

rootbinder = (Root)binder.updateJAXB(node);

30

［条件］

次のどちらかの条件に該当する場合です。

アンマーシャル時，XMLデータの文字列をターゲットのJavaデータ型の値に変換している途中で，問題が発生した。

マーシャル時，JavaコンテンツツリーのデータをJavaコンテンツツリーの字句表現に変換している途中で，問題が発生した。

［XML Processorの動作］

イベント（アンマーシャル時のparseConversionEvent，またはマーシャル時のprintConversionEvent）は生成されません。

31

［条件］

次のすべての条件に該当する場合です。

XML文書にxsi:type属性を指定する。

1.の属性値に，要素名および属性名で使用していない名前空間接頭辞を指定する。

1.のXML文書をアンマーシャルする。

3.でアンマーシャルしたオブジェクトを検証モードでマーシャルする。

（例）

<foo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

　　　　<a/>

　　　　<b xsi:type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema">abc</b>

　　　　<c xsi:type="xsd:int" xmlns:xsd="http://www.w3.org/2001/XMLSchema">123</c>

</foo>

［XML Processorの動作］

KECX06253-E UndeclaredPrefix: Cannot resolve 'xsd:string' as a QName: the prefix 'xsd' is not declared.のエラーが報告されます。

また，検証モードなしでマーシャルを実施すると，必要な名前空間宣言がないXML文書が出力されます。

32

［条件］

次のすべての条件に該当する場合です。

フィールドAがjava.util.Calendarクラスとして宣言されている。

1.のフィールドが@XmlSchemaType(name="date")を使ってアノテーションされている。

1.および2.に該当するフィールドを持つクラスをマーシャルする。

［XML Processorの動作］

フィールドAに対応するXML文書中の要素の内容が，xs:date型ではなく，xs:dateTime型として出力されます。

そのため，JAXBContextクラスのgenerateSchemaメソッドで生成したスキーマを使用してスキーマ検証すると，検証エラーになります。

［回避策］

マーシャル時にxs:date形式で出力したい場合には，java.util.Calendarクラスではなく，javax.xml.datatype.XMLGregorianCalendarクラスを使用してください。

33

［条件］

ValidationEventLocatorインタフェースのgetOffsetメソッドを実行する場合です。

［XML Processorの動作］

getOffsetメソッドの戻り値は，常に-1になります。

6.21　XML Processor全般に関する注意事項

XML Processor全般に関する，その他の注意事項を次に示します。

表6‒47　XML Processor全般に関する注意事項

項番

注意事項

1

XML Schemaを使って検証処理をする場合，何らかの要因でAPI仕様で規定されていない例外やエラーが発生するおそれがあります。XML Schemaを使って検証処理をするJavaプログラムでは，そのような例外やエラーがスローされることを前提に，java.lang.Throwableをキャッチして適切に対処できるよう例外処理を実装してください。

2

XML Processorが提供するjarファイルでは，「5.2　XML Processorが使用しているパッケージ名」に記載されたパッケージを使用しています。ユーザアプリケーションが上記と同じパッケージを含む実装を同梱している場合，XML Processorが提供しているパッケージのクラスが優先的にロードされます。

ただし，上記と同じパッケージを含むjarファイルのマニフェストファイルでSealed属性がtrueに設定されている場合，SecurityException例外が発生するため，ユーザアプリケーションに同梱しないでください。

パッケージ名の詳細は「5.2　XML Processorが使用しているパッケージ名」を参照してください。

付録

付録A　バージョン間の差異

XML Processorの以前のバージョンとの動作の差異について説明します。

付録A.1　XSLTの動作の差異

XSLTの動作の差異を次の表に示します。

表A‒1　XSLTの動作の差異（バージョン08-50とバージョン08-70以降の比較）

項番

条件

XML Processorの動作

バージョン08-50の場合

バージョン08-70以降の場合

1

XMLInputFactory.createXMLEventReader()メソッドで取得したXMLEventReaderをStAXSourceのコンストラクタ引数に指定して，Transformer.transform()メソッドの入力ソースとした場合

入力XML文書のルート要素の外側にある処理命令は無視されます。

入力XML文書のルート要素の外側にある処理命令も変換対象となります。

2

次の両方の条件に該当する場合

トランスフォーマの入力XML文書内の要素がXSLT以外の名前空間に属している

XMLEventWriterから作成したStAXResultを使用して変換している

変換中にエラーが発生するか，変換結果が不正になります。

正常に処理されます。

3

次のすべての条件に該当する場合

トランスフォーマのスタイルシートでxsl:sortを使った変換を実施する

トランスフォーマのスタイルシートのソートキーに日本語が指定されている

J2SE 5.0とJava SE 6の場合とで，ソートの出力結果が異なります。

08-70までの場合

J2SE 5.0とJava SE 6の場合とで，ソートの出力結果が異なります。

09-00以降の場合

Java SE 6だけのため，差異はありません。

4

出力メソッドがxmlで，かつ，指定した出力エンコーディングでは表現できない文字を出力する場合

J2SE 5.0とJava SE 6とで出力結果が異なる場合があります。

08-70までの場合

J2SE 5.0とJava SE 6とで出力結果が異なる場合があります。

09-00以降の場合

Java SE 6だけのため，差異はありません。

付録A.2　JAXBの動作の差異

JAXBの動作の差異を，状況別に次の表に示します。

表A‒2　JAXBの動作の差異（csmxjcコマンド）

項番

条件

XML Processorの動作

バージョン08-50の場合

バージョン08-70以降の場合

1

enumerationファセットが存在しないXMLスキーマ文書の単純型にtypesafeEnumClassカスタムバインディングが存在する場合

csmxjcコマンドが正常終了します。

typesafeEnumClassカスタムバインディングの指定が不正であることを示すエラーが発生します。

2

次のどちらかの場合に該当するとき

globalBindingsカスタムバインディングで，generateElementClass="true"またはgenerateElementClass="1"を指定した場合

XMLスキーマ文書のelement要素にclassカスタムバインディングを指定した場合

要素クラスの参照プロパティは，要素のデータ型（@XmlElementまたは@XmlElements）で注釈されます。

なお，その要素に対応するソースにデフォルトコンストラクタは出力されません。

要素クラスの参照プロパティは，要素のクラス型（@XmlElementRefまたは@XmlElementRefs）で注釈されます。

デフォルトコンストラクタが出力されます。

3

group要素中のelement要素にclassカスタムバインディングを指定して，そのgroup要素がほかの複数の型から参照されている場合

group要素中のelement要素のうち，classカスタムバインディング指定されていない要素のオブジェクトを作成するファクトリメソッドは，生成されません。

group要素中のelement要素のうち，classカスタムバインディング指定されていない要素のオブジェクトを作成するファクトリメソッドが，生成されます。

4

globalBindingsまたはpropertyカスタムバインディングにcollectionType="indexed"の指定がある場合

csmxjcコマンドで生成したソースのelement要素に対する型は，java.util.Listです。

csmxjcコマンドで生成したソースのelement要素に対する型は，配列です。

5

型定義や匿名型要素定義にfactoryMethodカスタムバインディングの指定がある状態でcsmxjcコマンドを実行した場合

エラーになります。

正常終了します。

6

csmxjcコマンドで生成したソースに@XmlElementRef注釈型※が含まれる場合

required要素は出力されません。

required要素が出力されます。

7

@XmlAttribute注釈型のname要素が生成するフィールド名と同じ場合

name要素は出力されません。

name要素が出力されます。

注※

@XmlElementRef注釈型のrequired要素は，JAXB 2.2でサポートされました。

表A‒3　JAXBの動作の差異（csmschemagenコマンド）

項番

条件

XML Processorの動作

バージョン08-50の場合

バージョン08-70以降の場合

1

Javaソースに@XmlAccessorOrderまたは@XmlAccessorOrder(XmlAccessOrder.UNDEFINED)を指定した場合

csmschemagenコマンドで作成したXMLスキーマ文書がsequence要素になります。

csmschemagenコマンドで作成したXMLスキーマ文書がall要素になります。

2

Javaソースに@XmlElementDeclを指定した場合

csmschemagenコマンドで生成したXMLスキーマ文書の大域定義のelement要素に，nillable="true"属性が出力されます。

csmschemagenコマンドで生成したXMLスキーマ文書の大域定義のelement要素に，nillable="true"属性は出力されません。

表A‒4　JAXBの動作の差異（実行時）

項番

条件

XML Processorの動作

バージョン08-50の場合

バージョン08-70以降の場合

1

@XmlAttribute注釈型または@XmlValue注釈型で注釈されたjava.lang.Object型の変数が存在するクラス，またはそのクラスが存在するパッケージ名を，JAXBContextクラスのnewInstanceメソッドに指定した場合

IllegalAnnotationsExceptionがスローされます。

NullPointerExceptionがスローされます。

2

JAXBContextクラスのnewInstanceメソッドに指定したパッケージにpackage-infoクラスが存在し，XmlNs注釈型で名前空間が指定されている場合

marshalで出力されるXML文書に名前空間宣言が出力されません。

marshalで出力されるXML文書に名前空間宣言が出力されます。

3

@XmlMixed注釈型で注釈されたJavaBeanプロパティに空白類だけのテキストが含まれるXML文書をアンマーシャルした場合

アンマーシャルで生成されたオブジェクトにテキストオブジェクトが生成されません。

空白類だけのテキストオブジェクトが生成されます。

4

スキーマ検証やイベントハンドラで，エラーチェックをしないUnmarshallerで数値のプリミティブ型のJavaBeanプロパティに，文字列をアンマーシャルした場合

IllegalAccessErrorとなります。

アンマーシャルが正常終了します。

5

JAXBにマッピングされたクラスにbeforeUnmarshalメソッドまたはafterUnmarshalメソッドを実装して，アンマーシャル実行時にそのメソッドで例外がスローされた場合

アンマーシャル処理は中断しません。

UnmarshalExceptionがスローされて，アンマーシャル処理が中断します。

6

JAXBContextクラスのnewInstance(Class[], Map<String, ?>)メソッドおよびnewInstance(Class[])メソッドの第1パラメタにnullを指定した場合

NullPointerExceptionがスローされます。

IllegalArgumentExceptionがスローされます。

7

DatatypeConverterクラスのparseBooleanメソッドに"0","1","false","true"以外を指定した場合

falseが返ります。

IllegalArgumentExceptionがスローされます。

8

DatatypeConverterクラスのparseDecimalメソッドに空白だけを指定した場合

java.lang.NumberFormatExceptionがスローされます。

例外はスローされません。

9

enumクラスにアンマーシャルする値に改行や空白が含まれる場合

処理結果が不正になります。

値が正しくアンマーシャルされます。

付録A.3　javax.xml.datatypeパッケージの動作差異

javax.xml.datatypeパッケージの動作の差異を次の表に示します。

表A‒5　javax.xml.datatypeパッケージの動作の差異（J2SE 5.0上でJAXP1.3を利用する場合とJava SE 6上でJAXP1.4を利用する場合との比較）

項番

条件

実行結果

J2SE 5.0の場合

Java SE 6の場合

1

javax.xml.datatype.DatatypeFactoryクラスのnewDurationYearMonth(long)メソッドが返すDurationオブジェクトの内容

年および月以外のデータも保持されています。

年および月以外のデータは保持されません。

2

javax.xml.datatype.Durationクラスのequalsメソッドのパラメタにnullを指定した場合

NullPointerExceptionが発生します。

falseを返します。

NullPointerExceptionは発生しません。

付録A.4　高速パース機能の動作差異

高速パース機能の動作の差異を次の表に示します。

表A‒6　高速パース機能の動作の差異（J2SE 5.0上でJAXP1.3を利用する場合とJava SE 6上でJAXP1.4を利用する場合との比較）

項番

条件

実行結果

J2SE 5.0の場合

Java SE 6の場合

1

高速パース機能を使用して，RFC2396がXML文書名として許容していない文字（日本語や空白など）を含むFileオブジェクトを次のメソッドに指定した場合

DocumentBuilderクラスのparse(File)メソッド

SAXParserクラスのparse(File, DefaultHandler)メソッド

次のファイル名は，Fileオブジェクトで指定したとおりになります。

チューニングサマリファイルの解析対象のXML文書名

チューニング詳細ファイルのファイル名

チューニング詳細ファイルの解析対象のXML文書名

次のファイル名は，%xxで符号化されます。

チューニングサマリファイルの解析対象のXML文書名

チューニング詳細ファイルのファイル名

チューニング詳細ファイルの解析対象のXML文書名

付録A.5　StAXの動作差異

StAXの動作の差異を次の表に示します。

表A‒7　StAXの動作の差異（J2SE 5.0上でJAXP1.3を利用する場合とJava SE 6上でJAXP1.4を利用する場合との比較）

項番

条件

実行結果

J2SE 5.0の場合

Java SE 6の場合

1

javax.xml.stream.XMLStreamException(Throwable)コンストラクタで生成したオブジェクトでgetCauseメソッドを実行する場合

nullを返します。

コンストラクタに指定したThrowableオブジェクトを返します。

付録A.6　Apache独自の機能の動作差異

08-70でサポートされたApache独自機能によって，XMLパーサおよびXSLT/XSLTCの動作が08-50以前と変わる場合があります。Apache独自機能については，「3.5　Apache独自の機能」を参照してください。

付録A.7　Cosminexus 09-80以降の動作の差異

Cosminexus XML ProcessorをCosminexus 09-80以降で動作させた場合の動作の差異を次の表に示します。

表A‒8　Cosminexus XML Processorの動作の差異

項番

条件

XML Processorの動作

Cosminexus 09-70以前の場合

Cosminexus 09-80以降の場合

1

UTF-16 big-endianで記述したXML文書に含まれるXML宣言のencoding属性値として，「ISO-10646-UCS-4」を指定した場合

DOMパーサ，およびSAXパーサでXML文書をパースしたときに，KECX01021-Eのエラーを通知します。

DOMパーサ，およびSAXパーサでXML文書をパースしたときに，KECX01024-Eのエラーを通知します。

2

UTF-16 little-endianで記述したXML文書に含まれるXML宣言のencoding属性値として，「ISO-10646-UCS-4」を指定した場合

DOMパーサ，およびSAXパーサでXML文書をパースしたときに，KECX01024-Eのエラーを通知します。

DOMパーサ，およびSAXパーサでXML文書をパースしたときに，KECX01021-Eのエラーを通知します。

3

ISO-10646-UCS-2 big-endianで記述したXML文書に含まれるXML宣言のencoding属性値として，「ISO-10646-UCS-4」を指定した場合

DOMパーサ，およびSAXパーサでXML文書をパースしたときに，KECX01021-Eのエラーを通知します。

DOMパーサ，およびSAXパーサでXML文書をパースしたときに，KECX01024-Eのエラーを通知します。

4

ISO-10646-UCS-2 little-endianで記述したXML文書に含まれるXML宣言のencoding属性値として，「ISO-10646-UCS-4」を指定した場合

DOMパーサ，およびSAXパーサでXML文書をパースしたときに，KECX01024-Eのエラーを通知します。

DOMパーサ，およびSAXパーサでXML文書をパースしたときに，KECX01021-Eのエラーを通知します。

付録B　JAXB仕様のサポート範囲

JAXB仕様のサポート範囲について説明します。機能の詳細については，各製品のマニュアルを参照してください。

付録B.1　JAXBの機能のサポート範囲

JAXBの機能のサポート範囲を次の表に示します。

表B‒1　JAXBの機能のサポート範囲

JAXBの機能

機能の概要

サポートの可否

スキーマコンパイラ

デフォルトバインディング

デフォルトの変換をします。

○

カスタムバインディング

バインディング宣言によって変換をカスタマイズします。

○

├

│

インライン注釈付きスキーマ

スキーマ文書内にバインディング宣言を記述します。

○

├

│

外部バインディング宣言

外部ファイルにバインディング宣言を記述します。

○

└

バインディング言語の拡張

ベンダ固有の拡張バインディング宣言を定義します。

×

スキーマジェネレータ

デフォルトマッピング

デフォルトの変換をします。

○

カスタムマッピング

Javaのアノテーションによって変換をカスタマイズします。

○

バインディングフレームワーク

マーシャル

JavaのオブジェクトをXML文書として出力します。

○

├

│

イベントコールバック

マーシャル時に発生するイベントのコールバックメソッドです。

○

│

│

│

│

│

│

│

├

│

│

│

クラス定義されたコールバックメソッド

マーシャルの前後に呼び出される，JAXBによってマッピングされたクラス内部のコールバックメソッドです。

○

└

外部リスナー

マーシャル時に発生するイベントによって呼び出される，外部のコールバックメソッドです。

○

├

│

マーシャリングプロパティ

マーシャルを制御するための各種プロパティです。

○

└

妥当性検証

マーシャル時に妥当性を検証します。

○

アンマーシャル

XML文書をJavaのオブジェクトとして読み込みます。

○

├

│

イベントコールバック

アンマーシャル時に発生するイベントのコールバックメソッドです。

○

│

│

│

│

│

│

│

├

│

│

│

クラス定義されたコールバックメソッド

アンマーシャルの前後に呼び出される，JAXBによってマッピングされたクラス内部のコールバックメソッドです。

○

└

外部リスナー

アンマーシャル時に発生するイベントによって呼び出される，外部のコールバックメソッドです。

○

└

妥当性検証

アンマーシャル時に妥当性を検証します。

○

イントロスペクタ

JAXBによってマッピングされたJavaオブジェクトのマッピングに関する情報にアクセスするための機能です。

○

バインダー

JAXBによってマッピングされたJavaオブジェクトとXML情報セットの同期を取るための機能です。

○

（凡例）

○：機能をすべてサポートしています。

×：未サポートです。

付録B.2　JAXBの文字のサポート範囲

スキーマコンパイラの入力となるスキーマ文書およびスキーマジェネレータの入力となるJavaクラスは，任意の文字列を指定できます。JAXBで扱えるスキーマジェネレータ入力javaソースの文字サポート範囲を表B-2，スキーマコンパイラ入力スキーマ文書の文字サポート範囲を表B-3に示します。

表B‒2　スキーマジェネレータ入力javaソースの文字サポート範囲

項番

任意文字列の指定個所

文字サポート範囲

1

クラス名

メソッド名

フィールド名

次のすべての条件に合致するようにしてください。

英数字およびアンダーラインから成る。

XMLのNCNameの構文規則に合致する。

2

列挙定数

次の条件に合致するようにしてください。

英数字およびアンダーラインから成る。

3

@XmlNsのprefix要素

次のすべての条件に合致するようにしてください。

英数字およびアンダーラインから成る。

XMLのNCNameの構文規則に合致する。

4

@XmlEnumValueの要素

@XmlElement/@XmlElementDeclのdefaultValue要素

次の条件に合致するようにしてください。

UnicodeのBasic Latinおよび日本語※1から成る。

5

JAXBマッピングアノテーションのname要素

次のすべての条件に合致するようにしてください。

英数字，アンダーラインと日本語※1から成る。

XMLのNCNameの構文規則に合致する。

6

JAXBマッピングアノテーションのnamespace要素

次の条件に合致するようにしてください。

RFC 2396で規定されたURI文字列である。※2

7

@XmlTypeのfactoryMethod要素

次のすべての条件に合致するようにしてください。

英数字およびアンダーラインから成る。

Java識別子の構文規則に合致する。

8

@XmlMimeTypeのvalue要素

次の条件に合致するようにしてください。

MIME型テキスト表現である。

注※1

UnicodeのHiragana，Katakana，CJK Unified Ideographsのカテゴリに含まれる文字です。

注※2

RFC2732は未サポートです（IPv6未サポート）。

表B‒3　スキーマコンパイラ入力スキーマ文書の文字サポート範囲

項番

任意文字列の指定個所

文字サポート範囲

1

xs:anyURI型を指定するスキーマ要素の属性（xs:schema要素のtargetNamespace属性など）

次の条件に合致するようにしてください。

RFC 2396で規定されたURI文字列である。※1

2

xs:NCName型を指定するスキーマ要素の属性（xs:element要素のname属性など）

カスタムバインディング宣言によって出力名を変更しない場合は，次のすべての条件に合致するようにしてください。

英数字およびアンダーラインから成る。

XMLのNCNameの構文規則に合致する。

カスタムバインディング宣言によって出力名を変更する場合は，次のすべての条件に合致するようにしてください。

英数字，アンダーラインおよび日本語※2から成る。

XMLのNCNameの構文規則に合致する。

3

xs:QName型を指定するスキーマ要素の属性（xs:element要素のtype属性など）

次のすべての条件に合致するようにしてください。

QName形式の文字列。

局所名は項番2の範囲内とする。

接頭辞は英数字およびアンダーラインから成る。

4

xs:string型を指定するスキーマ要素の属性（xs:element要素のfixed/default属性xs:attribute要素のfixed/default属性など）

jaxb:typesafeEnumMember要素のvalue属性

次の条件に合致するようにしてください。

UnicodeのBasic Latinおよび日本語※2から成る。

5

xs:enumeration要素のvalue属性

カスタムバインディングによって列挙定数を変更しない場合は，次のすべての条件に合致するようにしてください。

英数字およびアンダーラインから成る。

Java列挙定数の構文規則に合致する。

カスタムバインディングによって列挙定数を変更する場合は，次の条件に合致するようにしてください。

UnicodeのBasic Latinおよび日本語※2から成る。

6

JAXB要素のname属性

JAXB要素のsuffix属性

JAXB要素のprefix属性

jaxb:javaType要素のparseMethod/printMethod属性

次のすべての条件に合致するようにしてください。

英数字およびアンダーラインから成る。

Java識別子の構文規則に合致する。

7

jaxb:package要素のname属性

JAXB要素のref属性

JAXB要素のcollectionType属性

jaxb:class要素のimplClass属性

次のすべての条件に合致するようにしてください。

英数字，アンダーラインおよびピリオドから成る。

Javaパッケージ名の構文規則に合致する。

8

jaxb:javadoc要素の要素内容

次のすべての条件に合致するようにしてください。

UnicodeのBasic Latinおよび日本語※2から成る。

Javaコメントの構文規則に合致する。

注※1

RFC2732は未サポートです（IPv6未サポート）。

注※2

UnicodeのHiragana，Katakana，CJK Unified Ideographsのカテゴリに含まれる文字です。

付録B.3　JAXB仕様書でベンダ固有とされている機能のサポート範囲

JAXB仕様書でベンダ固有とされている機能のサポート範囲を次の表に示します。

表B‒4　JAXB仕様書でベンダ固有とされている機能のサポート

JSR 222の該当個所

記載ページ

ベンダ固有機能の内容

XML Processorでの機能サポート

4.3 General Validation Processing

35

Unmarshal-time validation

（アンマーシャル時の検証）

アンマーシャル時に妥当性検証する機能をサポートしています。

On-demand validation

（オンデマンド検証）

オンデマンド検証機能はサポートしていません。

Fail-first validation

（フェイルファースト検証）

フェイルファースト検証機能はサポートしていません。

4.5 Marshalling

41

Potentially properties

（マーシャル時の追加のプロパティ）

XML Processor固有の「マーシャル時のプロパティ」はありません。

5.2 Java Package

50

Property setter/getter

（Java値クラスの追加のプロパティ）

XML Processor固有の「Java値クラスのプロパティ」はありません。

5.5.1 Simple Property

57

TypeConstraint validation

（型制約検証）

型制約検証機能はサポートしていません。

6.13 Modifying Schema-Derived Code

153

Distinguish between generated and user added code

（自動生成Javaソースの識別）

csmxjcコマンドの-mark-generatedによって，自動生成Javaソースの識別をサポートしています。

7.1.1 Extending the Binding Language

159

Extending the Binding Language

（バインディング宣言の拡張）

バインディング宣言の拡張機能はサポートしていません。

7.5<globalBindings> Declaration

167

enableFailFastCheck

（enableFailFastCheck属性）

enableFailFastCheck属性はサポートしていません。

7.8<property> Declaration

189

Compatibility

294

non-default operating modes for binding schema languages

（ほかのスキーマ言語のバインディング）

スキーマコンパイラは，XML Schema以外のスキーマ言語をサポートしません。

Compatibility

294

non-default operating modes for mapping Java types to schema languages

（ほかのスキーマ言語マッピング）

スキーマジェネレータは，XML Schema以外のスキーマ言語をサポートしません。

付録G

355

Validator for JAXB 1.0 schema-derived classes

（JAXB1.0互換仕様）

XML Processorでは，JAXB 1.0で作成されたクラスを扱うことはできません。

付録C　XML Processorの効率的な使い方

ここでは，XML Processorを効率的に使用する上で役立つ，各機能の特徴や注意点について説明します。

XML Processorの機能は次の表のように分類されます。

表C‒1　XML Processorの機能の分類

機能の分類

機能に関連する主なJavaのパッケージ

機能の概要

JAXP

基本機能

DOMパーサ

javax.xml.parsers

org.w3c.dom

XML構文解析

SAXパーサ

javax.xml.parsers

org.xml.sax

StAXパーサ

javax.xml.stream

応用機能

XSLT

javax.xml.transform

XML文書変換，出力

XPath

javax.xml.xpath

XPath式を使った部分選択および情報取得

Validation

javax.xml.validation

スキーマ検証

JAXB

JAXB

javax.xml.bind

データ交換

付録C.1　XML Processorの基本機能

XML Processorの基本機能は，XML文書の処理に必要となるXML文書の構文解析を実施します。XML Processorの基本機能が提供する3種類の解析機能（パーサ）と，各パーサの特徴を次に説明します。

(1)　DOMパーサ

(a)　概要

DOMパーサは，XML文書に含まれる要素・属性・テキストなどをすべて解析し，その内容をDOMツリーと呼ばれるオブジェクトツリーとしてメモリ上に展開します。DOM APIを使うことで，DOMツリーの中を自由にたどったり，任意のデータを参照・更新・削除したりできます。

(b)　最適な用途

XML文書を広範囲にわたって処理する場合

XML文書内を複雑な順序で処理する必要がある場合

XML文書の内容を編集する場合

(2)　SAXパーサ

(a)　概要

SAXパーサは，XML文書を先頭から順次解析して，要素の開始や終了，テキスト，処理命令などの解析イベントが出現するたびに所定の処理（コールバックメソッド）を呼び出す，イベント駆動形のパーサです。

解析が開始されると，解析イベントの種類に応じたコールバックメソッドがそのつど呼び出され，要素名やテキストデータなどの解析データが引数としてコールバックメソッドに渡されます。

コールバックメソッドの処理内容をあらかじめ定義しておくことで，XML文書の内容に応じた処理ができます。

(b)　最適な用途

単純な構造のXML文書を処理する場合

XML文書の内容を編集する必要がない，読み取り専用の処理の場合

(3)　StAXパーサ

(a)　概要

StAXパーサはSAXパーサと同じように，XML文書を先頭から順次解析するイベント駆動形パーサです。

SAXパーサでは解析処理が自動的に進むのに対し，StAXパーサではユーザがパーサに対して解析イベントを要求したタイミングで解析処理が進むため，StAXパーサを使うと任意のタイミングで解析処理を進めたり中断したりすることが容易にできます。また，StAXパーサに解析イベントを要求し，それによって得た解析データの種類や内容に応じて処理を振り分けることで，XML文書の内容に応じた処理を実行できます。

(b)　最適な用途

巨大なXML文書の内容を部分的に処理する場合

(4)　各パーサのメリット・デメリット

各パーサのメリットとデメリットを次の表に示します。

表C‒2　各パーサの特徴

パーサ種別

メリット

デメリット

DOMパーサ

XML文書に対して追加や削除などの編集操作ができる。

ほかのパーサに比べてメモリ消費量が大きく，処理速度が遅い。

SAXパーサ

他のパーサに比べてメモリ消費量が小さく，処理速度が速い。

XML文書に対して追加や削除などの編集操作ができない。

StAXパーサ

上記のSAXパーサのメリットに加え，解析の実行・中断をユーザが制御できる。

StAXパーサ単体ではXMLスキーマによる妥当性検証ができない。

付録C.2　XML Processorの応用機能

XML Processorの応用機能は，高度で複雑なXML関連技術を容易に利用できるようにすることで，利便性や保守性を高めます。

応用機能は，基本機能を利用・連携することで実現しています。このため，単純な処理であれば応用機能の代わりに基本機能で実装することもできます。

例えば，XML文書の特定の要素名を別の名前に変更する程度の単純な変換処理であれば，XSLTを使わなくともDOMパーサなどの基本機能で実現できます。

一般的な傾向として，基本機能の方が処理速度が速くなるメリットがある反面，XML文書の構造に依存した処理の記述が必要になったり，記述するコードが複雑になったりといったデメリットがあります。どの機能を利用するのが最適かは，実行性能，メモリ性能，プログラムの保守性，システムや扱うデータの特性などから総合的に判断する必要があります。

XML Processorの応用機能について次に説明します。

(1)　XSLT機能

XSLT機能は，XML文書を別の構造のXML文書，またはHTML文書やプレーンテキストに変換する機能です。

変換規則はXSLTスタイルシートというXML文書で定義するため，複雑な変換処理をプログラムとして記述する必要がなく，プログラムの開発・保守が容易になります。

(2)　XPath機能

XPath機能は，XML文書内の特定の位置を示す式（XPath式）を使って，XML文書から特定の部分を抽出したり，文書内容や文書構造に関する情報を取得したりできます。

XML文書の中に特定の要素や属性が存在するかチェックする処理や，XML文書の一部分を取り出す処理を単純なコードで実現できます。

(3)　Validation機能

Validation機能は，XMLスキーマで定義された文法ルールをオブジェクトに変換することで，XMLスキーマを使った検証処理を効率化する機能です。

1つのXMLスキーマ文書を使って複数回の検証処理を実行する場合，基本機能を使うと，パースのたびに必ず文法ルールを生成するためにXMLスキーマ文書の解析処理が実行されます。Validation機能を使うとXMLスキーマの文法ルールをオブジェクトとして再利用できるため，スキーマ文書の解析処理が1回で済みます。

(4)　JAXB機能

JAXB機能は，XML文書に含まれるデータをJavaクラスに読み込んだり，Javaクラス内のデータをXML文書として出力したりするデータ交換処理を容易に記述するための機能です。

JavaクラスからXMLスキーマ文書を自動生成したり，XMLスキーマからJavaクラスを自動生成したりする付加機能を併用することで，データ構造の変更にも柔軟に対応できます。

付録C.3　XML Processorを効率的に使うためのノウハウ

XML Processorを効率的に使うためのノウハウを次に示します。

次のメソッドは内部でスレッドの排他制御を実行します。そのため，複数のスレッドでこれらのメソッドを同時に呼び出した場合，排他待ちが発生してスループットに影響が出るおそれがあります。

次のJAXP APIの各ファクトリクラスのnewInstanceメソッド

javax.xml.datatype.DatatypeFactory

javax.xml.parsers.DocumentBuilderFactory

javax.xml.parsers.SAXParserFactory

javax.xml.transform.TransformerFactory

javax.xml.validation.SchemaFactory

javax.xml.xpath.XPathFactory

javax.xml.parsers.DocumentBuilderクラスのnewDocumentBuilderメソッド

javax.xml.transform.Transformerクラスのtransformメソッド

javax.xml.XPathクラスのevaluateメソッド

このうち1.〜2.はオブジェクトを生成するため，処理が比較的重いメソッドです。そのため，メソッドはなるべく頻繁に呼び出さないで，生成したオブジェクトを再利用してください。

XSLT機能で同じスタイルシートから複数のTransformerを作成する必要がある場合，TransformerFactoryから直接Transformerを作成するよりも，Templatesオブジェクトを1つ作成し，そこから複数のTransformerを作成する方が実行性能面で有利です。

XPath機能で同じXPath式を再利用する場合，XPathクラスのcompileメソッドを使ってXPathExpressionオブジェクトを作成し，再利用する方が実行性能の面で有利です。

DOM APIを使ってXPath機能と同等の処理を実現できます。実行速度の面ではDOM APIを使った方が有利ですが，入力XML文書の構造に依存した複雑な処理を記述する必要があり，さらにXML文書の構造が変更された場合は処理を書き直す必要があるため，保守性の面ではXPathよりも劣ります。

Validation機能の代わりにDOMパーサやSAXパーサでもXMLスキーマを使った検証処理を実現できますが，同じスキーマ文書を使った検証処理を繰り返す場合，スキーマ文書の解析結果をオブジェクトとして再利用できるValidation機能の方が実行性能の面で有利です。

JAXBContextオブジェクトの生成処理は負荷が高くなるため，なるべくオブジェクトを再利用した方が実行性能の面で有利です。

付録D　用語解説

マニュアルで使用する用語について

マニュアル「アプリケーションサーバ & BPM/ESB基盤 用語解説」を参照してください。

索引

A

Apache独自の機能の動作差異[1]

C

Cosminexus 09-80以降の動作の差異[1]

csmschemagenコマンド〔JavaからXML Schemaへマッピングする〕[1]

csmxjcコマンド〔XML SchemaからJavaへバインディングする〕[1]

D

DocumentBuilderに解析結果オブジェクトを設定する方法[1]

DOMツリーを操作するアプリケーションの処理の流れ[1]

DOMパーサ[1]

DOMパーサでShift_JIS切り替え機能を使用する方法[1]

DOMパーサでの解析を行うアプリケーションの処理の流れ[1]

DOMパーサに関する注意事項[1]

DOMパーサを使用するサンプルプログラム[1]

DOMパーサを使用するサンプルプログラムの作成の流れ[1]

DOMパーサを使用する場合のサンプルプログラム[1]

J

javax.xml.datatypeパッケージ[1]

javax.xml.datatypeパッケージに関する注意事項[1]

javax.xml.datatypeパッケージの動作差異[1]

javax.xml.namespaceパッケージ[1]

javax.xml.parsersパッケージ[1]

javax.xml.stream.eventsパッケージ[1]

javax.xml.stream.utilパッケージ[1]

javax.xml.streamパッケージ[1]

javax.xml.transform.domパッケージ[1]

javax.xml.transform.saxパッケージ[1]

javax.xml.transform.staxパッケージ[1]

javax.xml.transform.streamパッケージ[1]

javax.xml.transformパッケージ[1]

javax.xml.validationパッケージ[1]

javax.xml.validationパッケージに関する注意事項[1]

javax.xml.validationパッケージに含まれるクラスを用いてXML文書を検証するアプリケーションの処理の流れ[1]

javax.xml.xpathパッケージ[1]

javax.xml.xpathパッケージに関する注意事項[1]

javax.xmlパッケージ[1]

JavaからXML Schemaへマッピングする〔csmschemagenコマンド〕[1]

JAXBが規定するパッケージとその機能[1]

JAXBが規定するパッケージに含まれるAPIの概要[1]

JAXB機能[1]

JAXB仕様書でベンダ固有とされている機能のサポート範囲[1]

JAXB仕様のサポート範囲[1]

JAXBで定義された仕様[1]

JAXBとは[1]

JAXBに関する注意事項[1]

JAXBの機能のサポート範囲[1]

JAXBのコマンド[1]

JAXBの動作の差異[1]

JAXBの文字のサポート範囲[1]

JAXP1.4機能の共通の注意事項[1]

JAXPが規定するパッケージ[1]

javax.xml[1]

javax.xml.datatype[1]

javax.xml.namespace[1]

javax.xml.parsers[1]

javax.xml.stream[1]

javax.xml.stream.events[1]

javax.xml.stream.util[1]

javax.xml.transform[1]

javax.xml.transform.dom[1]

javax.xml.transform.sax[1]

javax.xml.transform.stax[1]

javax.xml.transform.stream[1]

javax.xml.validation[1]

javax.xml.xpath[1]

org.w3c.dom[1]

org.w3c.dom.bootstrap[1]

org.w3c.dom.events[1]

org.w3c.dom.ls[1]

org.xml.sax[1]

org.xml.sax.ext[1]

org.xml.sax.helpers[1]

JAXPが規定するパッケージに含まれるAPIの概要[1]

JAXPでXML文書を解析する流れ[1]

JAXPでXML文書を変換する流れ[1]

JAXPとは[1]

M

MS932[1]

O

org.w3c.dom.bootstrapパッケージ[1]

org.w3c.dom.bootstrapパッケージに関する注意事項[1]

org.w3c.dom.eventsパッケージ[1]

org.w3c.dom.lsパッケージ[1]

org.w3c.dom.lsパッケージに関する注意事項[1]

org.w3c.domパッケージ[1]

org.w3c.domパッケージに関する注意事項[1]

org.xml.sax.extパッケージ[1]

org.xml.sax.extパッケージに関する注意事項[1]

org.xml.sax.helpersパッケージ[1]

org.xml.saxパッケージ[1]

P

PreparsedObjectFactoryクラス[1]

PreparsedObjectクラス[1]

S

SAX2のフィーチャー一覧[1]

SAX2のフィーチャーおよびプロパティの使用方法[1]

SAX2のフィーチャーの使用方法[1]

SAX2のプロパティ一覧[1]

SAX2のプロパティの使用方法[1]

SAXParserに解析結果オブジェクトを設定する方法[1]

SAXイベントを処理するアプリケーションの処理の流れ[1]

SAXパーサ[1]

SAXパーサでShift_JIS切り替え機能を使用する方法[1]

SAXパーサでの解析を行うアプリケーションの処理の流れ[1]

SAXパーサに関する注意事項[1]

SAXパーサを使用するサンプルプログラム[1]

SAXパーサを使用するサンプルプログラムの作成の流れ[1]

SAXパーサを使用する場合のサンプルプログラム[1]

Shift_JIS切り替え機能[1]

Shift_JIS切り替え機能の設定用メソッド[1]

Shift_JIS切り替え機能のプロパティの使用方法[1]

Shift_JIS切り替え機能を使用する方法

DOMパーサ[1]

SAXパーサ[1]

XSLTトランスフォーマ[1]

SJIS[1]

StAXの動作差異[1]

StAXパーサ[1]

T

TransformerFactoryXSLTCクラス[1]

V

Validation機能[1]

X

XIncludeに関する注意事項[1]

XML Processorが提供するJAXPの機能[1]

XML Processor全般に関する注意事項[1]

XML Processorの応用機能[1]

XML Processorの基本機能[1]

XML Processorの効率的な使い方[1]

XML Processorを効率的に使うためのノウハウ[1]

XML Processorを使用したプログラムの作成の流れ[1]

XMLReaderに解析結果オブジェクトを設定する方法[1]

XML SchemaからJavaへバインディングする〔csmxjcコマンド〕[1]

XML SchemaのエラーメッセージとW3C仕様との対応[1]

XML Schemaのプロパティの使用方法[1]

XML Schemaのプロパティの設定方法

DOMパーサ[1]

SAXパーサ[1]

XML Schemaを使用するサンプルプログラム[1]

XML Schemaを使用するサンプルプログラムの処理の流れ[1]

XML文書（purchaseOrder.xml）[1]

XML文書（purchaseOrder-fail.xml）[1]

XML文書のencoding指定と適用される文字エンコーディングとの対応[1]

XML文書の解析[1]

XML文書のロード，および保存を行うアプリケーションの処理の流れ[1]

XPath機能[1]

XPath式を評価するアプリケーションの処理の流れ[1]

XSLT/XSLTC共通の注意事項[1]

XSLTCトランスフォーマ機能[1]

概要[1]

システムの開発・運用[1]

使用するクラス[1]

使用方法[1]

XSLTCトランスフォーマ機能を使用する場合のプログラム変更[1]

XSLTCトランスフォーマを使用するサンプルプログラム[1]

XSLTCに関する注意事項[1]

XPath式[1]

XSLT要素[1]

エラーを通知しないケース[1]

スタイルシートサイズ[1]

その他[1]

変換処理性能[1]

XSLT機能[1]

XSLTトランスフォーマでShift_JIS切り替え機能を使用する方法[1]

XSLTトランスフォーマを使用するサンプルプログラム[1]

XSLTトランスフォーマを使用するサンプルプログラムの作成の流れ[1]

XSLTに関する注意事項[1]

エラーを通知しないケース[1]

その他[1]

XSLTによる変換を行うアプリケーションの処理の流れ[1]

XSLTの動作の差異[1]

XSLTのフィーチャー一覧[1]

い

位置づけ[1]

お

応用機能[1]

か

解析結果オブジェクト[1]

解析結果オブジェクトの生成[1]

解析結果オブジェクトの設定[1]

解析結果オブジェクトの設定用メソッド[1]

解析結果オブジェクトを設定する方法

DocumentBuilder[1]

SAXParser[1]

XMLReader[1]

概要[1]

各パーサのメリット・デメリット[1]

き

基本機能[1]

共通の注意事項[1]

け

検証パースの互換機能[1]

こ

高速パース機能[1]

高速パース機能で使用するクラス[1]

高速パース機能に関する注意事項[1]

XInclude[1]

XML1.1[1]

解析結果オブジェクトの設定[1]

解析結果オブジェクトを利用するXMLパーサ[1]

解析性能[1]

事前解析用XML文書[1]

絶対パスの指定方法[1]

チューニング情報[1]

高速パース機能の概要[1]

高速パース機能の対象となるparseメソッド[1]

高速パース機能の動作差異[1]

高速パース機能のプロパティの使用方法[1]

高速パース機能を使用するためのコード例[1]

高速パースのための作業の流れ[1]

互換オプション機能[1]

コマンド一覧[1]

さ

サポート範囲[1]

サンプルプログラム

DOMパーサを使用する[1]

SAXパーサを使用する[1]

XML Schemaを使用する[1]

XML Schemaを使用する（DOMパーサ）[1]

XML Schemaを使用する（SAXパーサ）[1]

XSLTCトランスフォーマを使用する[1]

XSLTトランスフォーマを使用する[1]

し

事前解析用XML文書[1]

事前解析用XML文書の作成[1]

事前解析用XML文書のチューニング[1]

事前解析用XML文書を作成するための指針[1]

実行環境での位置づけ[1]

実行時の注意事項[1]

実装依存仕様に関する注意事項[1]

使用時の注意事項[1]

使用できるXMLパーサ，XSLTトランスフォーマなどの機能[1]

処理できる文字コード[1]

処理の流れ

DOMツリーを操作するアプリケーション[1]

DOMパーサでの解析を行うアプリケーション[1]

javax.xml.validationパッケージに含まれるクラスを用いてXML文書を検証するアプリケーション[1]

SAXイベントを処理するアプリケーション[1]

SAXパーサでの解析を行うアプリケーション[1]

XML文書のロード，および保存を行うアプリケーション[1]

XPath式を評価するアプリケーション[1]

XSLTによる変換を行うアプリケーション[1]

日付／時刻型データを処理するアプリケーション[1]

す

スキーマキャッシュ機能[1]

スキーマキャッシュ機能に関する注意事項[1]

エラー出力に関する注意事項[1]

キャッシュの再構築・削除に関する注意事項[1]

スキーマ定義ファイルに関する注意事項[1]

性能に関する注意事項[1]

スキーマキャッシュ機能の概要[1]

スキーマ検証に関する注意事項[1]

スキーマコンパイラに関する注意事項[1]

スキーマジェネレータに関する注意事項[1]

スキーマ文書（personalData.xsd）[1]

スキーマ文書（purchaseOrder.xsd）[1]

スキーマ文書をXML文書内で設定する方法[1]

せ

セキュアプロセッシング機能[1]

設定するプロパティの値とその意味（Shift_JIS切り替え機能）[1]

設定するプロパティの値とその意味（高速パース機能）[1]

ち

注意事項

DOMパーサ[1]

javax.xml.datatypeパッケージ[1]

javax.xml.validationパッケージ[1]

javax.xml.xpathパッケージ[1]

org.w3c.dom.bootstrapパッケージ[1]

org.w3c.dom.lsパッケージ[1]

org.w3c.domパッケージ[1]

org.xml.sax.extパッケージ[1]

SAXパーサ[1]

XInclude[1]

XSLT[1]

XSLT/XSLTC共通[1]

XSLTC[1]

高速パース機能[1]

実装依存仕様[1]

スキーマキャッシュ機能[1]

スキーマ検証[1]

注意事項〔XML Processor全般〕[1]

チューニングサマリファイル[1]

チューニングサマリファイルの詳細[1]

チューニング詳細ファイル[1]

チューニング詳細ファイルの詳細[1]

チューニング情報の出力先〔高速パース機能〕[1]

チューニング情報の出力方法〔高速パース機能〕[1]

チューニング情報の種類〔高速パース機能〕[1]

チューニング情報の利用方法〔高速パース機能〕[1]

チューニング情報を出力するためのシステムプロパティ〔高速パース機能〕[1]

と

特長[1]

特定するスキーマ文書の種類と使用する属性の関係[1]

トラブルシュート[1]

な

名前空間URI〔Apache独自〕[1]

は

パーサ切り替え機能[1]

バージョン間の差異[1]

JAXBの動作の差異[1]

XSLTの動作の差異[1]

パッケージ[1]

ひ

日付／時刻型データを処理するアプリケーションの処理の流れ[1]

ふ

フィーチャー〔Apache独自〕[1]

フィーチャーおよびプロパティの使用方法[1]

SAX2[1]

Shift_JIS切り替え機能[1]

XML Schema[1]

XSLT[1]

高速パース機能[1]

プログラム作成の流れ[1]

プログラム実行時のトラブルシュート[1]

プログラムの作成方法[1]

プロパティ〔Apache独自〕[1]

プロパティの使用方法

StAX[1]