2017-04-03 51 views
0

假設以下2個XML負載在未知深度搜索XML節點與ESQL

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

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

是否有可能使用ESQL來檢索標籤<c>的價值,無論深度它出現在?我見過似乎建議使用select陳述這樣做的博客,但沒有一篇明確告訴我如何。

回答

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; 
0

'Only'select語句不適用於此目的;它對數組起作用,就像數組中的每個元素都是表中的一行一樣,每個元素內的每個字段都是一個列值。例如 select T1.phone from InputRoot.SomePath.contacts[] as T1;

拉斐爾建議,遞歸函數是在這種情況下,解決方案,但小心你的樹的可能的深度或外接if語句來拉斐爾代碼退出搜索一個路徑,如果它超過預定限制。