%dw 2.0
output application/xml
---
payload.language
Select XML Elements
DataWeave provides a number of selectors for traversing the structure of input data and returning matching values. The following examples use a single-value DataWeave selector (.
) to extract data from XML elements.
Before you begin, note that 2.x versions of DataWeave are used by Mule 4 apps. For DataWeave in Mule 3 apps, refer to DataWeave version 1.2 examples. For other DataWeave versions, you can use the version selector in the DataWeave table of contents.
The XML markup language requires a single root element. In the following example, the selector on the root (language
) is able to extract the child element because the child has no siblings.
<language>
<name>DataWeave</name>
</language>
<?xml version='1.0' encoding='UTF-8'?>
<name>DataWeave</name>
To return all subelements of the root element in a valid XML structure with a single root, the following script uses a DataWeave key to specify a new element name (myroot
) and selects the root (root
) to return its value. A script that fails to return a single XML root produces the following error: Trying to output non-whitespace characters outside main element tree (in prolog or epilog)…
.
%dw 2.0
output application/xml
---
{ myroot: payload.root }
<root>
<element>
<subelement1>SE1</subelement1>
</element>
<element>E2</element>
</root>
<?xml version='1.0' encoding='UTF-8'?>
<myroot>
<element>
<subelement1>SE1</subelement1>
</element>
<element>E2</element>
</myroot>
The following example uses the name of the child element (name
) with the single-value selector to select its value. Notice how payload.language.name
navigates to the child element. The script also provides a root element for the value so that DataWeave can construct valid XML.
%dw 2.0
output application/xml
---
{ newname : payload.language.name }
<language>
<name>DataWeave</name>
<version>2.0</version>
</language>
<?xml version='1.0' encoding='UTF-8'?>
<newname>DataWeave</newname>
The following example uses an index to return the value of the second child element from the input XML. Notice that DataWeave treats child elements as indices of an array, so it can select the second child by using the index language[1]
. The result is a single XML element.
%dw 2.0
output application/xml
---
{ version : payload.language[1] }
<language>
<name>DataWeave</name>
<version>2.0</version>
</language>
<?xml version='1.0' encoding='UTF-8'?>
<version>2.0</version>
If multiple child elements of the input have the same name, use the index to select the value of the child. The following example selects a subelement of a child element.
%dw 2.0
output application/xml
---
{ mysubelement : payload.root[0].subelement1 }
<root>
<element>
<subelement1>SE1</subelement1>
</element>
<element>E2</element>
</root>
<?xml version='1.0' encoding='UTF-8'?>
<mysubelement>SE1</mysubelement>