假設以下2個XML負載在未知深度搜索XML節點與ESQL
<a>
<b>
<c>target value</c>
</b>
</a>
和
<a>
<c>target value</c>
<a>
是否有可能使用ESQL來檢索標籤<c>
的價值,無論深度它出現在?我見過似乎建議使用select
陳述這樣做的博客,但沒有一篇明確告訴我如何。
假設以下2個XML負載在未知深度搜索XML節點與ESQL
<a>
<b>
<c>target value</c>
</b>
</a>
和
<a>
<c>target value</c>
<a>
是否有可能使用ESQL來檢索標籤<c>
的價值,無論深度它出現在?我見過似乎建議使用select
陳述這樣做的博客,但沒有一篇明確告訴我如何。
您必須使用遞歸算法構建深度搜索。
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;
'Only'select語句不適用於此目的;它對數組起作用,就像數組中的每個元素都是表中的一行一樣,每個元素內的每個字段都是一個列值。例如 select T1.phone from InputRoot.SomePath.contacts[] as T1;
拉斐爾建議,遞歸函數是在這種情況下,解決方案,但小心你的樹的可能的深度或外接if語句來拉斐爾代碼退出搜索一個路徑,如果它超過預定限制。