文章
· 十二月 17, 2023 阅读大约需 2 分钟

第三十八章 其他特殊主题

第三十八章 其他特殊主题

类和属性参数

  • XMLNAME
  • XMLSEQUENCE
  • XMLUNSWIZZLE
  • XMLPREFIX
  • XMLIGNOREINVALIDTAG
  • XMLIGNOREINVALIDATTRIBUTE

控制元素的关闭

XML 中,仅包含属性的元素可以用以下任一方式表示:

<tag attribute="value" attribute="value" attribute="value"></tag>
<tag attribute="value" attribute="value" attribute="value"/>

IRIS 认为这些形式是等效的。当使用 %XML.Writer 导出对象时,可以控制关闭形式,但不能通过修改 XML 投影本身来控制。

处理具有多个同名标签的文档

XML 中的给定元素可以包含多个具有相同名称的元素;这些元素通过它们的顺序彼此区分。例如,以下是一个合法的 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
   <Person>
      <Name>Able, Andrew</Name>
      <DOB>1977-10-06</DOB>
      <Address>
         <Street>6218 Clinton Drive</Street>
         <City>Reston</City>
         <State>TN</State>
         <Zip>87639</Zip>
      </Address>
      <Address>
         <Street>110 High Street</Street>
         <City>Zanesville</City>
         <State>OR</State>
         <Zip>80719</Zip>
      </Address>
   </Person>
</Root>

将这样的文档映射到 IRIS 类有点棘手,因为每个类属性都必须有唯一的名称。

要将此类文档映射到 IRIS 类,请执行以下操作:

  • 根据需要设置 XMLNAME 属性参数,以将不同的类属性映射到相同的 XML 名称。
  • XMLSEQUENCE 类参数设置为 1。作为预防措施,这可确保映射遵循类定义中列出的属性顺序。
  • 确保类定义中列出的属性的顺序与 XML 文档中的顺序相同。

例如,考虑以下类定义:

Class GXML.TestSequence.Person Extends (%Persistent, %XML.Adaptor)
{

Property Name As %Name [ Required ];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [ Required ];
Property HomeAddress As GXML.TestSequence.Address(XMLNAME = "Address");
Property WorkAddress As GXML.TestSequence.Address(XMLNAME = "Address");

/// If the XMLSEQUENCE = 1, then the order of the XML elements must match the 
/// order of the class properties.  This allows us to deal with XML where the 
/// same field appears multiple times and is distinguished by the order.
Parameter XMLSEQUENCE = 1;

}

该类定义映射到前面显示的 XML 文档。

注意:如果 XMLSEQUENCE1,则忽略 XMLIGNOREINVALIDTAG 参数。

导出后控制 Unswizzling

当使用 IRIS XML 工具导出支持 XML 的持久对象时,系统会像往常一样自动将所有需要的信息混合到内存中;此信息包括对象值属性。导出对象后,IRIS 会取消混合任何对象列表,但不会(默认情况下)取消混合单个对象引用。对于大型对象,这可能会导致 <STORE> 错误。

要使任何单个对象引用在这种情况下不被混淆,请在支持 XML 的类中设置 XMLUNSWIZZLE 参数,如下所示:

Parameter XMLUNSWIZZLE = 1;

该参数的默认值为 0

讨论 (0)1
登录或注册以继续