У меня есть сообщение Soap, которое включает в себя различные вложенные узлы в теле Soap. Мне нужно найти узел xyz, но он не всегда находится в одном месте. В мире XSLT я мог бы просто использовать // xyz [1]. Есть ли эквивалентный синтаксис для esql? Что-то вроде OutputRoot.SOAP.Body {неизвестный синтаксис} .xyz [1]
Как найти / указать элемент XML в неизвестной древовидной структуре SOAP в ESQL
Ответы (3)
Я не думаю, что есть какой-либо эквивалент синтаксиса xpath '//' в ESQL. Если вам нужно использовать его для доступа к значению, вы можете использовать узел JavaCompute (см. AssessmentXpath). Или вы можете написать рекурсивную функцию на ESQL, чтобы посещать все узлы и проверять имена. См. Пример в статье CREATE FUNCTION в Инфоцентре.
Как сказал 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;