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?

XData ブロックの定義と使用

XData ブロックは、コンパイル後のクラスで使用するためにクラス定義に含める、名前と整形式の XML ユニットから構成されるクラス・メンバです。この章では、XData ブロックについて説明します。また、以下の項目についても説明します。

このドキュメントをオンラインで表示している場合は、このドキュメントの "序文" を使用すると、関連のあるトピックをすばやく見つけることができます。

基本

XData ブロックは、クラス定義に含める、名前が付けられた整形式の XML ユニットです。このブロックの用途は、コンパイル後のクラスで使用する、特定の目的のために構造化された情報を格納することです。

XData ブロックは、スタジオで直接入力するか、スタジオ内のウイザードを使用して作成することができます。

XData ブロックは、名前付きクラス・メンバ です (プロパティ、メソッドなどと同様)。使用できる XData ブロック・キーワードは以下のとおりです。

  • SchemaSpec — オプションで、XData を検証できる XML スキーマを指定します。

  • XMLNamespace — オプションで、XData ブロックが属する XML ネームスペースを指定します。また、当然ながら、XData ブロック自体の中にもネームスペース宣言を含めることができます。

  • MimeType — XData ブロックのコンテンツの MIME タイプ (正式には、インターネット・メディア・タイプOpens in a new tab)。既定は text/xml です。

XData ブロックのコンテンツは、1 つのルート XML 要素と任意の有効なコンテンツで構成される必要があります。

XData ブロックの例

Zen では、XData ブロックを広範囲にわたって使用しています。これらの XData ブロックについては、すべて "Zen の使用法" で説明されています。以下に例を示します。

XData Contents [XMLNamespace="http://www.intersystems.com/zen"]
  {
    <page xmlns="http://www.intersystems.com/zen" title="HelpDesk">
      <html id="title">My Title</html>
      <hgroup>
        <pane paneName="menuPane"/>
        <spacer width="20"/>
        <vgroup width="100%" valign="top">
          <pane paneName="tablePane"/>
          <spacer height="20"/>
          <pane paneName="detailPane"/>
        </vgroup>
      </hgroup>
    </page>
  }

XData の使用 (例)

プログラム的に任意の XData ブロックにアクセスするには、%Dictionary.CompiledXDataOpens in a new tab および %Dictionary パッケージのその他のクラスを使用します。

少量のシステム・データを定義する場合は、XData ブロックが役に立ちます。例えば、EPI.AllergySeverity クラスに、プロパティ Code (内部使用) と プロパティ Description (ユーザへの表示用) があるとします。このクラスに、次のように XData ブロックを記述できます。

XData LoadData
{
<table>
 <row>1^Minor</row>
 <row>2^Moderate</row>
 <row>3^Life-threatening</row>
 <row>9^Inactive</row>
 <row>99^Unable to determine</row>
</table>
}

同じクラスに、次のように、この XData ブロックを読み取ってテーブルを生成するクラス・メソッドを記述することもできます。

/// called by EPI.Utils.GenerateData
ClassMethod Setup() As %Status
{
   //first kill extent
   do ..%KillExtent()
   
   // Get a stream of XML from the XData block contained in this class
   Set xdataID="EPI.AllergySeverity||LoadData"
   Set compiledXdata=##class(%Dictionary.CompiledXData).%OpenId(xdataID)
   Set tStream=compiledXdata.Data
   If '$IsObject(tStream) Set tSC=%objlasterror Quit
   
   set status=##class(%XML.TextReader).ParseStream(tStream,.textreader)
   //check status
   if $$$ISERR(status) do $System.Status.DisplayError(status) quit
   
   //iterate through document, node by node
   while textreader.Read()
   {
       if (textreader.NodeType="chars")
       {
           set value=textreader.Value
           set obj=..%New()
           set obj.Code=$Piece(value,"^",1)
           set obj.Description=$Piece(value,"^",2)
           do obj.%Save()
           }
   }
}

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

  • XData に記述する XML は必要最小限で済みます。つまり、独自の要素や属性を持つ XML 要素としてアレルギー反応程度を記述する代わりに、単なるデータの行を区切り文字列として XData ブロックに記述します。これにより、見やすい形式で設定データを記述できます。

  • EPI.AllergySeverity クラスは、XML 対応ではなく、また XML 対応にする必要もありません。

FeedbackOpens in a new tab