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.SchemaOpens in a new tab を使用して、XML 対応クラスから XML スキーマを生成する方法を説明します。項目は以下のとおりです。

概要

同じ XML ネームスペース内の複数のクラス用のタイプを定義する完全なスキーマを生成するには、%XML.SchemaOpens in a new tab を使用してスキーマを構築し、%XML.WriterOpens in a new tab を使用してその出力を生成します。

複数のクラスからのスキーマの構築

XML スキーマを構築する手順は次のとおりです。

  1. %XML.SchemaOpens in a new tab の新しいインスタンスを作成します。

  2. オプションとして、インスタンスのプロパティを設定します。

    • ほかに割り当てられていないタイプのネームスペースを指定するには、DefaultNamespace プロパティを指定します。既定は Null です。

    • 既定では、クラスとそのプロパティのクラス・ドキュメントは、スキーマの <annotation> 要素に含まれます。これを無効にするには、IncludeDocumentation プロパティを 0 に指定します。

    Note:

    AddSchemaType() メソッドを呼び出す前に、これらのプロパティを設定する必要があります。

  3. インスタンスの AddSchemaType() メソッドを呼び出します。

    method AddSchemaType(class As %String, 
                         top As %String  = "", 
                         format As %String, 
                         summary As %Boolean  = 0, 
                         input As %Boolean  = 0, 
                         refOnly As %Boolean  = 0) as %Status
    

    以下はその説明です。

    • class は、XML 対応クラスのパッケージとクラスの完全な名前です。

    • top はオプションです。これを指定すると、このクラスのタイプ名がオーバーライドされます。

    • format では、このタイプの形式を指定します。これは、"literal" (リテラル形式、既定値)、"encoded" (SOAP エンコードの場合)、"encoded12" (SOAP 1.2 エンコードの場合)、または "element" である必要があります。値 "element" は、最上位レベルの要素を持つリテラル形式と同じです。

    • summary が True の場合、Caché では、XML 対応クラスの XMLSUMMARY パラメータが考慮されます。このパラメータが指定されている場合、スキーマには、そのパラメータで指定されているプロパティのみが含まれるようになります。

    • input が True の場合、Caché では、出力スキーマではなく、入力スキーマが取得されます。ほとんどの場合、入力スキーマと出力スキーマは同じですが、クラスのプロパティに対して XMLIO プロパティ・パラメータが指定されている場合は、異なったものになります。

    • refOnly が True の場合、Caché では、指定のクラスとすべての参照先タイプに対するスキーマではなく、参照先タイプに対するスキーマのみが生成されます。

    このメソッドはステータスを返すので、それをチェックする必要があります。

  4. 前述の手順を必要に応じて繰り返します。

  5. オプションで、インポートされたスキーマの場所を定義するには、DefineLocation() メソッドを呼び出します。

    method DefineLocation(namespace As %String, location As %String)
    

    namespace は、1 つ以上の参照先クラスによって使用されるネームスペースです。location は、対応するスキーマ (XSD ファイル) の URL またはパスとファイル名です。

    このメソッドを繰り返し呼び出して、インポートされた複数のスキーマの場所を追加することができます。

    このメソッドを使用しない場合、スキーマには <import> 指示文が含まれますが、スキーマの場所は示されません。

  6. オプションで、追加の <import> 指示文を定義するには、DefineExtraImports() メソッドを呼び出します。

    method DefineExtraImports(namespace As %String, ByRef imports)
    

    namespace は、<import> 指示文の追加先となるネームスペースです。imports は、以下の形式の多次元配列です。

    ノード
    arrayname("namespace URI") このネームスペースに対するスキーマ (XSD ファイル) の場所を示す文字列。

スキーマの出力の生成

前のセクションで説明したように %XML.SchemaOpens in a new tab のインスタンスを作成したら、以下の手順を実行して出力を生成します。

  1. インスタンスの GetSchema() メソッドを呼び出し、ドキュメント・オブジェクト・モデル (DOM) のノードとしてスキーマを返します。

    このメソッドの引数は、スキーマのターゲットのネームスペースの URI のみです。このメソッドは、%XML.NodeOpens in a new tab のインスタンスを返します。このことは、“XML ドキュメントの DOM 表現” の章で説明されています。

    スキーマにネームスペースが指定されていない場合、GetSchema() の引数として "" を使用します。

  2. オプションとして、この DOM を変更します。

  3. スキーマを生成する手順は以下のとおりです。

    1. %XML.WriterOpens in a new tab クラスのインスタンスを作成し、オプションで Indent などのプロパティを設定します。

    2. オプションで、ライターの AddNamespace() などのメソッドを呼び出して、<schema> 要素にネームスペース宣言を追加します。詳細は、このドキュメントで前述した “ネームスペース宣言の追加” を参照してください。

      多くの場合、スキーマは単純な XSD タイプを参照するため、AddSchemaNamespace() を呼び出して XML スキーマのネームスペースを追加することは有用です。

    3. 引数としてスキーマを使用して、ライターの DocumentNode() メソッドまたは Tree() メソッドを呼び出します。

      これらのメソッドの使用方法の詳細は、“XML ドキュメントの DOM 表現” の章の “DOM からの XML 出力の記述” を参照してください。

その他の例は、クラスリファレンスで %XML.SchemaOpens in a new tab を参照してください。

簡単な例

最初の例では、基本的な手順を示しています。

 Set schemawriter=##class(%XML.Schema).%New()
 
 //add class and package (for example)
 Set status=schemawriter.AddSchemaType("Facets.Test")

 //retrieve schema by its URI
 //which is null in this example
 Set schema=schemawriter.GetSchema("")
 
 //create writer
 Set writer=##class(%XML.Writer).%New()
 Set writer.Indent=1
 
 //use writer
 Do writer.DocumentNode(schema)

より複雑なスキーマの例

以下の例を考えてみます。Person クラスは以下のとおりです。

Class SchemaWriter.Person Extends (%Persistent, %XML.Adaptor)
{

Parameter NAMESPACE = "http://www.myapp.com";

Property Name As %Name;

Property DOB As %Date(FORMAT = 5);

Property PatientID as %String;

Property HomeAddress as Address;

Property OtherAddress as AddressOtherNS ;
}

Address クラスは、同じ XML ネームスペース ("http://www.myapp.com") 内に存在するように定義されます。OtherAddress クラスは、別な XML ネームスペース ("http://www.other.com") 内に存在するように定義されます。

Company クラスも、XML ネームスペース "http://www.myapp.com" 内に存在するように定義されます。以下のように定義されます。

Class SchemaWriter.Company Extends (%Persistent, %XML.Adaptor)
{

Parameter NAMESPACE = "http://www.myapp.com";

Property Name As %String;

Property CompanyID As %String;

Property HomeOffice As Address;

}

Person クラスと Company クラスを結び付けるプロパティ・リレーションシップはありません。

ネームスペース "http://www.myapp.com" に対するスキーマを生成するには、以下の構文を使用できます。

ClassMethod Demo()
{
    Set schema=##class(%XML.Schema).%New()
    Set schema.DefaultNamespace="http://www.myapp.com"
    Set status=schema.AddSchemaType("SchemaWriter.Person")
    Set status=schema.AddSchemaType("SchemaWriter.Company")
    Do schema.DefineLocation("http://www.other.com","c:/other-schema.xsd")

    Set schema=schema.GetSchema("http://www.myapp.com")

    //create writer
    Set writer=##class(%XML.Writer).%New()
    Set writer.Indent=1
    
    Do writer.AddSchemaNamespace()
    Do writer.AddNamespace("http://www.myapp.com")
    Do writer.AddNamespace("http://www.other.com")
    
    Set status=writer.DocumentNode(schema)
    If $$$ISERR(status) {Do $system.OBJ.DisplayError() Quit }
 
}

出力は、以下のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
xmlns:s="http://www.w3.org/2001/XMLSchema" 
xmlns:s01="http://www.myapp.com" 
xmlns:s02="http://www.other.com" 
elementFormDefault="qualified" 
targetNamespace="http://www.myapp.com">
  <import namespace="http://www.other.com" schemaLocation="c:/other-schema.xsd"/>
  <complexType name="Person">
    <sequence>
      <element minOccurs="0" name="Name" type="s:string"/>
      <element minOccurs="0" name="DOB" type="s:date"/>
      <element minOccurs="0" name="PatientID" type="s:string"/>
      <element minOccurs="0" name="HomeAddress" type="s01:Address"/>
      <element minOccurs="0" name="OtherAddress" type="s02:AddressOtherNS"/>
    </sequence>
  </complexType>
  <complexType name="Address">
    <sequence>
      <element minOccurs="0" name="State">
        <simpleType>
          <restriction base="s:string">
            <maxLength value="2"/>
          </restriction>
        </simpleType>
      </element>
      <element minOccurs="0" name="Zip">
        <simpleType>
          <restriction base="s:string">
            <maxLength value="10"/>
          </restriction>
        </simpleType>
      </element>
    </sequence>
  </complexType>
  <complexType name="Company">
    <sequence>
      <element minOccurs="0" name="Name" type="s:string"/>
      <element minOccurs="0" name="CompanyID" type="s:string"/>
      <element minOccurs="0" name="HomeOffice" type="s01:Address"/>
    </sequence>
  </complexType>
</schema>

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

  • スキーマには、Person とそのすべての参照先クラスに対するタイプが含まれています。また、Company とそのすべての参照先クラスに対するタイプも含まれています。

  • <import> 指示文では、OtherAddress クラスによって使用されるネームスペースがインポートされます。DefineLocation() を使用したため、この指示文では、対応するスキーマの場所も示されます。

  • DocumentNode() を呼び出す直前に AddSchemaNamespace()AddNamespace() を使用したため、<schema> 要素には、ネームスペースの接頭語を定義するネームスペース宣言が含まれます。

    AddSchemaNamespace()AddNamespace() を使用しない場合は、<schema> にそれらのネームスペース宣言が含まれることはなく、スキーマは以下のようになります。

    <?xml version="1.0" encoding="UTF-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    targetNamespace="http://www.myapp.com">
      <import namespace="http://www.other.com" schemaLocation="c:/other-schema.xsd"/>
      <complexType name="Person">
        <sequence>
          <element minOccurs="0" name="Name" type="s01:string" xmlns:s01="http://www.w3.org/2001/XMLSchema"/>
          <element minOccurs="0" name="DOB" type="s02:date" xmlns:s02="http://www.w3.org/2001/XMLSchema"/>
          <element minOccurs="0" name="PatientID" type="s03:string" xmlns:s03="http://www.w3.org/2001/XMLSchema"/>
          <element minOccurs="0" name="HomeAddress" type="s04:Address" xmlns:s04="http://www.myapp.com"/>
          <element minOccurs="0" name="OtherAddress" type="s05:AddressOtherNS" xmlns:s05="http://www.other.com"/>
        </sequence>
      </complexType>
      <complexType name="Address">
        <sequence>
          <element minOccurs="0" name="State">
            <simpleType>
              <restriction base="s06:string" xmlns:s06="http://www.w3.org/2001/XMLSchema">
    ...
    
FeedbackOpens in a new tab