1 关注者 · 991 帖子

  

InterSystems Caché 是一个多模型 DBMS 和应用服务器。

查看此处提供的更多详细信息

文档

问题 e e · 六月 7, 2021

为什么我用webservice上传文件比csp上传文件快?

webservice用的soap协议也得走http呀。csp直接处理http,少了xml的封装,按理来说应该更快。

经测试,1M的文件,csp慢了0.1s左右。在网关连接到1972后,有0.1s左右的停滞,不知道原因。

有什么办法能够使csp的文件上传速度比webservice快吗?

1
0 397
文章 姚 鑫 · 六月 28, 2021 6m read

第二十一章 使用%XML.TextReader 导航文档

导航文档

要在文档中导航,请使用文本阅读器的以下方法:Read()ReadStartElement()MoveToAttributeIndex()、、、和。

导航到下一个节点

要移动到文档中的下一个节点,请使用方法。方法返回TRUE值,直到没有更多节点可读为止(即,直到到达文档末尾)。前面的示例在如下所示的循环中使用了此方法:

 While (textreader.Read()) {

...

 }

导航到特定元素的第一个匹配项

可以移动到文档中特定元素的第一个匹配项。为此,请使用方法。除非找不到元素,否则此方法返回TRUE。如果未找到该元素,则该方法到达文件末尾。

ReadStartElement()方法有两个参数:元素的名称和命名空间URI(可选)。请注意,类中的%XML.TextReader不会对命名空间前缀进行任何处理。因此,方法将以下两个元素视为具有不同的名称:

<Person>Smith,Ellen W. xmlns="http://www.person.org"</Person>

<s01:Person>Smith,Ellen W. xmlns:s01="http://www.person.org"</s01:Person>

导航到属性

0
0 156
文章 姚 鑫 · 六月 27, 2021 5m read

第二十章 使用%XML.TextReader 节点属性

节点属性

如前所述,类中的%XML.TextReader解析XML文档并创建一个text reader对象,该对象由一组与文档组件相对应的节点组成;节点类型在本章前面的“文档节点”中进行了描述。

当将焦点更改到其他节点时,text reader对象的属性将更新,以包含有关当前检查的节点的信息。本节介绍类中的所有属性。

AttributeCount

如果当前节点是元素或属性,则此属性指示元素的属性数。在给定元素中,第一个属性编号为1。对于任何其他类型的节点,此属性为0

Depth

指示文档中当前节点的深度。根元素位于深度1;根元素之外的项位于深度。请注意,属性与其所属元素的深度相同。同样,错误或警告与导致错误或警告的项的深度相同。

EOF

如果读取器已到达源文档的末尾,则为true;否则为false。

HasAttributes

如果当前节点是一个元素,则如果该元素具有属性,则此属性为true(如果没有属性,则为false)。如果当前节点是属性,则此属性为true。对于任何其他类型的节点,此属性为False。

HasValue

如果当前节点是具有值的节点类型(即使该值为空),则为True。否则,此属性为false。

0
0 169
文章 姚 鑫 · 六月 26, 2021 6m read

第十九章 使用%XML.TextReader

%XML.TextReader类提供了一种简单、容易的方法来读取可能直接映射到InterSystems IRIS对象,也可能不直接映射到InterSystems IRIS对象的任意XML文档。具体地说,该类提供了导航格式良好的XML文档并查看其中信息(元素、属性、注释、名称空间URI等)的方法。该类还基于DTDXML架构提供完整的文档验证。但是,与不同的是,不提供返回的方法。如果需要DOM,请参阅前面的“将XML导入对象”一章。

注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码,InterSystems IRIS将使用前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。

创建文本阅读器方法

要读取不一定与 IRIS对象类有任何关系的任意XML文档,可以调用%XML.TextReader类的方法,该类将打开文档并将其作为文本阅读器对象加载到临时存储中。文本阅读器对象包含一个可导航的节点树,每个节点都包含有关源文档的信息。然后,方法可以导航该文档并查找有关该文档的信息。对象的属性提供有关文档的信息,这些信息取决于在文档中的当前位置。如果存在验证错误,这些错误也可以作为树中的节点使用。

整体结构

0
0 160
文章 姚 鑫 · 六月 25, 2021 10m read

第十八章 签署XML文档

本章介绍如何向XML文档添加数字签名。

关于数字签名文档

数字签名的XML文档包括一个或多个元素,每个元素都是数字签名。 每个元素对文档中的特定元素进行如下签名:

  • 每个签名元素都有一个ID属性,该属性等于某个唯一值。例如:
<Person xmlns="http://mynamespace" Id="123456789">
  • 一个元素包含一个元素,它指向该Id,如下所示:
<Reference URI="#123456789">

元素是由私钥签名的。此元素包括由签名机构签署的X.509证书。如果已签名文档的接收方信任此签名机构,则接收方可以验证证书,并使用包含的公钥验证签名。

注意: IRIS还支持一种变体,其中有签名的元素有一个名为ID的属性,而不是ID。

下面是一个示例,为了便于阅读,添加了空格:

<?xml version="1.0" encoding="UTF-8"?>
<Person xmlns="http://mynamespace" Id="123456789">
  <Name>Persephone MacMillan</Name>
  <DOB>1976-02-20</DOB>
  <s01:Signature xmlns="http://www.w3.org/2000/09/xmldsig#" 
                 xmlns:s01="http://mynamespace" 
                 s02:Id="Id-BC0B1674-758D-40B9-84BF-F7BAA3AA19F4" 
xmlns:s02="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
      </CanonicalizationMethod>
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1">
      </SignatureMethod>
      <Reference URI="#123456789">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature">
          </Transform>
          <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml1317c14n-20010315">
          </Transform>
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod>
        <DigestValue>FHwW2U58bztLI4cIE/mp+nsBNZg=</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>MTha3zLoj8Tg content omitted</SignatureValue>
    <KeyInfo>
      <X509Data>
        <X509Certificate>MIICnDCCAYQCAWUwDQYJ content omitted</X509Certificate>
      </X509Data>
    </KeyInfo>
  </s01:Signature>
</Person>
0
0 293
文章 姚 鑫 · 六月 15, 2021 5m read

第七章 控制命名空间分配的外观

控制命名空间分配的外观

除了控制命名空间分配外,还可以控制命名空间分配在XML输出中的显示方式。具体地说,可以控制以下内容:

显式名称空间分配与隐式名称空间分配

将元素和属性分配给命名空间时,XML中有两种等效的表示形式,由编写器实例的SuppressXmlns属性控制。

为一个名为Person的对象生成XML输出,该对象被分配给名称空间“http://www.person.org”(通过前面讨论的namespace类参数)。 使用缺省输出(等于0)的示例如下:

<Person xmlns="http://www.person.com" GroupID="4">
  <Name>Uberoth,Amanda Q.</Name>
  <DOB>1952-01-13</DOB>
</Person>

另一种可能的形式完全相同,如下所示。 这是使用等于1生成的,它确保显式分配给名称空间的每个元素都显示为该名称空间的前缀。

<s01:Person xmlns:s01="http://www.person.com" GroupID="4">
  <s01:Name>Uberoth,Amanda Q.</s01:Name>
  <s01:DOB>1952-01-13</s01:DOB>
</s01:Person>
1
0 181
文章 姚 鑫 · 六月 24, 2021 6m read

第十七章 加密XML文档

本章介绍如何加密XML文档。

提示:发现在此命名空间中启用SOAP日志记录非常有用,这样就可以收到有关任何错误的更多信息。

关于加密的XML文档

加密的XML文档包括以下元素:

  • 元素,其中包含由随机生成的对称密钥加密的加密数据。(使用对称密钥加密比使用公钥加密更有效。)
  • 至少有一个元素。每个元素携带用于加密数据的对称密钥的加密副本;它还包含一个带有公钥的X.509证书。拥有匹配私钥的接收方可以解密对称密钥,然后解密元素。
  • (可选)其他明文元素。
<?xml version="1.0" encoding="utf-8"?>

<Container xmlns="http://www.w3.org/2001/04/xmlenc#">  
  <EncryptedKey> 
    <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"> 
      <DigestMethod xmlns="http://www.w3.org/2000/09/xmldsig#" Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod> 
    </EncryptionMethod>  
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">  
      <X509Data> 
        <X509Certificate>MIICnDCCAYQCAWUwDQYJKo... content omitted</X509Certificate> 
      </X509Data> 
    </KeyInfo>  
    <CipherData> 
      <CipherValue>J2DjVgcB8vQx3UCy5uejMB ... content omitted</CipherValue> 
    </CipherData>  
    <ReferenceList> 
      <DataReference URI="#Enc-E0624AEA-9598-4436-A154-F746B07A2C55"/> 
    </ReferenceList> 
  </EncryptedKey>  
  <EncryptedData Id="Enc-E0624AEA-9598-4436-A154-F746B07A2C55" Type="http://www.w3.org/2001/04/xmlenc#Content"> 
    <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"></EncryptionMethod>  
    <CipherData> 
      <CipherValue>LmoBK7+nDelTOsC3 ... content omitted</CipherValue> 
    </CipherData> 
  </EncryptedData> 
</Container>

0
0 342
文章 姚 鑫 · 六月 23, 2021 4m read

第十六章 创建或编辑DOM

创建或编辑DOM

要创建DOM或修改现有DOM,请使用%XML.Document的以下方法在:

CreateDocument()

classmethod CreateDocument(localName As %String, 
                           namespace As %String) 
                           as %XML.Document 

在仅包含根元素的返回新实例。

AppendCharacter()

method AppendCharacter(text As %String)

将新的字符数据节点追加到此元素节点的子节点列表中。当前节点指针不变;此节点仍然是追加的子节点的父节点。

AppendChild()

method AppendChild(type As %String)

将新节点追加到此节点的子节点列表中。当前节点指针不变;此节点仍然是追加的子节点的父节点。

0
0 148
文章 Michael Lei · 六月 23, 2021 13m read

部分 Ansible 帮助我解决了快速部署 Caché 和应用程序组件以进行数据平台基准测试的问题。 您可以使用相同的工具和方法来建立您的测试实验室、培训系统、开发或其他环境。 如果在客户站点部署应用程序,可以将大量部署自动化,并确保系统、Caché 和应用程序的配置符合您的应用程序最佳做法标准。

0
1 337
文章 Michael Lei · 六月 23, 2021 3m read

注(2019 年 6 月):许多内容发生了变化,最新的详细信息请参见此处 注(2018 年 9 月):自本帖首次发布以来,内容已经有了很大改动,我建议使用 Docker 容器版本,以容器形式运行的项目以及详细信息仍然在 GitHub 的同一个地址发布,您可以下载、运行并根据需要进行修改。

与客户合作进行性能评估、容量规划和故障排除时,我经常解包和查看来自 pButtons 的 Caché 和操作系统指标。 我不久前发布了一个帖子,介绍了一个用来解包 pButtons 指标的实用工具(该实用工具使用 unix shell、perl 和 awk 脚本编写),而不是费力地浏览 html 文件,再将需要绘制的部分剪切并粘贴到 excel 中。 虽然这是一个有用的省时工具,但还不够完善... 我还使用脚本自动绘制指标图表,以便快速查看并包含在报告中。 但是,这些绘图脚本不容易维护,并且当需要站点特定的配置(例如 iostat 或 Windows perfmon 的磁盘列表)时会变得特别混乱,所以我从未公开发布过绘图实用工具。 不过我现在可以很高兴地说,已经有了简单得多的解决方案。

当我与 Fabian 一起在客户站点查看系统性能时,有了意外发现,他向我展示了使用实用的 Python 绘图模块所做的工作

0
0 348
文章 Michael Lei · 六月 23, 2021 15m read

InterSystems 数据平台包括了用于系统监视和警报的实用程序及工具,但对于不熟悉构建于 InterSystems 数据平台(又名 Caché)的解决方案的系统管理员来说,他们需要知道从何处下手以及需要配置什么。

本指南以在线文档和开发者社区帖子为参考,介绍了实现最低限度的监视和警报解决方案的途径,以及如何启用和配置以下组件:

0
0 291
文章 姚 鑫 · 六月 22, 2021 5m read

第十五章 XML检查属性

检查属性的基本方法

可以使用%XML.Node的以下方法。以检查当前节点的属性。

  • AttributeDefined() 如果当前元素具有具有给定名称的属性,则返回非零(TRUE)。
  • FirstAttributeName() 返回当前元素的第一个属性的属性名称。
  • GetAttributeValue() 返回给定属性的值。如果元素没有该属性,则该方法返回NULL。
  • GetNumberAttributes() 返回当前元素的属性数。
  • LastAttributeName() 返回当前元素的最后一个属性的属性名称。
  • NextAttributeName() 在给定属性名称的情况下,无论指定的属性是否有效,此方法都会按排序顺序返回下一个属性的名称。
  • 在给定属性名称的情况下,无论指定的属性是否有效,此方法都会按排序顺序返回上一个属性的名称。

下面的示例遍历给定节点中的属性并编写一个简单报表:

示例XML文档:

<?xml version="1.0"?>
<staff attr1="first" attr2="second" attr3="third" attr4="fourth" attr5="fifth">
  <doc>
    <name>David Marston</name>
  </doc>
</staff>
0
0 128
文章 姚 鑫 · 六月 21, 2021 3m read

第十四章 XML获取当前节点信息

DOM节点类型

%XML.Document%XML.Node类识别以下DOM节点类型:

  • Element ($$$xmlELEMENTNODE)

请注意,这些宏在%xml.DOM.inc包含文件中定义。

  • Text ($$$xmlTEXTNODE)

  • Whitespace ($$$xmlWHITESPACENODE).

其他类型的DOM节点被简单地忽略。

请以下XML文档:

<?xml version="1.0"?>
<team>
<member id="alpha">Jack O'Neill</member>
<member id="beta">Samantha Carter</member>
<member id="gamma">Daniel Jackson</member>
</team>
0
0 181
文章 姚 鑫 · 六月 20, 2021 5m read

第十三章 将XML文档表示为DOM

%XML.Document类和%XML.Node类使可以将任意XML文档表示为DOM(文档对象模型)。然后,可以导航此对象并对其进行修改。还可以创建一个新的DOM并将其添加到其中。

注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码,InterSystems IRIS将使用本书前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。

将XML文档作为DOM打开

要打开现有XML文档以用作DOM,请执行以下操作:

  1. 创建%XML.Reader的实例。
  2. 也可以指定此实例的Format属性,以指定要导入的文件的格式。

默认情况下, IRIS假定XML文件为文字格式。如果文件是SOAP编码格式,则必须指明这一点,以便可以正确读取该文件。

除非使用和Next(),否则此属性无效。

  1. 请使用%XML.Reader的以下方法之一。
  • — 打开一个文件。
  • OpenStream() —打开一个流。
  • OpenString() — 打开字符串。
  • OpenURL() — 打开URL。

在每种情况下,都可以选择为该方法指定第二个参数,以重写属性的值。

  1. 访问Document属性,它是一个DOM。此属性是%XML.Document
0
0 166
文章 姚 鑫 · 六月 19, 2021 5m read

第十二章 XML其他示例

其他示例

Flexible Reader类

/// desc:灵活读取类
ClassMethod Read(mydir, myfile, class, element)
{
	set reader=##class(%XML.Reader).%New()
	if $extract(mydir,$length(mydir))'="/" {set mydir=mydir_"/"}
	set file=mydir_myfile
	set status=reader.OpenFile(file)
	if $$$ISERR(status) {do $System.Status.DisplayError(status)}

	do reader.Correlate(element,class)

	while reader.Next(.object,.status)
	{
		if $$$ISERR(status) {do $System.Status.DisplayError(status)}
		set status=object.%Save()
		if $$$ISERR(status) {do $System.Status.DisplayError(status)}
	}
}

请注意,当读入Person对象时,会自动读入其相应的Address对象。

0
0 235
文章 姚 鑫 · 六月 18, 2021 6m read

第十一章 重新定义读取器处理相关对象的方式

重新定义读取器处理相关对象的方式

%XML.Reader找到与启用了XML的类相关的XML元素时,读取器会调用该类的XMLNew()方法,后者又会在默认情况下调用%New()。也就是说,当读取器找到相关元素时,它会创建相关类的新对象。新对象由从XML文档读取的数据填充。

可以通过在启用XML的类中(或在自己的自定义XML适配器中)重新定义来自定义此行为。例如,此方法可以改为打开该类的现有实例。然后,现有实例接收从XML文档读取的数据。

以下示例显示如何修改以使用XML文档中的新数据更新现有实例。

在这两个示例中,为简单起见,我们假设XML文档中的一个节点包含一个ID,我们可以将该ID与类的范围中的ID进行比较。当然,我们可以用其他方式将XML文档与现有对象进行比较。

%XML.Reader调用XMLNew()

作为参考,在两种情况下自动调用方法:

  • %XML.Reader在调用%XML.ReaderNext()方法调用。在将XML元素(在外部文档中)与启用了XML的类关联之后, 方法从文档中获取下一个元素,调用创建相应对象的实例,然后将该元素导入到对象中。
  • 同样,为相关XML元素的任何对象值属性调用。

示例1:修改启用XML的类中的

此文件映射到以下InterSystems IRIS类(部分显示):

Class GXML.PersonWithXMLNew Extends (%Persistent, %Populate, %XML.Adaptor)
{

Parameter XMLNAME = "Person";

/// make sure this is the same as the XMLNAME of the property 
/// in this class that is of type %XML.Id
Parameter NAMEOFEXPORTID As %String = "IRISID";

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

Property Name As %Name;

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

Property Address As GXML.Address;

Property Doctors As list Of GXML.Doctor;
0
0 162
文章 姚 鑫 · 六月 17, 2021 6m read

第十章 XML元素和属性

检查必需的元素和属性

默认情况下,next()方法不检查是否存在与标记为必需的属性相对应的元素和属性。要使读取器检查此类元素和属性是否存在,请在调用Next()之前将读取器的CheckRequired属性设置为1。出于兼容性原因,此属性的默认值为0。

如果将设置为1,并且调用,而导入的XML缺少必需的元素或属性,则next()方法会将参数设置为错误代码。例如:

SAMPLES>set next= reader.Next(.object,.status)
 
SAMPLES>w next
0
SAMPLES>d $system.Status.DisplayError(status)
 
ERROR #6318: Property required in XML document: ReqProp

处理意外的元素和属性

由于源XML文档可能包含意外的元素和属性,因此提供参数来指定导入此类文档时的反应方式。

控制如何导入空元素和属性

为对象启用XML时,需要指定将空值和空字符串投影到XML的方式

其中一个选项是在支持XML的类中将设置为等于(不区分大小写)。在这种情况下,当使用%XML. IRIS对象时, IRIS使用读取器的属性的值来确定如何处理空元素或属性,如下所示:

  • 如果读取器的IgnoreNull
0
0 208
文章 姚 鑫 · 六月 16, 2021 7m read

第九章 将XML导入到对象中

本章介绍如何使用%XML.Reader将XML文档导入到 IRIS对象中。

注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码, IRIS将使用前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。

还可以使用%XML.Reader读取任意XML文档并返回DOM(文档对象模型)。

创建XML读取器概述

IRIS提供了一些工具,用于读取XML文档并创建与该文档的元素相对应的启用XML的 IRIS对象的一个或多个实例。基本要求如下:

  • 该对象的类定义必须扩展%XML.Adaptor。除了少数例外,该对象引用的类还必须扩展%XML.Adaptor

提示:如果相应的XML模式可用,可以使用它来生成类(以及任何支持的类)。

  • 要导入XML文档,创建%XML.Reader的实例,然后调用该实例的方法。这些方法指定XML源文档,将XML元素与启用XML的类相关联,并将源中的元素读取到对象中。

%XML.Reader使用类中的%XML.Adaptor提供的方法执行以下操作:

  • 它使用InterSystems IRIS SAX接口解析和验证传入的XML文档。验证可以包括DTD或XML架构验证。
0
0 282
文章 姚 鑫 · 六月 15, 2021 5m read

第八章 Other Options of the Writer

Other Options of the Writer

Canonicalize()

方法的作用是:以规范化的形式编写XML节点。此方法具有以下签名:

method Canonicalize(node As %XML.Node, ByRef PrefixList, formatXML As %Boolean = 0) as %Status
  • node是文档的一个子树,作为%XML.Node的实例。
  • PrefixList是以下其中之一:
    • 对于包含式规范化,将PrefixList指定为“c14n”。 在本例中,输出的形式是XML Canonicalization Version 1.0,由https://www.w3.org/TR/xml-c14n
    • 对于排他规范化,将指定为具有以下节点的多维数组:
Node Value
PrefixList(前缀),其中前缀是名称空间前缀 与此名称空间前缀一起使用的名称空间
  • FormatXML控制格式。如果format XML为true,则编写器使用为编写器实例指定的格式,而不是XML规范化规范指定的格式。因此,输出不是规范的XML,但是已经对规范的XML进行了命名空间处理。
0
0 173
文章 Michael Lei · 六月 15, 2021 8m read

本帖概述了通过为 InterSystems 数据平台(InterSystems IRIS、Caché 和 Ensemble)上的数据库磁盘创建 LVM 物理盘区 (PE) 条带来实现低延迟存储 IO 的最佳实践配置,并提供了有用链接。

一致的低延迟存储是获得最佳数据库应用程序性能的关键。 例如,对于在 Linux 上运行的应用程序,经常在数据库磁盘中使用逻辑卷管理器 (LVM) ,因为它能够扩展卷和文件系统,或者为在线备份创建快照。 对于数据库应用程序,在使用 LVM PE 条带化逻辑卷的情况下,并行写入还可提高数据 I/O 的效率,从而有助于提高大规模连续读取和写入的性能。

0
0 528
文章 姚 鑫 · 六月 13, 2021 6m read

第六章 控制名称空间的使用

控制名称空间的使用

如将对象投射到XML中所述,可以将类分配给名称空间,以便相应的XML元素属于该名称空间,还可以控制类的属性是否也属于该名称空间。

将类中的对象导出为XML时,%XML.Write提供其他选项,例如指定元素是否为其父级的本地元素。本节包括以下主题:

  • 默认情况下,%XML.Writer如何处理命名空间
  • 如何指定本地元素是否合格
  • 如何指定元素是否为其父元素的本地元素
  • 如何指定属性是否合格
  • 命名空间分配方式的摘要

注意:在InterSystems IRIS XML支持中,可以按类指定名称空间。通常,每个类都有自己的命名空间声明;但是,通常只需要一个或少量的命名空间。还可以在逐个类的基础上指定相关信息(而不是以某种全局方式)。这包括控制元素是否为其父元素的本地元素以及子元素是否合格的设置。为简单起见,建议使用一致的方法。

名称空间的默认处理

若要将启用XML的类分配给命名空间,请设置该类的Namespace参数,如将对象投影到XML中所述。在会自动插入命名空间声明,生成命名空间前缀,并在适当的地方应用前缀。例如,以下类定义:

Class GXML.Objects.WithNamespaces.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{
Parameter NAMESPACE = "http://www.person.com";
Property Name As %Name [ Required ];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [ Required ];
Property GroupID As %Integer(MAXVAL=10,MINVAL=1,XMLPROJECTION="ATTRIBUTE");
}
0
0 208
文章 姚 鑫 · 六月 12, 2021 6m read

第五章 生成XML元素

生成XML元素

如果使用RootElement()启动文档的根元素,则负责生成该根元素内的每个元素。有三个选择:

将对象生成为元素

可以从InterSystems IRIS对象生成输出作为元素。在本例中,使用object()方法,该方法写入支持XML的对象。输出包括该对象中包含的所有对象引用。可以指定此元素的名称,也可以使用在对象中定义的默认值。

只能在RootElement()EndRootElement()方法之间使用object()方法。

此示例为给定启用XML的类的所有已保存实例生成输出:

/// desc:将表里数据输出本地文件里
/// w ##class(PHA.TEST.Xml).WriteAll("Sample.Person")
ClassMethod WriteTableAllToXml(cls As %String = "", directory As %String = "E:\temp\")
{
    if '##class(%Dictionary.CompiledClass).%ExistsId(cls) {
        Write !, "类不存在或未编译"
        Quit 
    }
    s check=$classmethod(cls, "%Extends", "%XML.Adaptor")
    If 'check {
        Write !, "类不扩展%XML.Adaptor"
        Quit 
    }
        
    s filename = directory_"Person"_".xml"
    
    s writer = ##class(%XML.Writer).%New()
    s writer.Indent=1
    s status = writer.OutputToFile(filename)
    if $$$ISERR(status) { do $System.Status.DisplayError(status) quit  }
    
    s status=writer.RootElement("SampleOutput")
    if $$$ISERR(status) { do $System.Status.DisplayError(status) quit  }

    //获取给定类范围内对象的ID
    s stmt = ##class(%SQL.Statement).%New()
    s status = stmt.%PrepareClassQuery(cls,"Extent")
    if $$$ISERR(status) { do $System.Status.DisplayError(status) quit  }
    
    s rset = stmt.%Execute()
    while (rset.%Next()) {
        //对于每个ID,写入该对象
        set objid = rset.%Get("ID")
        set obj = $CLASSMETHOD(cls,"%OpenId",objid)
        set status = writer.Object(obj)
        if $$$ISERR(status) {Do $System.Status.DisplayError(status) Quit}}
        
    d writer.EndRootElement()
    d writer.EndDocument()
    q ""
}
0
0 175
文章 姚 鑫 · 六月 11, 2021 4m read

第四章 添加命名空间声明

添加命名空间声明

默认行为

%XML.Writer会自动插入命名空间声明,生成命名空间前缀,并在适当的地方应用前缀。例如,以下类定义:

Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{

Parameter NAMESPACE = "http://www.yaoxin.com";
}

如果导出此类的多个对象,则会看到类似以下内容:

DHC-APP> w ##class(Demo.XmlDemo).Obj2Xml(1)
<?xml version="1.0" encoding="UTF-8"?>
<Person xmlns="http://www.yaoxin.com">
  <Name>yaoxin</Name>
  <SSN>111-11-1117</SSN>
  <DOB>1990-04-25</DOB>
  <s01:Home xmlns="" xmlns:s01="http://www.yaoxin.com">
    <Street>889 Clinton Drive</Street>
    <City>St Louis</City>
    <State>WI</State>
    <Zip>78672</Zip>
  </s01:Home>
  <s01:Office xmlns="" xmlns:s01="http://www.yaoxin.com">
    <Street>9619 Ash Avenue</Street>
    <City>Ukiah</City>
    <State>AL</State>
    <Zip>56589</Zip>
  </s01:Office>
  <Spouse>
    <Name>濮氶懌</Name>
    <SSN>111-11-1115</SSN>
    <FavoriteColors>
      <FavoriteColorsItem>Red</FavoriteColorsItem>
      <FavoriteColorsItem>Orange</FavoriteColorsItem>
      <FavoriteColorsItem>Yellow</FavoriteColorsItem>
      <FavoriteColorsItem>Green</FavoriteColorsItem>
    </FavoriteColors>
  </Spouse>
  <FavoriteColors>
    <FavoriteColorsItem>Red</FavoriteColorsItem>
    <FavoriteColorsItem>Orange</FavoriteColorsItem>
    <FavoriteColorsItem>Yellow</FavoriteColorsItem>
  </FavoriteColors>
  <Age>31</Age>
</Person>
0
0 237
文章 姚 鑫 · 六月 10, 2021 4m read

第三章 指定输出的字符集

指定输出的字符集

若要指定要在输出文档中使用的字符集,可以设置Writer实例的Charset属性。选项包括“UTF-8”“UTF-16”以及InterSystems IRIS支持的其他字符集。

Writing the Prolog

XML文件的序言(根元素之前的部分)可以包含文档类型声明、处理指令和注释。

影响Prolog的属性

writer实例中,以下属性会影响:

Charset

控制两件事声明中的字符集声明和(相应的)输出中使用的字符集编码。

NoXmlDeclaration

控制输出是否包含XML声明。在大多数情况下,默认值是0,这意味着已经编写了声明。如果没有指定字符集,并且输出定向到字符串或字符流,则默认为1,并且不写入任何声明。

生成文档类型声明

在根元素之前,可以包含文档类型声明,该声明声明了文档中使用的模式。 要生成文档类型声明,需要使用方法,该方法有一个必选参数和三个可选参数。 就本文档而言,文档类型声明包括以下可能的部分:

<!DOCTYPE doc_type_name external_subset [internal_subset]>

如这里所示,文档类型有一个名称,根据XML规则,该名称必须是根元素的名称。 声明可以包含外部子集、内部子集或两者。

0
0 327
问题 kun an · 六月 9, 2021

请问cahce中所有的数据库访问都是通过cache server完成的吗,比如使用终端访问数据库、studio开发的应用、使用第三方库使用代码都是先访问cache server,然后通过cache server对数据进行存取的吗?使用studio开发的应用程序也是跑在cache server中吗? 如果是的话studio开发的应用程序(比如web程序)如何跟cache server分开部署呢?

4
0 269
文章 姚 鑫 · 六月 9, 2021 6m read

第二章 从对象写入XML输出

本章介绍如何从InterSystems IRIS对象生成XML输出。

创建XML编写器概述

InterSystems IRIS提供了用于为InterSystems IRIS对象生成XML输出的工具。可以指定XML投影的详细信息,如将对象投影到XML中所述。然后创建一个Writer方法,该方法指定输出的整体结构:字符编码、对象的显示顺序、是否包括处理指令等。

基本要求如下:

  • 如果需要特定对象的输出,则该对象的类定义必须扩展%XML.Adaptor。除了少数例外,该对象引用的类还必须扩展%XML.Adaptor

  • 输出方法必须创建%XML.Writer的实例,然后使用该实例的方法。

下面的终端会话显示了一个简单的示例,在该示例中,我们访问启用了XML的对象并为其生成输出:

/// d ##class(Sample.Person).Populate(100)
/// w ##class(PHA.TEST.Xml).Obj2Xml(1)
ClassMethod Obj2Xml(ID)
{
	s obj = ##class(Sample.Person).%OpenId(ID)
	s xml = ##class(%XML.Writer).%New()
	s xml.Indent=1
	s status = xml.RootObject(obj)
	q ""
}

0
1 236
文章 姚 鑫 · 六月 8, 2021 8m read

第一章 InterSystems XML工具简介

介绍了如何使用 IRIS XML工具。

InterSystems IRIS为XML处理带来了对象的力量--可以使用对象作为XML文档的直接表示,反之亦然。由于InterSystems IRIS包括本机对象数据库,因此可以将此类对象直接用于数据库。此外,InterSystems IRIS提供了用于处理XML文档和(文档对象模型)的工具,即使它们与任何InterSystems IRIS类无关。

用XML表示对象数据

有些InterSystems IRIS 工具主要用于支持的类。要为类启用XML,需要将添加到其超类列表中。类使能够将该类的实例表示为XML文档。可以添加类参数和属性参数来微调投影。

image

对于启用了XML的类,数据可以采用以下所有形式:

  • 包含在类实例中。根据类的不同,还可以将数据保存到磁盘,在磁盘中数据可以像其他持久类一样以所有相同的方式使用。
  • 包含在XML文档中,可以是文件、流或其他文档。
  • 包含在DOM(文档对象模型)中。

下图概述了用于在这些表单之间转换数据的工具:

类使能够创建XML文档。输出目的地通常是文件或流。确定要包括在输出中的对象,系统根据在类定义中建立的规则生成输出。

类使能够将合适的文档导入到类实例中。源通常是文件或流。要使用此类,需要指定类名和文档中包含的元素之间的关联。给定的元素必须具有相应类所需的结构。

0
0 341