Dataweave 2.0 — Как получить значение XML-элементов на основе имени атрибута

#xml #dataweave #mule4

#xml #dataweave #mule4

Вопрос:

Я пытаюсь понять, как извлечь значение XML-элемента из повторяющегося списка элементов с тем же именем, но с разными именами атрибутов.

В этом случае, как бы вы извлекли значение элемента ( 'ABC' ) для элемента с именем атрибута 'xxx.UDFCHAR10' в DataWeave 2.0?

 <root>
   <UserArea>
      <PropertyList>
         <Property>
            <NameValue name="xxx.CreatedBy">Test 1</NameValue>
         </Property>
         <Property>
            <NameValue name="xxx.EnteredBy">Test 2</NameValue>
         </Property>
         <Property>
            <NameValue name="xxx.SafetyFlag">false</NameValue>
         </Property>
         <Property>
            <NameValue name="xxx.DependFlag">true</NameValue>
         </Property>
         <Property>
            <NameValue name="xxx.UDFCHAR10">ABC</NameValue>
         </Property>
      </PropertyList>
   </UserArea>
</root>
 

Спасибо

Ответ №1:

Используйте многозначный селектор, чтобы получить все повторяющиеся экземпляры в массив, затем вы можете фильтровать по значению атрибута, используя селектор атрибутов для элемента, который имеет его. Этот метод вернет массив извлеченных значений, однако, если вы знаете, что будет только один элемент, вы можете извлечь его по индексу [0] .

Обратите внимание, что ваше описание не совсем точное, поскольку атрибут находится в подэлементе повторяющегося элемента.

 %dw 2.0
output application/java
---
(payload.root.UserArea.PropertyList.*Property 
    filter ($.NameValue.@name == "xxx.UDFCHAR10")).NameValue
 

Вывод:

 [
  "ABC"
]
 

Ответ №2:

Используйте мультиселектор, чтобы получить все объекты свойств, затем создайте ArrayList, выбрав NameValue . Затем используйте firstWith для захвата первой строки, которая соответствует предоставленным критериям

 %dw 2.0
output application/json
import firstWith from dw::core::Arrays
var data = read("<root>
   <UserArea>
      <PropertyList>
         <Property>
            <NameValue name='xxx.CreatedBy'>Test 1</NameValue>
         </Property>
         <Property>
            <NameValue name='xxx.EnteredBy'>Test 2</NameValue>
         </Property>
         <Property>
            <NameValue name='xxx.SafetyFlag'>false</NameValue>
         </Property>
         <Property>
            <NameValue name='xxx.DependFlag'>true</NameValue>
         </Property>
         <Property>
            <NameValue name='xxx.UDFCHAR10'>ABC</NameValue>
         </Property>
      </PropertyList>
   </UserArea>
</root>","application/xml")
---
payload.root.UserArea.PropertyList.*Property.NameValue firstWith ((object) -> object.@name == "xxx.UDFCHAR10")
 

вывод:

 "ABC"