<any> ワイルドカード要素

XML スキーマ

<any> 要素は、ワイルドカードスキーマコンポーネントの XML 表現を含みます。

<any> 要素は、<choice>、<sequence>、<appinfo>、<documentation> 要素 (このうち、<sequence> は Notes® と Domino® に関連します) の内容モデルに出現します。"minOccurs" 属性または "maxOccurs" 属性を指定することができ、対応するインスタンス要素を空白にするか、複数指定できます (minOccurs と maxOccurs のデフォルト値はいずれも "1" です)。<any> 要素では、"namespace" 属性も許可します。この値によって、どの要素がインスタンスで許可されるか (どの名前空間からか) が決まります。複数の <any> 要素を内容モデル内で隣接させる (<sequence> 内で、1 つの要素の次に別の要素を続ける) ことができます。ただし、その場合、対応する名前空間が重複したり、他の隣接する要素との両義性があったりしてはなりません。重複や両義性があると、スキーマは無効と見なされます。

WSDL 1.1

"xs:any" の値を指定して、WSDL 文書の <message> <part> を直接記述することもできます。例えば、次のようになります。

<message name="fooInput">
    <part name="fooArg" element="xs:any"/>
        </message>

この使用方法では、サービス操作の入力引数または戻り引数を入力します。

Java (JAX-RPC および Axis 1.1)

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;
  }
}

LotusScript

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:

public class Address {
   private javax.xml.soap.SOAPElement any;
   private java.lang.String street;
   private javax.xml.soap.SOAPElement any1;
   // housekeeping, getters/setters
}

LotusScript:

Class Address
    Public any As NotesDOMDocumentNode
    Public street As String
    Public any1 As NotesDOMDocumentNode

    Sub NEW
    End Sub
End Class
<complexType name=address">
  <sequence>
    <any namespace="##other"/>
    <element name="street" type="xsd:string"/>
    <any namespace="##other"/>
  </sequence>
</complexType>

または LotusScript の大文字の名前属性。

実装の構造:

WSDL へのエクスポート結果:

Java:

public class PortType {
  javax.xml.soap.SOAPElement getAny() {
    return null;
    }
}

LotusScript:

Class PortType {
  Function getAny() As NotesDOMElementNode {
  }
}

ラップされているサービスのみ:

<types>
  <schema>
   <element name="GetAnyResponse">
     <complexType>
       <sequence>
         <any />       </sequence>
     </complexType>
   </schema>
  <types>

  <message name="GetAnyResponse">
    <part element="impl:GetAnyResponse"  name="parameters"/>
  </message>

ラップされていないサービスは、WSDL 操作の保存または表示時に「無効な WSDL」というエラーメッセージを出して停止します。