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 例はリテラル形式になります。

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

  • XMLSEQUENCE

  • XMLUNSWIZZLE

  • XMLPREFIX

  • XMLIGNOREINVALIDTAG

  • XMLIGNOREINVALIDATTRIBUTE

要素を閉じる形式の制御

XML で属性のみを含む要素は、以下のいずれかで示すことができます。

<tag attribute="value" attribute="value" attribute="value"></tag>
<tag attribute="value" attribute="value" attribute="value"/>

Caché は、これらの形式を等価と認識します。%XML.WriterOpens in a new tab のあるオブジェクトをエクスポートすると、閉じる形式は制御できますが、XML プロジェクション自体は変更されません。"Caché XML ツールの使用法" の “Caché オブジェクトからの XML 出力の記述” の章の “要素を閉じる形式の制御” を参照してください。

複数の同名のタグを含む XML ドキュメントの処理

XML の特定の要素には、複数の同名の要素を含めることができます。これらの要素は、その順序によって互いに区別されます。例えば、以下は正規の XML ドキュメントです。

<?xml version="1.0" encoding="UTF-8"?>
<Root>
   <Person>
      <Name>Able, Andrew</Name>
      <DOB>1977-10-06</DOB>
      <Address>
         <Street>6218 Clinton Drive</Street>
         <City>Reston</City>
         <State>TN</State>
         <Zip>87639</Zip>
      </Address>
      <Address>
         <Street>110 High Street</Street>
         <City>Zanesville</City>
         <State>OR</State>
         <Zip>80719</Zip>
      </Address>
   </Person>
</Root>

各クラス・プロパティには一意の名前が必要なので、こうしたドキュメントを Caché クラスにマッピングするには多少の注意を要します。

こうしたドキュメントを Caché クラスにマッピングするには、以下の手順を実行します。

  • 必要に応じて XMLNAME プロパティ・パラメータを設定して、異なるクラス・プロパティを同じ XML 名にマッピングします。

  • XMLSEQUENCE クラス・パラメータを 1 に設定します。この予防措置により、クラス定義で指定されたプロパティの順序に従ってマッピングが行われることが保証されます。

  • プロパティが XML ドキュメント内の順序と同じ順序でクラス定義のリストに挙げられていることを確認します。

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

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

Property Name As %Name [ Required ];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [ Required ];
Property HomeAddress As GXML.TestSequence.Address(XMLNAME = "Address");
Property WorkAddress As GXML.TestSequence.Address(XMLNAME = "Address");

/// If the XMLSEQUENCE = 1, then the order of the XML elements must match the 
/// order of the class properties.  This allows us to deal with XML where the 
/// same field appears multiple times and is distinguished by the order.
Parameter XMLSEQUENCE = 1;

}

このクラス定義は、前述の XML ドキュメントにマッピングします。

Note:

XMLSEQUENCE が 1 の場合、XMLIGNOREINVALIDTAG パラメータは無視されます。

エクスポート後のアンスウィズルの制御

Caché XML ツールを使用して、XML 対応の永続的なオブジェクトをエクスポートすると、通常どおり、必要な情報がすべて、メモリに自動的にスウィズルされます。この情報にはオブジェクト値プロパティが含まれています。オブジェクトをエクスポートしたら、いずれのオブジェクト・リストもアンスウィズルされますが、(既定では) 単一のオブジェクト参照はアンスウィズルされません。大きなオブジェクトの場合は、<STORE> エラーが発生する可能性があります。

このシナリオで、いずれの単一オブジェクト参照もアンスウィズルされるようにするには、XML 対応のクラスで XMLUNSWIZZLE パラメータを以下のように設定します。

Parameter XMLUNSWIZZLE = 1;

このパラメータの既定値は 0 です。

エクスポートでの Caché ID の投影

Caché オブジェクトを (別のオブジェクトのプロパティとしてではなく) 最上位レベルで投影する際、その内部 ID、OID、およびグローバルに一意な ID はオブジェクト・プロパティとして使用できないので、これらの ID は投影されません。ただし、場合によっては、オブジェクト ID を一意の識別子として使用する必要がある場合があります。そこで、例えば、ストアド・オブジェクトを更新する前に、入力 (変更された) オブジェクトを対応するストアド・オブジェクトと照合できます。

Caché XML サポートでは、Caché オブジェクト識別子の XML ドキュメントへの投影に使用できるヘルパー・クラス、%XML.IdOpens in a new tab (内部 ID 用)、%XML.OidOpens in a new tab (OID 用)、および %XML.GUIDOpens in a new tab (グローバルに一意な ID 用) が用意されています。

これらのクラスを使用するには、特殊なプロパティを、エクスポートしようとする ID を含めることを目的とする XML 対応クラスに追加します。このプロパティのタイプは、%XML.IdOpens in a new tab%XML.OidOpens in a new tab、または %XML.GUIDOpens in a new tab である必要があります。クラスの SQL プロジェクションに含まれないように、このプロパティを投影して、このプロパティを Transient としてマークする必要があります。

XML へのエクスポートの際は、XML 対応クラスのオブジェクトをメモリに入れます。オブジェクトがメモリに入ると、追加した特殊なプロパティが要求された ID を Caché 内部ストレージから取得し、その値を (エクスポートできるように) 含めます。

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

Class MyApp4.Obj.Person4 Extends (%Persistent,%Populate,%XML.Adaptor) 
{

Property IdForExport As %XML.Id
(XMLNAME="CacheID", XMLPROJECTION="ELEMENT") [Private, Transient];

Property Name As %Name;

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

}

このクラスでは、特殊なプロパティは IdForExport です。このプロパティは、CacheID という XML 要素名で投影されます。

このクラスの出力例は以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<Root>
   <Person>
      <CacheID>1</CacheID>
      <Name>Marks,Jules F.</Name>
      <DOB>1989-04-02</DOB>
   </Person>
   <Person>
      <CacheID>2</CacheID>
      <Name>Palmer,Angelo O.</Name>
      <DOB>1937-11-15</DOB>
   </Person>
...

エクスポート時のネームスペース接頭語の制御

オブジェクトの XML 出力を生成する場合、システムによって適宜ネームスペース接頭語が生成されますが、必要に応じてその接頭語を指定できます。そのためには、XML 対応オブジェクトのクラス定義で以下のパラメータを設定します。

XMLPREFIX

このクラスのネームスペースと関連付けるための接頭語を指定します。

詳細は、"Caché XML ツールの使用法" の “Caché オブジェクトからの XML 出力の記述” を参照してください。

インポート時の予期しない要素および属性の処理

ソース XML ドキュメントには予期しない要素および属性が含まれている場合があるため、XML 対応クラスには、このようなドキュメントをインポートする際の対応方法を指定する 2 つのパラメータが用意されています。例えば、以下のクラス定義について考えてみます。

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

Property Name As %Name [ Required ];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [ Required ];
}

以下の XML ドキュメントについても考えてみます。

<?xml version="1.0" encoding="UTF-8"?>
<Root>
   <Person employeeID="450">
      <Name>Dillard, Daniel</Name>
      <DOB>1962-09-18</DOB>
      <UserID>fr0078</UserID>
      <Address>
         <Street>810 Main Street</Street>
         <City>Reston</City>
         <State>NJ</State>
         <Zip>02641</Zip>
      </Address>
   </Person>
</Root>

employeeID 属性および <Address> 要素は、このクラスのプロパティには対応しないので、予期されません。

予期しない属性および要素の処理方法を指定するには、XML 対応クラスの以下のパラメータを使用します。

XMLIGNOREINVALIDATTRIBUTE

予期しない属性の処理方法を制御します。このパラメータが 1 (既定) の場合、そうした属性は無視されます。0 の場合、エラーとして扱われ、インポートは失敗します。

XMLIGNOREINVALIDTAG

予期しない要素の処理方法を制御します。このパラメータが 1 の場合、そうした要素は無視されます。0 の場合 (既定)、エラーとして扱われ、インポートは失敗します。

これらのパラメータは、インポートのみに影響します。

Note:

xmlns 属性、配列キーの name 属性、およびスキーマのインスタンス (xsi) の属性は常に無視されます。

また、XMLSEQUENCE が 1 の場合、XMLIGNOREINVALIDTAG パラメータは無視されます。この章で前述している “複数の同名のタグを含むドキュメントの処理” を参照してください。

FeedbackOpens in a new tab