访问消息体中的元素
当您要访问消息的内容以进行读或写时,请使用解析器根据输入位流创建的树中的元素结构和排列。
关于此任务
从树的顶部开始,按照相关的父子关系向下访问,直至到达所需的元素。
- 如果您引用输入消息树以查询计算节点中的内容,请使用关联名称
InputBody,后跟引用的元素的路径。InputBody等价于InputRoot,后跟解析器名(例如,InputRoot.MRM),如果愿意可以使用它。 - 如果引用输出消息树以在计算节点中设置或修改其内容,请使用关联名称
OutputRoot,后跟解析器名称(例如,OutputRoot.MRM)。 - 如果要引用输入消息以在 数据库 或 过滤器 节点中查询其内容,请使用相关名称
Body来引用消息的开头。Body等价于后跟解析器名的Root(例如,Root.XMLNS),可供选择使用。 不能在 DatabaseInput 节点中使用Body相关名称。必须使用这些不同的关联名称,因为在 数据库 或 过滤器 节点中只有一条要引用的消息; 不能在这些节点中创建输出消息。 使用计算节点创建输出消息。
假定您已创建用于处理消息发票的消息流,如 编写 ESQL中的图所示。 例如,如果要从 Compute 节点中查询元素 CardType ,请使用以下语句:
IF InputBody.Invoice.Payment.CardType='Visa' THEN
DO;
-- more ESQL --
END IF; 如果要在 数据库 或 过滤器 节点 (其中引用的是单个输入消息) 中进行相同的测试,请执行以下代码:
IF Body.Invoice.Payment.CardType='Visa' THEN
DO;
-- more ESQL --
END IF; 如果要将元素从输入 XML 消息复制到计算节点中的输出消息而不进行更改,请使用以下 ESQL:
SET OutputRoot.XMLNS.Invoice.Customer.FirstName =
InputBody.Invoice.Customer.FirstName;如果您要将元素从输入 XML 消息复制到输出消息并对其进行更新,例如转换为大写或计算新值,代码将如下:
SET OutputRoot.XMLNS.Invoice.Customer.FirstName =
UPPER(InputBody.Invoice.Customer.FirstName);
SET OutputRoot.XMLNS.Invoice.InvoiceNo = InputBody.Invoice.InvoiceNo + 1000; 如果您要将 STRING 元素设置为常量值,代码将如下:
SET OutputRoot.XMLNS.Invoice.Customer.Title = 'Mr'; 您还可以使用等价的语句:
SET OutputRoot.XMLNS.Invoice.Customer.Title VALUE = 'Mr'; 如果要使用值 26更新 INTEGER 或 DECIMAL (例如,元素 TillNumber) ,请使用以下赋值 (仅在 Compute 节点中有效):
SET OutputRoot.MRM.Invoice.TillNumber=26;
整数数据类型使用 64 位二进制补码格式存储数字,允许的数字范围从 -9223372036854775808 到 9223372036854775807。 您可以为整数指定十六进制符号和常规整数字面值格式。 可以用大写或小写书写十六进制字母 A 到 F,也可以在初始的零后跟 X,这是必需的。 以下示例产生与前述示例相同的结果:
SET OutputRoot.MRM.Invoice.TillNumber= 0x1A;
以下示例显示了未显示在 示例消息中的元素类型的 SET 语句。
要将浮点型元素设置为非整数值,代码将如下:
SET OutputRoot.MRM.FloatElement1 = 1.2345e2;
要将二进制元素设置为常量值,代码将如下:
SET OutputRoot.MRM.BinaryElement1 = X'F1F1';
对于 BINARY 值,您必须使用初始的字符 X(大写或小写),并在单引号中包含十六进制字符(同样用大写或小写),如下所示。
要将布尔值元素设置为常量值(值 1 等于 true,值 0 等于 false),代码将如下:
SET OutputRoot.MRM.BooleanElement1 = true;
或者
SET OutputRoot.MRM.BooleanElement1 = 1;
您可以使用 SELECT 语句过滤来自输入消息的记录,而无须重新格式化记录,并且不需要每个记录的完整格式的任何知识。 请参阅以下示例:
-- Declare local variable
DECLARE CurrentCustomer CHAR 'Smith';
-- Loop through the input message
SET OutputRoot.XMLNS.Invoice[] =
(SELECT I FROM InputRoot.XMLNS.Invoice[] AS I
WHERE I.Customer.LastName = CurrentCustomer
);
如果符合 WHERE 条件(LastName = Smith),此代码将输入消息的所有记录写入输出消息。 所有不符合条件的记录都不会从输入消息复制到输出消息。 I 用作关联名 InputRoot.XMLNS.Invoice[] 的别名。
在 DECLARE 语句上初始化声明的变量 CurrentCustomer:此选项是声明已知初始值的变量的最有效的方法。
可将该别名技术与其他 SELECT 结合使用。 例如,如果您要选择输入消息的所有记录,并创建其他记录:
-- Loop through the input message
SET OutputRoot.XMLNS.Invoice[] =
(SELECT I, 'Customer' || I.Customer.LastName AS ExtraField
FROM InputRoot.XMLNS.Invoice[] AS I
);
您还可以包含 AS 子句将记录放到消息树中的子文件夹中:
-- Loop through the input message
SET OutputRoot.XMLNS.Invoice[] =
(SELECT I AS Order
FROM InputRoot.XMLNS.Invoice[] AS I
);
如果要查询或设置包含或可能包含空值的元素,请注意以下事项: