6.4 StAXに関する注意事項
StAXに関する注意事項を次の表に示します。
項番 |
注意事項 |
---|---|
1 |
StAX1.0仕様書には,動作が明確に定義されていないメソッドがあります。動作が明確に定義されていないメソッドの動作は,実装に依存します。引数を事前に確認するなどして,未規定の動作がないように対処してください。 動作が未規定の場合の動作例を次に示します。
|
2 |
XMLStreamReaderインタフェースのメソッドの一部は,Javadocでの説明と各APIの説明との間に差異があります。XML Processorは,APIの説明に従って動作します。 説明に差異のあるメソッドと差異の内容を次に示します。
|
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に,属性数または名前空間宣言数を超えた値を指定する場合です。
[標準仕様] 動作の規定なし。 [XML Processorの動作] isAttributeSpecified(int index)メソッドは,戻り値がfalseになります。 それ以外のメソッドは,戻り値がnullになります。 |
7 |
[条件] COMMENTイベント型に対しXMLStreamReaderインタフェースのgetTextCharacters(int sourceStart, char[] target, int targetStart, int length)メソッドを実行する場合です。 [標準仕様] Javadocの説明とXMLStreamReaderの説明との間で次の差異があります。
[XML Processorの動作] COMMENTイベントに関連づけられたテキストを取得します。 |
8 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] 動作の規定なし。 [XML Processorの動作] バインドされている接頭辞のうちの1つが戻り値となります。 |
9 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] 動作の規定なし。 [XML Processorの動作] setPrefixで指定されたURIでバインド先の接頭辞を再設定します。 |
10 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] 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メソッドは使用しないでください。
|
17 |
次に示すXMLInputFactoryクラスのプロパティの指定は,javax.xml.stream.supportDTDプロパティの値にfalseが設定されていても影響されません。
|
18 |
[条件] XMLEventWriterクラスのadd(XMLEventReader reader)メソッドで,入力XMLに次の要素や属性が含まれる場合,出力XMLと入力XMLとで形式が異なります。
[XML Processorの動作]
|
19 |
XMLEventFactoryクラスのcreateStartElementメソッドで生成したStartElementイベントに対するgetNamespaceContext()メソッドの戻り値は,nullになります。 |
20 |
ISO-10646-UCS-4エンコーディングは使用できません。 |
21 |
バージョンが1.1のXML文書は使用できません。 |
22 |
StAXでは,次の部分に補助文字を指定できません。
|
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の動作] 次のように戻り値が異なります。
|
29 |
[条件] ENTITY_REFERENCEイベント型に対して,XMLStreamReaderインタフェースのhasName()メソッドを実行する場合です。 [XML Processorの動作] 戻り値はtrueとなります。 |
30 |
[条件] DTDイベント型に対して,XMLStreamReaderインタフェースのgetText()メソッドを実行する場合です。 [XML Processorの動作] 「DOCTYPE宣言の文字列値」を返します。DTD内部サブセットがある場合も同様です。「DTD内部サブセットの文字列値」は返されません。 |
31 |
[条件] 内部エンティティ参照を含む要素のコンテンツに対して,XMLStreamReaderインタフェースのgetElementText()メソッドを実行する場合です。 [XML Processorの動作] 戻り値は,内部エンティティ参照の置換テキストが2回連結された文字列となります。 |
32 |
[条件] 次のどちらかに該当する場合です。
[XML Processorの動作] 戻り値は,要素のないjava.util.Listとなります。 |
33 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] 取得したDTD宣言のテキストが不当になります。 |
34 |
[条件] XML宣言の擬似属性の属性値に不当な文字列を指定した場合です。 [XML Processorの動作] com.cosminexus.stax.xml.stream.internal.xni.XNIException例外が発生します。 また,メッセージ中の{}内に詳細文字列が出力されない場合があります。
|
35 |
[条件] 次に示す,どれかのメソッドを実行した場合です。
[XML Processorの動作] 例外が発生した場所を特定するための近似値として,Location情報を取得します。 |
36 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] パースエラーが発生します。 [XML Processorの動作] パースは正常終了します。 |
37 |
[条件] XMLEventFactoryクラスのcreateStartDocument(String encoding, String version, boolean standalone)メソッドのstandaloneパラメタにtrueを設定する場合です。 [標準仕様] standaloneの状態がtrueのXML文書が生成されます。 [XML Processorの動作] standalone宣言が生成されません。 |
38 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] デフォルト値の1.0を返します。 [XML Processorの動作] nullを返します。 |
39 |
[条件] XML文書内の次の部分に対して,XMLEventReaderクラスのnextEvent()メソッド実行をする場合です。
[XML Processorの動作]
|
40 |
[条件] XML文書内の次の部分に対して,XMLStreamReaderインタフェースのgetEventType()メソッドを実行する場合です。
[XML Processorの動作] 空白文字列もCDATAセクションもCHARACTERSイベント型となるため,CHARACTERSイベント型として処理してください。 |
41 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] 属性だけが出力されます。名前空間宣言(xmlns:prefix="namespaceURI")は出力されません。 |
42 |
次に示すjavax.xml.stream.eventsパッケージに含まれるインタフェースでは,writeAsEncodedUnicode(Writer writer)メソッドは使用できません。
|
43 |
javax.xml.stream.utilパッケージに含まれるXMLEventAllocatorインタフェースのallocate(XMLStreamReader reader, XMLEventConsumer consumer)メソッドは,使用できません。 |
44 |
マルチスレッドプログラミングの場合,XMLInputFactoryクラスはスレッドセーフではありません。そのため,複数のスレッドが同時に同じXMLInputFactoryインスタンスにアクセスしないように注意してください。 スレッド間の競合を避けるため,次のどちらかの方法を採用してください。
|
45 |
マルチスレッドプログラミングの場合,XMLOutputFactoryクラスはスレッドセーフではありません。そのため,複数のスレッドが同時に同じXMLOutputFactoryインスタンスにアクセスしないように注意してください。 スレッド間の競合を避けるため,次のどちらかの方法を採用してください。
|
46 |
マルチスレッドプログラミングの場合,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型のオブジェクトはサポートしていません。 [標準仕様] このリソースの戻り値の型は,次のどれかです。
|
53 |
次に示すイベントに対するgetLocation()メソッドの戻り値はnullです。
|
54 |
XMLOutputFactoryクラスのうち,次に示すメソッドの引数resultにシステム識別子を指定していないStAXResultは,指定できません。
|
55 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] 接頭辞は書き込まれません。 [XML Processorの動作] 接頭辞が書き込まれます。 |
56 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] 接頭辞がランダムに生成されます。
[XML Processorの動作] ランダムな接頭辞は生成されません。
|
57 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] 名前空間宣言が生成されます。 [XML Processorの動作] 名前空間宣言が生成されません。 |
58 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] XMLStreamException例外が発生します。 [XML Processorの動作] エラーにはなりません。次のように書き込まれます。
|
59 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] 接頭辞は書き込まれません。 [XML Processorの動作] 次に示す接頭辞が書き込まれます。
|
60 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] 接頭辞は書き込まれません。 [XML Processorの動作] XMLStreamException例外が発生します。 |
61 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] prefix == "" || null の場合,デフォルトの名前空間として処理されます。接頭辞は生成または書き込まれません。 namespaceURI がバインドされていない場合は,xmlns宣言が生成または書き込まれます。 [XML Processorの動作] 接頭辞はランダムに生成されます。デフォルトの名前空間としては処理されません。 |
62 |
[条件] XMLInputFactoryクラスのうち,次に示すメソッドの引数encodingに"ISO-10646-UCS-2"が,引数streamにencoding擬似属性"ISO-10646-UCS-2"が指定されたXML文書を指定する場合です。
[XML Processorの動作] com.cosminexus.stax.xml.stream.internal.xni.XNIException例外が発生します。 [回避策] encoding指定のない,createXMLEventReaderメソッドまたはcreateXMLStreamReaderメソッドで処理してください。 |
63 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様]
[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)メソッドに対して,システム識別子が指定されていない型を指定する場合です。該当する型を次に示します。
[XML Processorの動作] XMLStreamException例外が発生します。 |
67 |
DTDイベントのgetProcessedDTD()メソッドの戻り値は,常にnullです。 |
68 |
EndelementイベントのgetNamespaces()メソッドの戻り値は,常に空のIteratorです。 [XML Processorの動作] 範囲外になった名前空間のIteratorを返します。 |
69 |
[条件] 次のすべての条件に該当する場合です。
[標準仕様] XMLStreamReaderインタフェースまたはXMLEventReaderインタフェースからXMLStreamException例外が発生します。 [XML Processorの動作]
|
70 |
XMLOutputFactoryクラスのcreateXMLEventWriter(OutputStream stream)メソッドやcreateXMLStreamWriter(OutputStream stream)メソッドで出力エンコーディングを指定しない場合,XMLEventWriterやXMLStreamWriterはシステムのデフォルト文字コードで出力されます。 |
71 |
XMLEventFactoryクラスのcreateStartDocument()メソッドの実行結果は,createStartDocument(String encoding, ...)メソッドの引数encodingにUTF-8を指定した場合と同じです。 |
72 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] 出力エンコーディングがUTF-8およびUTF-16以外の,encoding擬似属性のない不正なXML文書を出力します。 [回避策] XMLOutputFactoryクラスのcreateXMLEventWriterメソッドやcreateXMLStreamWriterメソッドのencoding指定には,UTF-8を指定してください。 |
73 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] 上記の条件で作成したStAXResultを次に示すメソッドのどちらかの引数に指定して,名前空間宣言を含むXML文書を処理すると,XMLStreamException例外が発生します。
[回避策] XMLOutputFactoryのjavax.xml.stream.isRepairingNamespacesプロパティにはBoolean.TRUEを設定してください。 |