使用ESQL搜索未知深度的XML节点

时间:2017-04-03 23:27:18

标签: xml ibm-integration-bus extended-sql

假设以下2 xml有效负载

<a>
    <b>
        <c>target value</c>
    </b>
</a>

<a>
    <c>target value</c>
<a>

是否可以使用ESQL检索标记<c>的值,无论其出现的深度如何?我看过似乎建议使用select语句的博客,但没有明确告诉我如何。

2 个答案:

答案 0 :(得分:2)

您必须使用递归算法构建深度搜索。

CREATE FUNCTION NavigateTree(IN root REFERENCE) RETURNS CHAR BEGIN

    DECLARE element REFERENCE TO root;
    MOVE element FIRSTCHILD;

    WHILE LASTMOVE(element) DO

        DECLARE nameField CHARACTER FIELDNAME(element);

        -- Cechar element
        IF nameField = 'c' THEN
            -- Return the Value
            RETURN element;

        ELSE
            IF CheckLeaf(element) IS FALSE THEN
                DECLARE child REFERENCE TO element;
                MOVE child FIRSTCHILD;
                RETURN NavegarArvore(child);
            END IF;

            MOVE element NEXTSIBLING;
        END IF;

    END WHILE;

    RETURN NULL;

END;


CREATE FUNCTION CheckLeaf(IN element REFERENCE) RETURNS BOOLEAN BEGIN

    DECLARE leaf BOOLEAN FALSE;

    DECLARE elemCheck REFERENCE TO element;
    MOVE elemCheck FIRSTCHILD;

    IF LASTMOVE(elemCheck) IS FALSE THEN
        SET leaf = TRUE;
    END IF;

    RETURN leaf;
END;

答案 1 :(得分:0)

'只有'一个选择语句不能用于此目的;它适用于数组,就好像数组中的每个元素都是表中的一行,每个元素中的每个字段都是一个列值。例如 select T1.phone from InputRoot.SomePath.contacts[] as T1;

正如Rafael建议的那样,递归函数是这种情况下的解决方案,但要注意树的可能深度,或者向Rafael代码添加if语句,以便在超出预定义限制时退出搜索路径。