1

假设以下 2 个 xml 有效负载

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

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

是否可以使用 ESQL 来检索 tag<c>的值,而不管它出现的深度如何?我看过似乎建议使用该select声明的博客,但没有一个明确向我展示如何使用。

4

2 回答 2

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;
于 2017-04-04T17:21:40.403 回答
0

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

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

于 2017-04-15T00:21:38.077 回答