第十八章 Caché 定义和使用XData块

文章目录

第十八章 Caché 定义和使用XData块

XData块是一个类成员,由一个名称和一个格式良好的XML单元组成,可以将其包含在类定义中,以供编译后的类使用。

基础

XData块是包含在类定义中的格式良好的XML的命名单元。该块的目的是为了某些特定目的包含结构化信息,供类在编译后使用。

可以通过直接在Studio中输入XData块或在Studio中使用向导来创建XData块。

XData块是命名的类成员(如属性,方法等)。可用的XData块关键字包括:

  • SchemaSpec —(可选)指定可以验证XData的XML模式。
  • XMLNamespace —(可选)指定XData块所属的XML名称空间。当然,也可以在XData块本身中包含名称空间声明。
  • MimeType — XData块的内容的MIME类型(更正式地是Internet媒体类型)。默认值为text / xml

XData块的内容必须包含一个带有任何有效内容的根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.CompiledXData和%Dictionary包中的其他类。

如果要定义少量的系统数据,则XData块很有用。例如,假设EPI.AllergySeverity类包含代码属性(供内部使用)和描述属性(供向用户显示)。

此类可以包含一个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元素,而是将数据行简单地表示为分隔字符串。此方法允许以直观紧凑的形式编写设置数据。
  • EPI.AllergySeverity类未启用XML,并且不需要启用XML。

完整示例

/// d ##class(PHA.OP.MOB.Test).Setup()
/// called by EPI.Utils.GenerateData
ClassMethod Setup() As %Status
{
   //first kill extent
   ;do ..%KillExtent()
   
   // 此类中包含的XDATA块获取XML流
   Set xdataID="PHA.OP.MOB.TestThree||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
   
   //逐个节点遍历文档
   while textreader.Read()
   {
       if (textreader.NodeType="chars")
       {
           set value=textreader.Value

           w $Piece(value,"^",1),!
   
        }
   }
}
DHC-APP>d ##class(PHA.OP.MOB.Test).Setup()
1
2
3
9
99
Class PHA.OP.MOB.TestThree Extends %RegisteredObject
{
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>
}

}
发布了29 篇原创文章 · 获赞 29 · 访问量 2181

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/105193058
今日推荐