访问消息体中的元素

当您要访问消息的内容以进行读或写时,请使用解析器根据输入位流创建的树中的元素结构和排列。

关于此任务

从树的顶部开始,按照相关的父子关系向下访问,直至到达所需的元素。

  • 如果您引用输入消息树以查询计算节点中的内容,请使用关联名称 InputBody,后跟引用的元素的路径。 InputBody 等价于 InputRoot,后跟解析器名(例如,InputRoot.MRM),如果愿意可以使用它。
  • 如果引用输出消息树以在计算节点中设置或修改其内容,请使用关联名称 OutputRoot,后跟解析器名称(例如,OutputRoot.MRM)。
  • 如果要引用输入消息以在 数据库过滤器 节点中查询其内容,请使用相关名称 Body 来引用消息的开头。 Body 等价于后跟解析器名的 Root(例如,Root.XMLNS),可供选择使用。 不能在 DatabaseInput 节点中使用 Body 相关名称。

    必须使用这些不同的关联名称,因为在 数据库过滤器 节点中只有一条要引用的消息; 不能在这些节点中创建输出消息。 使用计算节点创建输出消息。

当您构造字段引用时,使用的名称必须是符合 ESQL 规则的有效 ESQL 标识。 如果在双引号中包含一个项,ESQL 会将其解释为标识。 如果您在单引号中包含一个项,ESQL 会将它解释为字符文字。 您必须在引号中包含所有字符串(字符串、字节字符串或二进制(位)字符串),如以下示例中所示。 要在字符串内包括单或双引号,包含两个连续的单或双引号。
重要信息: 有关字段引用语法的完整描述,请参阅 ESQL 字段引用概述
有关 ESQL 数据类型的更多信息,请参阅 消息流中的 ESQL 数据类型

假定您已创建用于处理消息发票的消息流,如 编写 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
    );

如果要查询或设置包含或可能包含空值的元素,请注意以下事项:

查询空值
当您将元素与 ESQL 关键字 NULL 相比较时,这测试在由解析器从输入消息创建的逻辑树中是否存在元素。

例如,您可以检查发票号码是否包含在当前 Invoice 消息中,并附带以下语句:

IF InputRoot.XMLNS.Invoice.InvoiceNo IS NULL THEN
   DO;
     -- more ESQL --
END IF;   

您还可以使用 ESQL 引用,如以下示例所示:

DECLARE cursor REFERENCE TO InputRoot.MRM.InvoiceNo;

IF LASTMOVE(cursor) = FALSE THEN 
   SET OutputRoot.MRM.Analysis = 'InvoiceNo does not exist in logical tree';
ELSEIF FIELDVALUE(cursor) IS NULL THEN
   SET OutputRoot.MRM.Analysis = 
       'InvoiceNo does exist in logical tree but is defined as an MRM NULL value';
ELSE
   SET OutputRoot.MRM.Analysis = 'InvoiceNo does exist and has a value';
END IF;

有关声明和使用引用的更多信息,请参阅 创建动态字段引用。 有关 LASTMOVE 和 FIELDVALUE 函数的描述,请参阅 LASTMOVE 函数FIELDTYPE 函数

如果消息在 MRM 域中,查询取决于物理格式的空元素还有其他注意事项。 有关更多详细信息,请参阅 在 MRM 域中查询消息中的空值

设置空值
您可以使用两个语句来设置 null 值:
  1. 如果您使用以下语句将元素设置为 NULL,元素将从消息树中删除:
    SET OutputRoot.XMLNS.Invoice.Customer.Title = NULL;  

    如果消息在 MRM 域中,取决于物理格式的空值还有其他注意事项。 有关更多详细信息,请参阅 在 MRM 域中设置消息中的空值

    此技术被称为隐式空处理。

  2. 如果您按如下所示将元素的值设置为 NULL:
    SET OutputRoot.XMLNS.Invoice.Customer.Title VALUE = NULL;  
    将不会从消息树删除元素。 而是给元素指定一个特殊的 NULL 值。
    SET OutputRoot.XMLNS.Invoice.Customer.Title = NULL;  

    如果消息在 MRM 域中,输出位流的内容将取决于物理格式空处理属性的设置。 有关更多详细信息,请参阅 在 MRM 域中设置消息中的空值

    此技术被称为显式空处理。

如果您将 MRM 复杂元素或 XML、XMLNS 或 JMS 父代元素设置为 NULL,而没有使用 VALUE 关键字,将从逻辑树删除该元素和它的所有子代。