第十二章 控制值的转换

2023-11-21  本文已影响0人  Cache技术分享

第十二章 控制值的转换

类和属性参数

介绍

支持 XML 的对象通常包括由 IRIS 数据类型定义的属性。每个数据类型类都定义 LogicalToXSD()XSDToLogical() 方法。每当为对象请求 XML 输出时, IRIS XML 工具都会自动为每个属性调用 LogicalToXSD() 方法,以将数据转换为在 XML 中使用的适当格式。同样,每当使用 XML 文档作为输入时,IRIS XML 工具都会调用 XSDToLogical() 方法将数据转换为 IRIS 的正确格式。

例如,数据类型类的 %Binary 中,LogicalToXSD() 方法使用 $SYSTEM.Encryption.Base64Encode() 方法转换出站值。同样,XSDToLogical() 方法使用 $SYSTEM.Encryption.Base64Decode() 方法转换入站值。

IRIS 类还可以包含流值属性,但流类不定义 LogicalToXSD()XSDToLogical() 方法。相反,当流类用作支持 XML 的类的属性时,XML 工具会特别对待它们。具体来说:

当使用支持 XML 的对象时,有时需要考虑无法直映射影到 XML 的值或由于其他原因想要转换的值的特殊情况。

处理特殊 XML 字符

根据上下文,当 IRIS XML 支持在字符串或字符流类型的属性中找到与符号 (&) 和某些其他字符时,它会转义这些字符。

注意:ESCAPE 属性参数控制哪些字符被识别为特殊字符。此参数是“XML”(默认值)或“HTML”(文档中未讨论)。

对于这些特殊字符,可以通过设置 CONTENT 属性参数来控制转义的执行方式。文字格式和编码格式的详细信息有所不同,如下所示:

文字和 SOAP 编码格式的转义形式

Value of CONTENT (Case-insensitive) |XML Document in Literal
Format| XML Document in SOAP-encoded Format
---|---|---
"STRING" (the default) |CData |CData
"ESCAPE"| XML entity |XML entity
"ESCAPE-C14N| XML entity* |XML entity*
"MIXED" |No escaping is done| CData

*对于“ESCAPE-C14N”,转义是根据XML规范化标准完成的。主要区别在于回车符被转义为 &#13

示例

Class ResearchXForms.CONTENT Extends (%RegisteredObject, %XML.Adaptor)
{

Parameter XMLNAME = "Demo";

Property String1 As %String;

Property String2 As %String(CONTENT = "STRING");

Property String3 As %String(CONTENT = "ESCAPE");

Property String4 As %String(CONTENT = "MIXED");

}

String2String1 始终以相同的方式处理,因为 String2 使用 CONTENT 的默认值。

此类的文字 XML 输出可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Demo>
  <String1><![CDATA[value 1 & value 2]]></String1>
  <String2><![CDATA[value 1 & value 2]]></String2>
  <String3>value 1 &amp; value 2</String3>
  <String4>value 1 & value 2</String4>
</Demo>

SOAP 编码的 XML 输出将如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<CONTENT xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <String1><![CDATA[value 1 & value 2]]></String1>
  <String2><![CDATA[value 1 & value 2]]></String2>
  <String3>value 1 &amp; value 2</String3>
  <String4><![CDATA[value 1 & value 2]]></String4>
</CONTENT>

防止泄漏的另一种方法

还有另一种方法可以防止特殊 XML 字符的转义。可以将该属性定义为特殊 XML 类型之一:%XML.String%XML.FileCharacterStream%XML.GlobalCharacterStream。对于这些数据类型类,CONTENT“MIXED”

上一篇 下一篇

猜你喜欢

热点阅读