XML スキーマへの投影の制御
XML 対応クラスの場合、そのクラスの暗黙的な XML スキーマがあります。これは表示することができます。InterSystems IRIS® データ・プラットフォームにはそのスキーマを変更する手段が用意されています。
このトピックの XML 例はリテラル形式になります。
このページで説明されているクラスとプロパティのパラメータ |
---|
|
XML 対応クラスのスキーマの表示
任意の XML 対応クラスのスキーマを表示するには、以下の 2 つのオプションがあります。
-
%XML.SchemaOpens in a new tab と %XML.WriterOpens in a new tab を使用して完全なスキーマ・ドキュメントを生成できます。詳細は、"クラスからの 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 タイプ (https://www.w3.org/TR/xmlschema-2/Opens in a new tab を参照) の 1 つです。
リテラル・プロパティの XML スキーマへの投影
このセクションでは、リテラル (非コレクション) プロパティが XML タイプにどのように投影されるか、および XML スキーマに影響を及ぼすオプションについて説明します。項目は以下のとおりです。
InterSystems IRIS データ型クラスの既定の XSD タイプ
一般的な InterSystems IRIS データ型クラスのいずれかにクラスまたはクラス・プロパティが基づく場合、XML タイプは以下のテーブルに従って自動的に設定されます。以下のテーブルに示すように、%xsd パッケージのクラスは XML タイプに直接マッピングします。
XML データ型の詳細は、https://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 は必須です。
互換性を維持するために、既定では、%XML.ReaderOpens in a new tab は必須プロパティをチェックしませんが、チェックするよう指定することもできます。"必要な要素および属性のチェック" を参照してください。また、既定では、InterSystems IRIS Web サービスは必須プロパティをチェックしませんが、チェックするよう指定することもできます。"必要な要素および属性のチェック" を参照してください。
他のプロパティ・キーワードは、データ型クラスのスキーマに影響しません。
XML スキーマに影響するパラメータ
InterSystems IRIS データ型クラスは多数のパラメータを使用します (データ型クラスごとにサポートされるパラメータの一覧は、"データ型" を参照してください)。ほとんどの場合、これらをプロパティ・パラメータとして指定することもできます。
XML スキーマに影響するパラメータは以下のとおりです。
プロパティ値をエスケープ処理する方法に影響を与えます。"特殊 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 つが同じように扱われるからです。ただし、InterSystems IRIS ではプロパティの処理方法が異なります。詳細は、"特殊 XML 文字の処理" を参照してください。
オブジェクトを Web メソッドの入力や出力として使用する場合に、SoapBodyUse がそのメソッドの encoded であると、InterSystems IRIS では混在したコンテンツが文字列の内容のように扱われます (既定)。つまり、CONTENT を "MIXED" として指定すると、その値は無視されます。
VALUELIST も指定されていて、XMLLISTPARAMETER が "DISPLAYLIST" に等しいと、スキーマに影響します。これらの 2 つのパラメータに関する説明を参照してください。
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 プロパティ・パラメータが設定されます。
maxInclusive 属性を制御します。MAXLEN の使用例を参照してください。
minLength 属性を制御します。MAXLEN の使用例を参照してください。
SOAP ウィザードや XML スキーマ・ウィザードでスキーマ内に minLength 制限が検出されると、必要に応じて、生成されたクラスに MINLEN プロパティ・パラメータが設定されます。
minInclusive 属性を制御します。MAXLEN の使用例を参照してください。
<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>
%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>
%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>
VALUELIST パラメータを指定する %StringOpens in a new tab プロパティに適用されます。オブジェクトにある値ではなく、XML に投影するための値のリストがあるパラメータの名前を指定します。ほとんどの場合、標準の DISPLAYLIST パラメータも指定して、XMLLISTPARAMETER を "DISPLAYLIST" に設定します。
XMLLISTPARAMETER パラメータにより、<enumeration> 制限で使用される value 属性を制御します。
これをプロパティ・パラメータとして指定することはできません。
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>
単純なタイプで複数のパターンが出現する場合、InterSystems IRIS は、https://www.w3.org/TR/xmlschema-2Opens in a new tab に従ってパターンを結合します (セクション 4.3.4.3 の Constraints on XML Representation of pattern を参照してください)。パターンは、XMLPATTERN パラメータで同じパターンの異なる分岐 (縦棒で区切られます) として結合されます。
XML を投影するときに使用される XSD タイプを宣言します。このパラメータは、すべての InterSystems IRIS データ型クラスで適切に設定されます。InterSystems IRIS XML ツールでは、スキーマ生成時にこのパラメータが使用されます。このパラメータは、入出力変換に直接影響することはありませんが、それらの変換との一貫性は保持する必要があります。
ストリーム・クラスの XML タイプへの投影
クラスまたはプロパティが InterSystems IRIS ストリームに基づく場合、以下のテーブルに示すように XML タイプに投影されます。
InterSystems IRIS ストリーム・タイプ | 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 プロジェクションを指定するのに十分な情報がクラス定義に格納されています。ただし、コレクション・プロパティでは、InterSystems IRIS でサポートしている形式の定義の一部では、完全な XML スキーマに対して十分な情報が用意されていません。スキーマが必要なコンテキスト (Web サービスや Web クライアントなど) で 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:XMLItemName が Type と同じ場合、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 には、MyProp と AnotherProp の 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:XMLKeyName が Type と同じ場合、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 には、MyProp と AnotherProp の 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 であり、InterSystems IRIS にはタイプ 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 タイプは以下のようにネームスペースに割り当てられます。
-
対応するクラス定義が XSDTYPE クラス・パラメータを定義する場合、タイプは以下の W3 ネームスペースに入ります。
http://www.w3.org/2001/XMLSchema
データ型クラス内でのみ XSDTYPE クラス・パラメータを指定します。
Note:データ型クラスは XSDTYPE クラス・パラメータを継承しません。つまり、既存のデータ型クラスをサブクラス化すると、クラスを XSD タイプのいずれかにマッピングする必要がある場合にはこのパラメータを指定する必要があります。
-
クラス定義が XSDTYPE を定義せずに NAMESPACE を定義する場合、タイプは NAMESPACE によって指定されるネームスペースに入ります。
-
それ以外の場合は、タイプはどのネームスペースにも入りません。
ただし、ネームスペースはスキーマの生成時に指定できます。"クラスからの XML スキーマの生成" を参照してください。
タイプが割り当てられるネームスペースを参照するには、%XML.SchemaOpens in a new tab および %XML.WriterOpens in a new tab を使用する必要があります。詳細は、"クラスからの XML スキーマの生成" を参照してください。
QName タイプのネームスペース接頭語の抑制
"XML ツールの使用法" の説明に従って、%XML.WriterOpens in a new tab で出力を生成する際に、XML タイプ属性を含めることができます。そのためには、ライターの OutputTypeAttribute プロパティを 1 に指定します。
既定では、タイプ属性は QName (修飾名) として書き込まれ、タイプの名前とタイプの所属先ネームスペースの両方を示します。以下はその例です。
<TeamA xmlns:s01="http://mynamespace" xsi:type="s01:TeamA">
対応する InterSystems IRIS クラス定義を定義して、ネームスペース接頭語が抑制されるようにします。以下はその例です。
<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"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<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 属性内に接頭語がありません。
SUPPRESSTYPEPREFIX は、XML タイプが属するネームスペースに影響しません。タイプ接頭語の記述を抑制するだけです。