Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

XML スキーマへの投影の制御

この章では、XML スキーマへの Caché クラスの投影を制御する方法について説明します。以下のトピックについて説明します。

この章の XML 例はリテラル形式になります。

この章で説明されているクラスとプロパティのパラメータ
  • CONTENT

  • DISPLAYLIST

  • VALUELIST

  • ESCAPE

  • MAXLEN

  • MINLEN

  • MINVAL

  • XMLFractionDigits

  • XMLTotalDigits

  • XMLLISTPARAMETER

  • XSDTYPE

  • XMLTYPE

  • SUPPRESSTYPEPREFIX

XML 対応クラスのスキーマの表示

XML の Caché クラスを有効にすると、そのクラスの表示可能な XML スキーマを明示的に作成することになります。任意の XML 対応クラスのスキーマを表示するには、以下の 2 つのオプションがあります。

  • %XML.SchemaOpens in a new tab%XML.WriterOpens in a new tab を使用して完全なスキーマ・ドキュメントを生成できます。詳細は、"Caché での XML の使用法" の “クラスからの XML スキーマの生成” を参照してください。

  • XML 対応クラスの XMLSchema() クラス・メソッドを使用できます。このメソッドは、このクラスの XML スキーマを現在のデバイスに記述します。このメソッドは XML 宣言を記述しません。また、ネームスペースを無視するので、使用には制限があります。ただし、XML タイプのみが必要な場合は、このメソッドは役に立ちます。

この章では主に XMLSchema() クラス・メソッドを使用します。これは、このメソッドが 1 行のみのコードで使用できるためです。

例えば、以下のクラス定義について考えてみます。

Class GXML.Person Extends (%Persistent, %Populate, %XML.Adaptor) 
{
Property Name As %Name;
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h");
Property GroupID As %String (XMLPROJECTION="ATTRIBUTE");
Property OtherID As %String(XMLPROJECTION = "NONE");
Property Address As GXML.Address;
Property Doctors As list Of GXML.Doctor;
}

GXML.Address クラスは以下のとおりです。

Class GXML.Address Extends (%Persistent, %Populate, %XML.Adaptor) 
{
Property Street As %String;
Property City As %String;
Property State As %String(MAXLEN = 2, PATTERN = "2u");
Property Zip As %String(MAXLEN = 10, PATTERN = "5n.1(1""-""4n)");
}

GXML.Doctor クラスは以下のとおりです。

Class GXML.Doctor Extends (%Persistent, %Populate, %XML.Adaptor) 
{
Property Name As %Name;
}

GXML.Person クラスのスキーマを表示するには、ターミナルに以下のコマンドを入力します。

 do ##class(GXML.Person).XMLSchema()

以下のようになります。

<s:complexType name="Person">
    <s:sequence>
        <s:element name="Name" type="s:string" minOccurs="0" />
        <s:element name="DOB" type="s:date" minOccurs="0" />
        <s:element name="Address" type="s_Address" minOccurs="0" />
        <s:element name="Doctors" type="ArrayOfDoctorDoctor" minOccurs="0" />
    </s:sequence>
    <s:attribute name="GroupID" type="s:string" />
</s:complexType>
<s:complexType name="s_Address">
    <s:sequence>
        <s:element name="City" type="s:string" minOccurs="0" />
        <s:element name="Zip" type="s:string" minOccurs="0" />
    </s:sequence>
</s:complexType>
<s:complexType name="ArrayOfDoctorDoctor">
    <s:sequence>
        <s:element name="Doctor" type="Doctor" 
minOccurs="0" maxOccurs="unbounded" nillable="true" />
    </s:sequence>
</s:complexType>
<s:complexType name="Doctor">
    <s:sequence>
        <s:element name="Name" type="s:string" minOccurs="0" />
    </s:sequence>
</s:complexType>

これから以下の点がわかります。

  • <Person><Address>、および <Doctor> 型のスキーマは、直接、対応するクラス定義に基づいています。

  • スキーマは、投影されるプロパティのみで構成されます。

  • スキーマは、各プロパティが要素として投影されるか、属性として投影されるかを識別します。例えば、GroupID は属性で、Name は要素です。

  • プロパティのその他のパラメータは、スキーマに影響を与えることがあります。

  • この場合、クラス・プロパティは文字列型で、基本的な XSD タイプ (http://www.w3.org/TR/xmlschema-2/Opens in a new tab を参照) の 1 つです。

リテラル・プロパティの XML スキーマへの投影

このセクションでは、リテラル (非コレクション) プロパティが XML タイプにどのように投影されるか、および XML スキーマに影響を及ぼすオプションについて説明します。項目は以下のとおりです。

Caché データ型クラスの既定の XSD タイプ

クラスまたはクラス・プロパティが一般的な Caché データ型クラスのいずれかに基づく場合、XML タイプは以下のテーブルに従って自動的に設定されます。以下のテーブルに示すように、%xsd パッケージのクラスは XML タイプに直接マッピングします。

%Library および %xsd パッケージの Caché データ型の XML タイプ
%xsd パッケージの Caché クラス %Library パッケージの Caché クラス XML へのプロジェクションで使用される XSD タイプ
%xsd.anyURIOpens in a new tab   anyURI
%xsd.base64BinaryOpens in a new tab

%BinaryOpens in a new tab

%StatusOpens in a new tab

base64Binary
%xsd.booleanOpens in a new tab %BooleanOpens in a new tab boolean
%xsd.byteOpens in a new tab %TinyIntOpens in a new tab byte
%xsd.dateOpens in a new tab %DateOpens in a new tab

%FilemanDateOpens in a new tab

date
%xsd.dateTimeOpens in a new tab

%StringTimeStampOpens in a new tab

%TimeStampOpens in a new tab

%FilemanTimeStampOpens in a new tab

dateTime
%xsd.decimalOpens in a new tab

%CurrencyOpens in a new tab

%DecimalOpens in a new tab

%NumericOpens in a new tab

decimal
%xsd.doubleOpens in a new tab

%DoubleOpens in a new tab

%FloatOpens in a new tab

double
%xsd.floatOpens in a new tab   float
%xsd.hexBinaryOpens in a new tab   hexBinary
%xsd.intOpens in a new tab   int
%xsd.integerOpens in a new tab   integer
%xsd.longOpens in a new tab

%BigIntOpens in a new tab

%IntegerOpens in a new tab

long
%xsd.negativeIntegerOpens in a new tab   negativeInteger
%xsd.nonNegativeIntegerOpens in a new tab   nonNegativeInteger
%xsd.nonPositiveIntegerOpens in a new tab   nonPositiveInteger
%xsd.positiveIntegerOpens in a new tab   positiveInteger
%xsd.shortOpens in a new tab %SmallIntOpens in a new tab short
%xsd.stringOpens in a new tab

%NameOpens in a new tab

%StringOpens in a new tab

%TextOpens in a new tab

%ListOpens in a new tab

string
%xsd.timeOpens in a new tab %TimeOpens in a new tab time
%xsd.unsignedByteOpens in a new tab   unsignedByte
%xsd.unsignedIntOpens in a new tab   unsignedInt
%xsd.unsignedLongOpens in a new tab   unsignedLong
%xsd.unsignedShortOpens in a new tab   unsignedShort

XML データ型の詳細は、http://www.w3.org/TR/xmlschema-2/Opens in a new tab を参照してください。

例えば、以下のクラスを考えてみます。

Class Schema.DataTypesDemo Extends (%RegisteredObject, %XML.Adaptor)
{

Parameter XMLTYPENAMESPACE="mytypes";

Property binaryprop As %xsd.base64Binary;

Property booleanprop As %Boolean;

Property dateprop As %Date;

Property datetimeprop As %TimeStamp;

Property decimalprop As %Numeric;

Property integerprop As %Integer;

Property stringprop As %String;

Property timeprop As %Time;

}

このクラスのスキーマは以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" targetNamespace="mytypes">
  <complexType name="DataTypesDemo">
    <sequence>
      <element minOccurs="0" name="binaryprop" type="s:base64Binary"/>
      <element minOccurs="0" name="booleanprop" type="s:boolean"/>
      <element minOccurs="0" name="dateprop" type="s:date"/>
      <element minOccurs="0" name="datetimeprop" type="s:dateTime"/>
      <element minOccurs="0" name="decimalprop" type="s:decimal"/>
      <element minOccurs="0" name="integerprop" type="s:long"/>
      <element minOccurs="0" name="stringprop" type="s:string"/>
      <element minOccurs="0" name="timeprop" type="s:time"/>
    </sequence>
  </complexType>
</schema>

スキーマに影響するコンパイラ・キーワード

必須キーワードは、minOccurs="0" 属性を削除することによって XML スキーマに影響します。例えば、以下のクラスを考えてみます。

Class Schema.PropKeywords Extends (%RegisteredObject, %XML.Adaptor)
{

Parameter XMLTYPENAMESPACE="mytypes";

Property Property1 As %String;

Property Property2 As %String [ Required ];

}

ここで使用されるネームスペースのスキーマを生成する場合、以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" targetNamespace="test">
  <complexType name="PropKeywords">
    <sequence>
      <element minOccurs="0" name="Property1" type="s:string"/>
      <element name="Property2" type="s:string"/>
    </sequence>
  </complexType>
</schema>

minOccurs の既定値は 1 です。つまり Property2 は必須です。

Note:

互換性を維持するために、既定では、%XML.ReaderOpens in a new tab は必須プロパティをチェックしませんが、チェックするようにすることもできます。"Caché XML ツールの使用法" の “必要な要素および属性のチェック” を参照してください。また、既定では、Caché Web サービスは必須プロパティをチェックしませんが、チェックするようにすることもできます。"Caché での Web サービスおよび Web クライアントの作成" の “必要な要素および属性のチェック” を参照してください。

他のプロパティ・キーワードは、データ型クラスのスキーマに影響しません。

XML スキーマに影響するパラメータ

Caché データ型クラスは多数のパラメータを使用します (各データ型クラスでサポートされるパラメータをリストしたテーブルについては、"Caché オブジェクトの使用法" の “データ型” を参照してください)。ほとんどの場合、これらをプロパティ・パラメータとして指定することもできます。

XML スキーマに影響するパラメータは以下のとおりです。

CONTENT

プロパティ値をエスケープ処理する方法に影響を与えます。このドキュメント内の前述の “特殊 XML 文字の処理” を参照してください。

他の指定可能な値と比較すると、"MIXED" 値により、スキーマに変更が発生します。以下のクラスを考えてみます。

Class Schema.CONTENT Extends (%RegisteredObject, %XML.Adaptor)
{

Parameter XMLTYPENAMESPACE = "mytypes";

Property Property1 As %String;

Property Property2 As %String(CONTENT = "STRING");

Property Property3 As %String(CONTENT = "ESCAPE");

Property Property4 As %String(CONTENT = "MIXED");

}

ここで使用されるネームスペースのスキーマを生成する場合、以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" targetNamespace="mytypes">
  <complexType name="CONTENT">
    <sequence>
      <element minOccurs="0" name="Property1" type="s:string"/>
      <element minOccurs="0" name="Property2" type="s:string"/>
      <element minOccurs="0" name="Property3" type="s:string"/>
      <element name="Property4">
        <complexType mixed="true">
          <choice maxOccurs="unbounded" minOccurs="0">
            <any processContents="lax"/>
          </choice>
        </complexType>
      </element>
    </sequence>
  </complexType>
</schema>

これらのプロパティの 3 つには同じタイプ情報があります。XML ではその 3 つが同じように扱われるからです。ただし、Caché ではプロパティの処理方法が異なります。詳細は、このドキュメント内の後述の “特殊 XML 文字の処理” を参照してください。

オブジェクトを Web メソッドの入力や出力として使用する場合に、SoapBodyUse がそのメソッドの encoded であると、Caché では混在したコンテンツが文字列の内容のように扱われます (既定)。つまり、CONTENT"MIXED" として指定すると、その値は無視されます。

DISPLAYLIST

VALUELIST も指定されていて、XMLLISTPARAMETER"DISPLAYLIST" に等しいと、スキーマに影響します。これらの 2 つのパラメータに関する説明を参照してください。

MAXLEN

maxLength 属性を制御します。これは、ファセットまたは制限になります。ファセットにより、XML タイプの許容値を定義します。以下の例で、それらをいくつか示します。以下のクラスを考えてみます。

Class Schema.BasicFacets Extends (%RegisteredObject, %XML.Adaptor)
{

Parameter XMLTYPENAMESPACE = "mytypes";

Property Property1 As %Integer (MINVAL=10, MAXVAL=1000);

Property Property2 As %String (MINLEN=20, MAXLEN=100);

}

ここで使用されるネームスペースのスキーマを生成する場合、以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="mytypes">
  <complexType name="BasicFacets">
    <sequence>
      <element minOccurs="0" name="Property1">
        <simpleType>
          <restriction base="s:long">
            <maxInclusive value="1000"/>
            <minInclusive value="10"/>
          </restriction>
        </simpleType>
      </element>
      <element minOccurs="0" name="Property2">
        <simpleType>
          <restriction base="s:string">
            <maxLength value="100"/>
            <minLength value="20"/>
          </restriction>
        </simpleType>
      </element>
    </sequence>
  </complexType>
</schema>

SOAP ウィザードや XML スキーマ・ウィザードでスキーマ内に maxLength 制限が検出されると、必要に応じて、生成されたクラスに MAXLEN プロパティ・パラメータが設定されます。

MAXVAL

maxInclusive 属性を制御します。MAXLEN の使用例を参照してください。

MINLEN

minLength 属性を制御します。MAXLEN の使用例を参照してください。

SOAP ウィザードや XML スキーマ・ウィザードでスキーマ内に minLength 制限が検出されると、必要に応じて、生成されたクラスに MINLEN プロパティ・パラメータが設定されます。

MINVAL

minInclusive 属性を制御します。MAXLEN の使用例を参照してください。

VALUELLIST

<enumeration> 制限をタイプに追加します。以下のクラスを考えてみます。

Class Schema.VALUELIST Extends (%RegisteredObject, %XML.Adaptor)
{

Parameter XMLTYPENAMESPACE = "mytypes";

Property Property1 As %String;

Property Property2 As %String (VALUELIST = ",r,g,b");

}

以下にこのクラスのスキーマを示します。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" targetNamespace="mytypes">
  <complexType name="VALUELIST">
    <sequence>
      <element minOccurs="0" name="Property1" type="s:string"/>
      <element minOccurs="0" name="Property2">
        <simpleType>
          <restriction base="s:string">
            <enumeration value="r"/>
            <enumeration value="g"/>
            <enumeration value="b"/>
          </restriction>
        </simpleType>
      </element>
    </sequence>
  </complexType>
</schema>
XMLFractionDigits

%NumericOpens in a new tab プロパティに適用できます。このパラメータは、以下のフラグメントに示すように、<fractionDigits> ファセットに対応します。

<element minOccurs="0" name="Property2">
  <simpleType>
    <restriction base="s:decimal">
      <fractionDigits value="2"/>
      <totalDigits value="5"/>
    </restriction>
  </simpleType>
</element>
XMLTotalDigits

%NumericOpens in a new tab プロパティまたは %IntegerOpens in a new tab プロパティに適用できます。このパラメータは、以下のフラグメントに示すように、<totalDigits> ファセットに対応します。

<element minOccurs="0" name="Property2">
  <simpleType>
    <restriction base="s:decimal">
      <fractionDigits value="2"/>
      <totalDigits value="5"/>
    </restriction>
  </simpleType>
</element>
XMLLISTPARAMETER

VALUELIST パラメータを指定する %StringOpens in a new tab プロパティに適用されます。オブジェクトにある値ではなく、XML に投影するための値のリストがあるパラメータの名前を指定します。ほとんどの場合、標準の DISPLAYLIST パラメータも指定して、XMLLISTPARAMETER"DISPLAYLIST" に設定します。

XMLLISTPARAMETER パラメータにより、<enumeration> 制限で使用される value 属性を制御します。

これをプロパティ・パラメータとして指定することはできません。

XMLPATTERN

pattern 制限を制御します。以下のクラスを考えてみます。

Class Schema.Pattern Extends (%RegisteredObject, %XML.Adaptor)
{

Parameter XMLTYPENAMESPACE = "mytypes";

Property Property1 As %String;

Property Property2 As %String(XMLPATTERN = "[A-Z]");

}

このクラスのスキーマは以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" targetNamespace="mytypes">
  <complexType name="Pattern">
    <sequence>
      <element minOccurs="0" name="Property1" type="s:string"/>
      <element minOccurs="0" name="Property2">
        <simpleType>
          <restriction base="s:string">
            <pattern value="[A-Z]"/>
          </restriction>
        </simpleType>
      </element>
    </sequence>
  </complexType>
</schema>

単純なタイプで複数のパターンが出現する場合、Caché は、https://www.w3.org/TR/xmlschema-2Opens in a new tab に従ってパターンを結合します (セクション 4.3.4.3 の “Constraints on XML Representation of pattern” を参照してください)。パターンは、XMLPATTERN パラメータで同じパターンの異なる分岐 (縦棒で区切られます) として結合されます。

XSDTYPE

XML を投影するときに使用される XSD タイプを宣言します。このパラメータは、すべての Caché データ型クラスで適切に設定されます。Caché XML ツールでは、スキーマ生成時にこのパラメータが使用されます。このパラメータは、入出力変換に直接影響することはありませんが、それらの変換との一貫性は保持する必要があります。

ストリーム・クラスの XML タイプへの投影

クラスまたはプロパティが Caché ストリームに基づく場合、以下のテーブルに示すように XML タイプに投影されます。

Caché ストリームに対する XML タイプ
Caché ストリーム・タイプ XML へのプロジェクションで使用される XSD タイプ
%Library.GlobalCharacterStreamOpens in a new tab%Library.FileCharacterStreamOpens in a new tab%Stream.FileCharacterOpens in a new tab、および %Stream.GlobalCharacterOpens in a new tab string
%Library.GlobalBinaryStreamOpens in a new tab%Library.FileBinaryStreamOpens in a new tab%Stream.FileBinaryOpens in a new tab、および %Stream.GlobalBinaryOpens in a new tab base64Binary

例えば、以下のクラスを考えてみます。

Class Schema.StreamPropDemo Extends (%Persistent, %XML.Adaptor)
{

Parameter XMLTYPENAMESPACE="mytypes";

Property BinStream As %Library.GlobalBinaryStream;

Property CharStream As %Library.GlobalCharacterStream;

}

このクラスのスキーマは以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" targetNamespace="mytypes">
  <complexType name="StreamPropDemo">
    <sequence>
      <element minOccurs="0" name="BinStream" type="s:base64Binary"/>
      <element minOccurs="0" name="CharStream" type="s:string"/>
    </sequence>
  </complexType>
</schema>

コレクション・プロパティの XML スキーマへの投影

このセクションでは、XML 対応クラスについて、コレクション・プロパティがどのように XML スキーマに投影されるかについて説明します。このセクションでは、以下の項目について説明します。

コレクション・プロパティの XML スキーマへの投影

ほとんどの種類のプロパティでは、オブジェクトを XML ドキュメントとして投影することと完全な XML スキーマを検証目的で定義することの両方のために、完全な XML プロジェクションを指定するのに十分な情報がクラス定義に格納されています。ただし、コレクション・プロパティでは、Caché でサポートしている形式の定義の一部では、完全な XML スキーマに対して十分な情報が用意されていません。スキーマが必要なコンテキスト (Web サービスや Web クライアントなど) で XML プロジェクションを使用する場合、完全な XML スキーマが必要です。ない場合は、スキーマに対する検証が失敗します。スキーマに対して検証を行わない場合は、この考慮事項が適用されません。以下のテーブルは、シナリオのリストです。

コレクション・プロパティとそれらの XML プロジェクション詳細の形式
プロパティ定義の形式 XML の使用可否 XML スキーマの使用可否
Property PropName As List of classname または Property PropName As Array of classname あり あり
Property PropName As %ListOfDataTypes または Property PropName As %ArrayOfDataTypes あり あり (ただし、コレクション項目の既定のタイプである文字列が適切でない場合があります)
Property PropName As %ListOfObjects または Property PropName As %ArrayOfObjects あり なし (スキーマでは、コレクション項目のタイプが指定されません)

以下のサブセクションでは、これらのシナリオに対応する XML スキーマを示します。

List of Classname

このセクションでは、List of Classname として定義されるプロパティが XML 対応クラスに含まれる場合、そのクラスから生成される XML スキーマの一部を示します。例えば、以下のようなプロパティ定義を考えてみます。

Property PropName As list Of %Integer(XMLITEMNAME = "MyXmlItemName");

Test.DemoList1 という名前の XML 対応クラスにこのプロパティが存在する場合、このクラスの XML スキーマには以下が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
targetNamespace="mytypes">
  <complexType name="DemoList1">
    <sequence>
      <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNameLong" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="ArrayOfMyXmlItemNameLong">
    <sequence>
      <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s:long"/>
    </sequence>
  </complexType>
...
</schema>

タイプ名には以下のルールが適用されます。

  • PropName プロパティの場合、対応するタイプは ArrayOfXMLItemNameType という名前になります。

    • リスト型プロパティの要素名と属性名の制御” で説明されているように、XMLItemName はコレクションの項目名です。データ型プロパティの場合、既定の項目名は末尾に Item が追加されたプロパティ名になります (オブジェクト・プロパティの場合、既定の項目名は短いクラス名になります)。

    • Type は、プロパティ・クラスが投影される XML タイプです。

    <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNameLong" xmlns:s01="mytypes"/>
    
    Note:

    XMLItemNameType と同じ場合、PropName プロパティでは、対応するタイプは ArrayOfXMLItemName という名前になります。つまり、重複する配列項目がタイプ名から削除されます。タイプ名に重複する名前を含めるには、(%XML.SchemaOpens in a new tab のインスタンスの) AllowRedundantArrayName プロパティを 1 に指定します。同様に、Web サービス・クラスで、重複する配列項目名を WSDL のタイプに含めるには、(Web サービス・クラスの) ALLOWREDUNDANTARRAYNAME パラメータを 1 に指定します。

  • タイプ ArrayOfXMLItemNameType は、XMLItemName という名前の他のタイプの <sequence> として定義されます。

      <complexType name="ArrayOfMyXmlItemNameLong">
        <sequence>
          <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s:long"/>
        </sequence>
      </complexType>
    
  • 要素 XMLItemName は、データ型クラスに対応する XSD タイプに基づいています。

    <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s:long"/>
    

Classname がオブジェクト・クラスを参照する際、同じルールが適用されます。例えば、以下のようなプロパティ定義を考えてみます。

Property PropName As list Of SimpleObject(XMLITEMNAME = "MyXmlItemName");

Simple.Object には、MyPropAnotherProp の 2 つのプロパティが含まれています。Test.DemoObjList という名前の XML 対応クラスにこのプロパティが存在する場合、このクラスの XML スキーマには以下が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
targetNamespace="mytypes">
  <complexType name="DemoObjList">
    <sequence>
      <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNameSimpleObject" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="ArrayOfMyXmlItemNameSimpleObject">
    <sequence>
      <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:SimpleObject" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="SimpleObject">
    <sequence>
      <element minOccurs="0" name="MyProp" type="s:string"/>
      <element minOccurs="0" name="AnotherProp" type="s:string"/>
    </sequence>
  </complexType>
...
</schema>

Array of Classname

このセクションでは、Array of Classname として定義されるプロパティが XML 対応クラスに含まれる場合、そのクラスから生成される XML スキーマの一部を示します。例えば、以下のようなプロパティ定義を考えてみます。

Property PropName As array Of %Integer(XMLITEMNAME = "MyXmlItemName", XMLKEYNAME = "MyXmlKeyName");

Test.DemoArray1 という名前の XML 対応クラスにこのプロパティが存在する場合、このクラスの XML スキーマには以下が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="mytypes">
  <complexType name="DemoArray1">
    <sequence>
      <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNamePairOfMyXmlKeyNameLong" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="ArrayOfMyXmlItemNamePairOfMyXmlKeyNameLong">
    <sequence>
      <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:PairOfMyXmlKeyNameLong" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="PairOfMyXmlKeyNameLong">
    <simpleContent>
      <extension base="s:long">
        <attribute name="MyXmlKeyName" type="s:string" use="required"/>
      </extension>
    </simpleContent>
  </complexType>
...
</schema>

タイプ名には以下のルールが適用されます。

  • PropName プロパティの場合、対応するタイプは ArrayOfXMLItemNamePairOfXMLKeyNameType という名前になります。

    • 配列型プロパティの要素名と属性名の制御” で説明されているように、XMLItemName はコレクションの項目名です。データ型プロパティの場合、既定の項目名は末尾に Item が追加されたプロパティ名になります。(オブジェクト・プロパティの場合、既定の項目名は短いクラス名になります)。

    • 配列型プロパティの要素名と属性名の制御” で説明されているように、XMLKeyName はコレクションのキー名です。既定は、末尾に Key が連結されたプロパティ名です。

    • Type は、プロパティ・クラスが投影される XML タイプです。

    <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNamePairOfMyXmlKeyNameLong" xmlns:s01="mytypes"/>
    
    Note:

    XMLKeyNameType と同じ場合、PropName プロパティでは、対応するタイプは ArrayOfXMLItemNamePairOfXMLKeyName という名前になります。つまり、重複する配列項目がタイプ名から削除されます。タイプ名に重複する名前を含めるには、(%XML.SchemaOpens in a new tab のインスタンスの) AllowRedundantArrayName プロパティを 1 に指定します。同様に、Web サービス・クラスで、重複する配列項目名を WSDL のタイプに含めるには、(Web サービス・クラスの) ALLOWREDUNDANTARRAYNAME パラメータを 1 に指定します。

  • タイプ ArrayOfXMLItemNamePairOfXMLKeyNameType は、PairOfXMLKeyNameType という名前の他のタイプの <sequence> として定義されます。

     <complexType name="ArrayOfMyXmlItemNamePairOfMyXmlKeyNameLong">
        <sequence>
          <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:PairOfMyXmlKeyNameLong" xmlns:s01="mytypes"/>
        </sequence>
      </complexType>
    
    
  • タイプ PairOfXMLKeyNameType は、指定された XSD タイプの拡張です。この拡張により、XMLKeyName という名前の属性が追加されます。

      <complexType name="PairOfMyXmlKeyNameLong">
        <simpleContent>
          <extension base="s:long">
            <attribute name="MyXmlKeyName" type="s:string" use="required"/>
          </extension>
        </simpleContent>
      </complexType>
    

Classname がオブジェクト・クラスを参照する際、同じルールが適用されます。例えば、以下のようなプロパティ定義を考えてみます。

Property PropName As %ArrayOfObjects(XMLITEMNAME = "MyXmlItemName", XMLKEYNAME = "MyXmlKeyName");

Simple.Object には、MyPropAnotherProp の 2 つのプロパティが含まれています。Test.DemoObjArray という名前の XML 対応クラスにこのプロパティが存在する場合、このクラスの XML スキーマには以下が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
targetNamespace="mytypes">
  <complexType name="DemoObjArray">
    <sequence>
      <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNamePairOfMyXmlKeyNameSimpleObject" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="ArrayOfMyXmlItemNamePairOfMyXmlKeyNameSimpleObject">
    <sequence>
      <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:PairOfMyXmlKeyNameSimpleObject" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="PairOfMyXmlKeyNameSimpleObject">
    <complexContent>
      <extension base="s01:SimpleObject" xmlns:s01="mytypes">
        <attribute name="MyXmlKeyName" type="s:string" use="required"/>
      </extension>
    </complexContent>
  </complexType>
  <complexType name="SimpleObject">
    <sequence>
      <element minOccurs="0" name="MyProp" type="s:string"/>
      <element minOccurs="0" name="AnotherProp" type="s:string"/>
    </sequence>
  </complexType>
</schema>

%ListOfDataTypes

このセクションでは、%ListOfDataTypesOpens in a new tab として定義されるプロパティが XML 対応クラスに含まれる場合、そのクラスから生成される XML スキーマの一部を示します。例えば、以下のようなプロパティ定義を考えてみます。

Property PropName As %ListOfDataTypes(XMLITEMNAME = "MyXmlItemName");

Test.DemoList という名前の XML 対応クラスにこのプロパティが存在する場合、このクラスの XML スキーマには以下が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="mytypes">
  <complexType name="DemoList">
    <sequence>
      <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNameString" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="ArrayOfMyXmlItemNameString">
    <sequence>
      <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s:string"/>
    </sequence>
  </complexType>
</schema>

タイプ名のルールの詳細は、このセクションで前述した “List of Classname” を参照してください。コレクション項目 (この例では PropNameItem) は XSD 文字列型に基づいています。

<element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s:string"/>

つまり、コレクション項目は文字列であることが想定されています。この章で後述する “コレクション・クラス使用のオプション” も参照してください。

%ArrayOfDataTypes

このセクションでは、%ArrayOfDataTypesOpens in a new tab として定義されるプロパティが XML 対応クラスに含まれる場合、そのクラスから生成される XML スキーマの一部を示します。例えば、以下のようなプロパティ定義を考えてみます。

Property PropName As %ArrayOfDataTypes(XMLITEMNAME = "MyXmlItemName", XMLKEYNAME = "MyXmlKeyName"); 

Test.DemoArray という名前の XML 対応クラスにこのプロパティが存在する場合、このクラスの XML スキーマには以下が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
targetNamespace="mytypes">
  <complexType name="DemoArray">
    <sequence>
      <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNamePairOfMyXmlKeyNameString" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="ArrayOfMyXmlItemNamePairOfMyXmlKeyNameString">
    <sequence>
      <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:PairOfMyXmlKeyNameString" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="PairOfMyXmlKeyNameString">
    <simpleContent>
      <extension base="s:string">
        <attribute name="MyXmlKeyName" type="s:string" use="required"/>
      </extension>
    </simpleContent>
  </complexType>
...
</schema>

タイプ名のルールの詳細は、このセクションで前述した “Array of Classname” を参照してください。コレクション項目 (この例では PairOfMyXmlKeyNameString) は XSD 文字列型に基づいています。

  <complexType name="PairOfMyXmlKeyNameString">
    <simpleContent>
      <extension base="s:string">
        <attribute name="MyXmlKeyName" type="s:string" use="required"/>
      </extension>
    </simpleContent>
  </complexType>

つまり、コレクション項目は文字列であることが想定されています。この章で後述する “コレクション・クラス使用のオプション” も参照してください。

%ListOfObjects

このセクションでは、%ListOfObjectsOpens in a new tab として定義されるプロパティが XML 対応クラスに含まれる場合、そのクラスから生成される XML スキーマの一部を示します。例えば、以下のようなプロパティ定義を考えてみます。

Property PropName As list Of %Integer(XMLITEMNAME = "MyXmlItemName");

Test.DemoObjList1 という名前の XML 対応クラスにこのプロパティが存在する場合、このクラスの XML スキーマには以下が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
targetNamespace="mytypes">
  <complexType name="DemoObjList1">
    <sequence>
      <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNameRegisteredObject" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="ArrayOfMyXmlItemNameRegisteredObject">
    <sequence>
      <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:RegisteredObject" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
...
</schema>

タイプ名のルールの詳細は、このセクションで前述した “List of Classname” を参照してください。コレクション項目のタイプは未定義の RegisteredObject です。

<element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:RegisteredObject" xmlns:s01="mytypes"/>

したがって、このスキーマは使用できません。この章で後述する “コレクション・クラス使用のオプション” を参照してください。

%ArrayOfObjects

このセクションでは、%ArrayOfObjectsOpens in a new tab として定義されるプロパティが XML 対応クラスに含まれる場合、そのクラスから生成される XML スキーマの一部を示します。例えば、以下のようなプロパティ定義を考えてみます。

Property PropName As %ArrayOfObjects(XMLITEMNAME = "MyXmlItemName", XMLKEYNAME = "MyXmlKeyName");

Test.DemoObjArray1 という名前の XML 対応クラスにこのプロパティが存在する場合、このクラスの XML スキーマには以下が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="mytypes">
  <complexType name="DemoObjArray1">
    <sequence>
      <element minOccurs="0" name="PropName" type="s01:ArrayOfMyXmlItemNamePairOfMyXmlKeyNameRegisteredObject" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="ArrayOfMyXmlItemNamePairOfMyXmlKeyNameRegisteredObject">
    <sequence>
      <element maxOccurs="unbounded" minOccurs="0" name="MyXmlItemName" nillable="true" type="s01:PairOfMyXmlKeyNameRegisteredObject" xmlns:s01="mytypes"/>
    </sequence>
  </complexType>
  <complexType name="PairOfMyXmlKeyNameRegisteredObject">
    <complexContent>
      <extension base="s01:RegisteredObject" xmlns:s01="mytypes">
        <attribute name="MyXmlKeyName" type="s:string" use="required"/>
      </extension>
    </complexContent>
  </complexType>
...
</schema>

タイプ名のルールの詳細は、このセクションで前述した “List of Classname” を参照してください。コレクション項目のタイプは未定義の RegisteredObject に基づいています。

  <complexType name="PairOfMyXmlKeyNameRegisteredObject">
    <complexContent>
      <extension base="s01:RegisteredObject" xmlns:s01="mytypes">
        <attribute name="MyXmlKeyName" type="s:string" use="required"/>
      </extension>
    </complexContent>
  </complexType>

したがって、このスキーマは使用できません。この章で後述する “コレクション・クラス使用のオプション” を参照してください。

コレクション・クラス使用のオプション

XML 対応クラス内のタイプ %ListOfDataTypesOpens in a new tab または %ArrayOfDataTypesOpens in a new tab の各プロパティについて、コレクション項目は文字列であることが想定されています。この想定は、お客様のニーズに合っている場合もあれば、そうでない場合もあります。同様に、タイプ %ListOfObjectsOpens in a new tab または %ArrayOfObjectsOpens in a new tab の各プロパティについて、コレクション項目のタイプは RegisteredObject であり、Caché にはタイプ RegisteredObject の XML プロジェクションが含まれていないため、XML スキーマは使用できません (例は、前のサブセクションを参照してください)。

これらのシナリオでは、以下のいずれかを実行できます。

  • 形式 List of Classname または Array of Classname が含まれるようにプロパティ定義を変更します (Classname は適切なクラスです)。Classname がオブジェクト・クラスである場合、クラスを XML 対応にします。

  • コレクション・クラスのカスタムのサブクラス (%ListOfDataTypesOpens in a new tab%ArrayOfDataTypesOpens in a new tab%ListOfObjectsOpens in a new tab%ArrayOfObjectsOpens in a new tab) を作成します。サブクラスで、ELEMENTTYPE クラス・パラメータを指定します。以下はその例です。

    Class MyApp.MyIntegerCollection Extends %ListOfDataTypes
    {
    Parameter ELEMENTTYPE="%Library.Integer";
    
    }

    ELEMENTTYPE には、コレクションで使用されるクラスの詳細なパッケージ名およびクラス名を指定します。%ListOfDataTypesOpens in a new tab または %ArrayOfDataTypesOpens in a new tab をサブクラスに指定する場合、データ型クラスを指定します。コレクション要素のタイプは、そのクラスの XSDTYPE パラメータにより制御されます。

    %ListOfObjectsOpens in a new tab または %ArrayOfObjectsOpens in a new tab をサブクラスに指定する場合、XML 対応クラスを指定します。以下はその例です。

    Class MyApp.MyObjectCollection Extends %ListOfObjects
    {
    Parameter ELEMENTTYPE="MyApp.SimpleObject";
    
    }

    次に、プロパティ定義でカスタムのコレクション・クラスを使用します。以下はその例です。

    Property MyProp as MyApp.MyIntegerCollection;
    

その他の XML 対応クラスの XML タイプへの投影

XML 対応クラス、または XML 対応クラスに基づくプロパティの場合、XML タイプは以下のように決定されます。クラスに XMLTYPE パラメータの値がある場合、それがタイプ名として使用されます。それ以外の場合、短いクラス名が XML タイプ名として使用されます。

例えば、以下のクラス定義について考えてみます。

Class GXML.PersonWithAddress Extends (%Persistent, %XML.Adaptor) 
{
Parameter XMLTYPE = "PersonType";

Property Name As %Name;

Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h");

Property HomeAddress As GXML.Address;

}

このクラスのインスタンスの場合、XML タイプは PersonType になります。これは、XMLTYPE パラメータから取得されます。

GXML.Address クラスに XMLTYPE パラメータが含まれていないとします。この場合、<HomeAddress> 要素では、XML タイプは Address です。これは短いクラス名です。

タイプのネームスペースの指定

前のセクションでは、要素をネームスペースに割り当てる方法を説明しました。ここでは、タイプのネームスペースについて説明します。

XML タイプは以下のようにネームスペースに割り当てられます。

  1. 対応するクラス定義が XSDTYPE クラス・パラメータを定義する場合、タイプは以下の W3 ネームスペースに入ります。

    http://www.w3.org/2001/XMLSchema
    

    データ型クラス内でのみ XSDTYPE クラス・パラメータを指定します。

    Note:

    データ型クラスは XSDTYPE クラス・パラメータを継承しません。つまり、既存のデータ型クラスをサブクラス化すると、クラスを XSD タイプのいずれかにマッピングする必要がある場合にはこのパラメータを指定する必要があります。

  2. クラス定義が XSDTYPE を定義せずに NAMESPACE を定義する場合、タイプは NAMESPACE によって指定されるネームスペースに入ります。

  3. それ以外の場合は、タイプはどのネームスペースにも入りません。

    ただし、ネームスペースはスキーマの生成時に指定できます。"Caché での XML の使用法" の “クラスからの XML スキーマの生成” を参照してください。

タイプが割り当てられるネームスペースを参照するには、%XML.SchemaOpens in a new tab および %XML.WriterOpens in a new tab を使用する必要があります。詳細は、"Caché での XML の使用法" の “クラスからの XML スキーマの生成” を参照してください。

QName タイプのネームスペース接頭辞の抑制

"Caché XML ツールの使用法" の説明に従って、%XML.WriterOpens in a new tab で出力を生成する際に、XML タイプ属性を含めることができます。そのためには、ライターの OutputTypeAttribute プロパティを 1 に指定します。

既定では、タイプ属性は QName (修飾名) として書き込まれ、タイプの名前とタイプの所属先ネームスペースの両方を示します。以下はその例です。

<TeamA xmlns:s01="http://mynamespace" xsi:type="s01:TeamA">

対応する Caché クラス定義を定義して、ネームスペース接頭辞が抑制されるようにします。以下はその例です。

<TeamB xsi:type="TeamB">

例えば、以下のクラス定義について考えてみます。

Class STP.TeamA Extends (%RegisteredObject, %XML.Adaptor)
{

Parameter NAMESPACE = "http://mynamespace";

Property Member1 as %String;

Property Member2 as %String;

}

STP.TeamB クラスは、記載されていませんが同じ定義があり、SUPPRESSTYPEPREFIX も 1 に指定しています。

どちらのクラスも、3 番目のクラスでプロパティとして使用されます。

Class STP.Container Extends (%RegisteredObject, %XML.Adaptor)
{

Parameter NAMESPACE = "http://mynamespace";

Property TeamA As STP.TeamA;

Property TeamB As STP.TeamB;

}

STP.Container のインスタンスの出力を生成すると (さらに XML タイプ属性の出力を有効にすると)、以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<Container xmlns="http://mynamespace" 
           xmlns:s="http://www.w3.org/2001/XMLSchema" 
          >
  <TeamA xmlns:s01="http://mynamespace" xsi:type="s01:TeamA">
    <Member1 xsi:type="s:string">Jack O'Neill</Member1>
    <Member2 xsi:type="s:string">Samantha Carter</Member2>
  </TeamA>
  <TeamB xsi:type="TeamB">
    <Member1 xsi:type="s:string">Jasper O'Nelson</Member1>
    <Member2 xsi:type="s:string">Sandra Chartres</Member2>
  </TeamB>
</Container>

<TeamA> 要素には xsi:type 属性があり、それは "s01:TeamA" になっています。この要素のネームスペース宣言では、s01 接頭語がネームスペース http://mynamespace を参照することを示します。

ただし、<TeamB> 要素には xsi:type 属性内に接頭語がありません。

Note:

SUPPRESSTYPEPREFIX は、XML タイプが属するネームスペースに影響しません。タイプ接頭辞の記述を抑制するだけです。

FeedbackOpens in a new tab