第十二章 控制值的转换

文章目录

  • [第十二章 控制值的转换](#第十二章 控制值的转换)
  • 介绍
  • [处理特殊 `XML` 字符](#处理特殊 XML 字符)
        • [文字和 `SOAP` 编码格式的转义形式](#文字和 SOAP 编码格式的转义形式)
  • 示例
  • 防止泄漏的另一种方法

第十二章 控制值的转换

类和属性参数

  • ESCAPE

  • CONTENT

  • XMLTIMEZONE

  • DISPLAYLIST

  • VALUELIST

  • XMLDEFAULTVALUE

  • XMLLISTPARAMETER

  • XMLSTREAMMODE

介绍

支持 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 特殊字符的存在而需要进行的更改之外,不会进行任何更改,如下一节所述。
  • IRIS 导出到 XML 时,它会将二进制流属性转换为采用 Base-64 编码的字符串(也就是说,它以这种方式对数据进行编码,然后将其导出)。当 IRISXML 导入时,它会执行相反的操作。

当使用支持 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

示例

java 复制代码
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 复制代码
<?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 复制代码
<?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"

相关推荐
cwj&xyp7 分钟前
Python(二)str、list、tuple、dict、set
前端·python·算法
dlnu20152506229 分钟前
ssr实现方案
前端·javascript·ssr
古木201914 分钟前
前端面试宝典
前端·面试·职场和发展
dazhong201239 分钟前
PLSQL 客户端连接 Oracle 数据库配置
数据库·oracle
Kisorge39 分钟前
【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
c语言·开发语言
轻口味2 小时前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王2 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发2 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
晓纪同学3 小时前
QT-简单视觉框架代码
开发语言·qt