【问题标题】:Searching for XML node at unknown depth with ESQL使用 ESQL 在未知深度搜索 XML 节点
【发布时间】:2017-07-25 12:17:11
【问题描述】:

假设以下 2 个 xml 有效负载

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

和

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

是否可以使用 ESQL 检索标签 &lt;c&gt; 的值,而不管它出现的深度如何?我看过似乎建议使用 select 声明的博客,但没有一个明确告诉我如何使用。

【问题讨论】:

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


    【解决方案1】:

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

    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;
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        相关资源
        最近更新 更多