ESQL:从重复的 XML 段中提取唯一元素

问题描述 投票:0回答:2

我面临 ESQL 代码的挑战。我有一条包含重复段的 XML 消息,我需要从该段内的特定元素中提取唯一值。以下是输入 XML 消息,

<MSG>
    <RecurringSegment>
        <Element>val1</Element>
    </RecurringSegment>
    <RecurringSegment>
        <Element>val2</Element>
    </RecurringSegment>
    <RecurringSegment>
        <Element>val1</Element>
    </RecurringSegment>
    <RecurringSegment>
        <Element>val3</Element>
    </RecurringSegment>
    <!-- ... (more recurring segments) ... -->
</MSG>

我编写了以下 ESQL 代码,该代码循环访问重复段,识别特定元素内的唯一值(例如,

<Element>
),并将它们存储在输出变量中。

DECLARE uniqueVals ROW;
DECLARE i INTEGER 1;

FOR obj AS InputRoot.XMLNSC.MSG.RecurringSegment[] DO
    IF (NOT(CONTAINS(uniqueVals, obj.Element))) THEN
        SET uniqueVals.val[i] = obj.Element;
        SET i = i + 1;
    END IF;
END FOR;

但这不起作用;需要 ESQL 代码的帮助才能实现此目的。

messagebroker ibm-integration-bus extended-sql
2个回答
1
投票

CONTAINS 函数 仅适用于字符串数据类型(BIT、BLOB、CHAR),不适用于 ROW。

如果您没有太多唯一值,以下方法效果很好:

DECLARE occurences ROW;
DECLARE i INTEGER 1;

FOR obj AS InputRoot.XMLNSC.MSG.RecurringSegment[] DO
    DECLARE val CHAR obj.Element;
    IF COALESCE(occurences.{val}, 0) = 0 THEN
        SET occurences.{val} = 1;
    ELSE
        SET occurences.{val} = occurences.{val} + 1;
    END IF;
END FOR;

FOR obj AS occurences.*[] DO
    IF FIELDVALUE(obj) > 1 THEN
        CREATE LASTCHILD OF OutputRoot.XMLNSC.Result
               NAME FIELDNAME(obj) VALUE FIELDVALUE(obj);
    END IF;
END FOR;

根据您的输入,将产生以下结果:

<Result>
  <val1>2</val1>
</Result>

这种编程风格对于许多唯一值来说效率不高,因为

occurences.{val}
不像哈希映射那样由 ESQL 实现。


0
投票

要求是找到唯一的值。稍微调整丹尼尔·斯坦曼的答案......

DECLARE uniqueValues ROW;

FOR obj AS InputRoot.XMLNSC.MSG.RecurringSegment[] DO
    DECLARE val CHAR obj.Element;
    IF ( EXISTS(uniqueValues .{val}[]) ) THEN
        CREATE LASTCHILD OF uniqueValues TYPE Name NAME val 
    END IF;
END FOR;

SET OutputRoot.XMLNSC.Result[] = uniqueValues.*[];

无法对此进行测试,因此对于任何逻辑/语法错误,我深表歉意。

© www.soinside.com 2019 - 2024. All rights reserved.