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 対応にする必要もありません。