文章目录
-
第十八章 Caché 定义和使用XData块 - 基础
- 示例XData块
- 使用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>
}
}