Как найти / Справочник XML-элемент в неизвестной структуре дерева мыла в ESQL
-
21-12-2019 - |
Вопрос
У меня есть сообщение SOAP, которое включает в себя различные вложенные узлы в корпусе мыла.Мне нужно найти узел «XYZ», но он не всегда в том же месте.В мире XSLT я мог бы просто использовать // xyz [1].Есть ли эквивалентный синтаксис для ESQL?Что-то вроде ходстваRoot.soap.body {неизвестный синтаксис} .xyz [1]
Решение
Я не думаю, что есть какой-либо эквивалент синтаксиса XPath '//' в ESQL.Если вам нужно это использовать его для доступа к значению, вы можете использовать узел Javacompute (см. EvauglexPath).Или вы можете написать рекурсивную функцию в ESQL для посещения всех узлов и проверить имена.См. Статью создания функциональной статьи в Infocenter для примера.
Другие советы
Как сказал TJA, вы можете просто использовать анонимные ссылки, такие как это:
InputRoot.SOAP.Body.*[1].sender
. Если он всегда на том же уровне иерархически, вы можете использовать анонимные ссылки.
Я использовал следующий код, чтобы получить в значениях XYZ в XML.
-- Walk all the second level aggregates looking for any that contain the Xyz tag
DECLARE AnonRef REFERENCE TO InputRoot.XMLNSC.*:HasAggregatesWithXyz.*:*[1];
WHILE(LASTMOVE(AnonRef)) DO
DECLARE XyzRef REFERENCE TO AnonRef.*:Xyz[1];
IF(LASTMOVE(XyzRef)) THEN
-- Do something with the value of Xyz
DECLARE CharVal CHAR FIELDVALUE(XyzRef);
END IF;
MOVE AnonRef NEXTSIBLING;
END WHILE;
<HasAggregatesWithXyz>
<Agg1><NotXyz>NotNot</NotXyz></Agg1>
<Agg2><Xyz>XyzValue1</Xyz></Agg2>
<Agg3><NotXyz>NotNot</NotXyz></Agg3>
<Agg4><Xyz>XyzValue2</Xyz></Agg4>
</HasAggregatesWithXyz>
.
Примечание. В зависимости от параметров анализа XMLNSC вы выбираете, в частности, что угодно с сохранением пробела, вы можете сделать вашу ссылку более конкретно.Для этого вы можете использовать типы следующим образом.
DECLARE AnonRef REFERENCE TO InputRoot.XMLNSC.*:HasAggregatesWithXyz.(XMLNSC.Folder)*:*[1];
....
MOVE AnonRef NEXTSIBLING REPEAT TYPE;
.