<any> 要素は、ワイルドカードスキーマコンポーネントの XML 表現を含みます。
<any> 要素は、<choice>、<sequence>、<appinfo>、<documentation> 要素 (このうち、<sequence> は Notes® と Domino® に関連します) の内容モデルに出現します。"minOccurs" 属性または "maxOccurs" 属性を指定することができ、対応するインスタンス要素を空白にするか、複数指定できます (minOccurs と maxOccurs のデフォルト値はいずれも "1" です)。<any> 要素では、"namespace" 属性も許可します。この値によって、どの要素がインスタンスで許可されるか (どの名前空間からか) が決まります。複数の <any> 要素を内容モデル内で隣接させる (<sequence> 内で、1 つの要素の次に別の要素を続ける) ことができます。ただし、その場合、対応する名前空間が重複したり、他の隣接する要素との両義性があったりしてはなりません。重複や両義性があると、スキーマは無効と見なされます。
"xs:any" の値を指定して、WSDL 文書の <message> <part> を直接記述することもできます。例えば、次のようになります。
<message name="fooInput">
<part name="fooArg" element="xs:any"/>
</message>
この使用方法では、サービス操作の入力引数または戻り引数を入力します。
JAX-RPC 1.1 仕様では、Java™ javax.xml.soap.SOAPElement インターフェースを <any> 要素の Java マッピングとして規定します。
Notes/Domino 7.x では、基となる Axis 1.1 実装は、org.apache.axis.message.MessageElement 型の対応する Java クラスメンバーを生成し、実行時に直列化/非直列化することによって、実際に <any> をサポートします。MessageElement クラスが SOAPElement インターフェースの実装である限り、JAX-RPC 1.1 の要件を満たします。ただし、MessageElement クラスは 90 以上のパブリックメソッドを公開していて、その多くは内部的に使用するためのものです。したがって、Notes/Domino 7.x での <any> のサポートは、公開された MessageElement クラスのサイズと複雑さが原因で無効にされていました。
Domino 8 Java Web サービスでは、<any> XML スキーマ <element> および WSDL 1.1 サービス操作の入力値の型または戻り値の型は、(基となる、verbose Axis 1.1 MessageElement クラスでなく) javax.xml.soap.SOAPElement インターフェース型としてのみインポートされます。あるいは、Java 値型のクラスの javax.xml.soap.SOAPElement メンバーから、<complexType> の <sequence> 要素内の <any> 要素として WSDL が生成されます。Java サービス操作に対する SOAPElement の入力値の型または戻り値の型から、「ラップされた」サービスに対してのみ WSDL が生成されます。これは、<complexType> 内の親 <sequence> 要素内に、妥当な XML スキーマ構文で生成された <any> 要素を表すことができます。
javax.xml.soap.SOAPElement オブジェクトは、java.xml.soap.SOAPFactory クラスを使用することによって Domino 8 Web サービスでインスタンス化できます。サポートされる SOAPElement 操作は、javax.xml.soap.SOAPElement インターフェースと、それに関連する javax.xml.soap パッケージ内のインターフェースに指定される操作です。次の例は、Domino 8 Java Web サービスで SOAPElement オブジェクトをインスタンス化し、データを埋め込んで返す方法を示しています。
import javax.xml.soap.*;
public class PortType {
public SOAPElement getAny() {
try {
SOAPFactory SF = SOAPFactory.newInstance();
SOAPElement SE = SF.createElement( "anyPart", "ns", "theNamespace" );
Name nam = SF.createName( "xsi:type", "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
SE.addAttribute ( nam, "xsd:string" );
SE.addTextNode( "The quick brown fox" );
return SE;
} catch (SOAPException se) {
se.printStackTrace();
}
return null;
}
}
Domino 8 LotusScript® Web サービスでは、<any> XML スキーマ <element> および WSDL 1.1 サービス操作の入力値の型または戻り値の型は、NotesDOMElementNode バックエンドクラスインスタンスとしてインポートされます。あるいは、LotusScript 値型のクラスの NotesDOMElementNode メンバーから、<complexType> の <sequence> 要素内の <any> 要素として WSDL が生成されます。LotusScript サービス操作に対する NotesDOMElementNode の入力値の型または戻り値の型から、「ラップされた」サービスに対してのみ WSDL が生成されます。これは、<complexType> 内の親 <sequence> 要素内に、妥当な XML スキーマ構文で生成された <any> 要素を表すことができます。
生成された WSDL 値型の <any> 要素には、XML スキーマで定義されて「上位の <schema> 要素の targetNamespace でないこと」を示す、名前空間の属性値 "##other" が含まれます。これによって、生成される <any> の正規の名前空間と、隣接する明示的な <element> のデフォルトの名前空間の間の重複を回避し、WSDL の修復と再インポートの必要性を減らします。
以下に例を示します。
元の WSDL complexType: |
Java へのインポート結果: |
---|---|
LotusScript へのインポート結果: |
|
元のラップされた WSDL 操作: |
Java へのインポート結果: |
LotusScript へのインポート結果: |
|
WSDL 操作: |
WSDL インポートは「無効な WSDL」というメッセージを出して停止 |
ただし:
実装の構造: |
WSDL へのエクスポート結果: |
---|---|
Java:
LotusScript:
|
または LotusScript の大文字の名前属性。 |
実装の構造: |
WSDL へのエクスポート結果: |
Java:
LotusScript:
|
ラップされているサービスのみ:
ラップされていないサービスは、WSDL 操作の保存または表示時に「無効な WSDL」というエラーメッセージを出して停止します。 |