---
schema_version: "1"
id: 46081f427fbdfdc93415d7106a564a9c0dbc04daa761db137ae24be81dadfe3e
title: XML Format
collection: mulesoft
version: current
locale: en-us
portal_url: https://docs.salesforce.com/mulesoft/current/en-us/dataweave/2.3/dataweave-formats-xml.md
canonical_url: https://docs.mulesoft.com/dataweave/2.3/dataweave-formats-xml
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 3ce65b44de52e20f5a3a528235ee5c00ddd0753cbc5b1feadf7b6c925c0f10ae
description: MuleSoft Documentation Site
release: "2.3"
latest: false
---
---
product: DataWeave
version: 2.3
---

# XML Format

> For the full documentation index, see: https://docs.mulesoft.com/llms.txt

MIME Type: `application/xml`

ID: `xml`

The XML data structure is mapped to DataWeave objects that can contain other objects, strings, or
`null` values. XML uses unbounded elements to represent collections, which are mapped to repeated
keys in DataWeave objects. In addition, DataWeave natively supports `namespaces`, `CData` an
`xsi:types`.

The DataWeave reader for XML input supports the following parsing strategies:

- Indexed

- In-Memory

- Streaming

To understand the parsing strategies that DataWeave readers and writers can apply to this format,
see [DataWeave Parsing Strategies](https://docs.mulesoft.com/dataweave/2.3/dataweave-formats#dw_readers_writers).

## CData Custom Type

`CData` is a custom DataWeave data type for XML that is used to identify a Character DATA (CDATA)
block. The `CData` type tells the XML writer to wrap content inside a `CDATA` block or to check for
an input string inside a `CDATA` block. In DataWeave, `CData` inherits from the type `String`.

## Examples

The following examples show uses of the XML format.

- [Example: Stream Input XML Data](#example1)

- [Example: Null or Empty String in XML](#example2)

- [Example: Output `null` Values for Missing XML Values](#example3)

- [Example: Output `null` Values for Missing XML Values](#example4)

- [Example: Represent XML Attributes in the DataWeave (dw) Format](#example5)

- [Example: Represent XML Namespaces in the DataWeave (dw) Format](#example6)

- [Example: Create a CDATA Element](#example7)

- [Example: Check for CDATA in a `String`](#example8)

- [Example: Use the `inlineCloseOn` Writer Property](#example9)

- [Example: Transforms Repeated JSON Keys to Repeated XML Elements](#example10)

- [Example: Transform XML elements into JSON format and replace characters](#example11)

### Example: Stream Input XML Data

This example shows how to set up XML streaming, which requires you to specify the following reader
properties:

- `streaming=true`

- `collectionPath="root.repeated"`

The `collectionPath` setting selects the elements to stream.

When streaming, the XML parser can start processing content without having all the XML content.

#### Input

The following XML serves as the input payload to the DataWeave source. Assume that it is the content
of an XML file `myXML.xml`.

myXML.xml

```xml
<root>
    <text>
        Text
    </text>
    <repeated>
        <user>
            <name>Mariano</name>
            <lastName>de Achaval</lastName>
            <age>36</age>
        </user>
        <user>
            <lastName>Shokida</lastName>
            <name>Leandro</name>
            <age>30</age>
        </user>
        <user>
            <age>29</age>
            <name>Ana</name>
            <lastName>Felissati</lastName>

        </user>
        <user>
            <age>29</age>
            <lastName>Chibana</lastName>
            <name>Christian</name>
        </user>

    </repeated>
</root>
```

#### Source

The reader property settings in the DataWeave script tell the XML reader to stream the input and
process the repeated keys. The script uses the DataWeave `map` function to iterate over the repeated
keys.

```dataweave
%dw 2.0
var myInput  readUrl('classpath://myXML.xml', 'application/xml', {streaming:true, collectionPath: "root.repeated"})
output application/dw
---
myInput.root.repeated.*user map {
    n: $.name,
    l: $.lastName,
    a: $.age
}
```

#### Output

The script transforms the mapped input XML to the DataWeave (dw) format and MIME type.

```json
[
  {
    "n": "Mariano",
    "l": "de Achaval",
    "a": "36"
  },
  {
    "n": "Leandro",
    "l": "Shokida",
    "a": "30"
  },
  {
    "n": "Ana",
    "l": "Felissati",
    "a": "29"
  },
  {
    "n": "Christian",
    "l": "Chibana",
    "a": "29"
  }
]
```

### Example: Null or Empty String in XML

Because there is no standard way to represent a `null` value in XML, the reader maps the value to
`null` when the `nil` attribute is set to `true`.

#### Input

The following XML serves as the input payload to the DataWeave source. Notice the `nil` setting in
`<xsi:nil="true"`/>.

```xml
<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <author xsi:nil="true"/>
</book>
```

#### Source

The DataWeave script transforms the input XML to the JSON format and MIME type.

```dataweave
%dw 2.0
output application/json
---
payload
```

#### Output

The output is in the JSON format. Notice that the `nil` value in the input is transformed to `null`.

```json
{
  "book": {
    "author": null
  }
}
```

### Example: Output `null` Values for Missing XML Values

The XML reader property `nullValueOn` accepts the value `blank` (the default) or `empty`.

This example uses the `nullValueOn` default, so it maps the values of the `title` and `author`
elements to `null`.

#### Input

The following XML serves as input to the DataWeave source. Notice that the `title` and `author`
elements lack values.

Assume that this input is content within the file, `myInput.xml`.

myXML.xml content:

```xml
<book>
    <author></author>
    <title>

</title>
</book>
```

#### Source

The DataWeave script transforms the XML input to JSON. Note that it explicitly sets the
`nullValueOn` default, `blank`, for demonstration purposes.

```dataweave
%dw 2.0
var myInput readUrl('classpath://myXML.xml', 'application/xml', {nullValueOn: "blank"})
output application/json
---
myInput
```

#### Output

The `title` and `author` keys in the JSON output are assigned `null` values.

```json
{
  "book": {
    "author": null,
    "title": null
  }
}
```

### Example: Output `null` Values for Missing XML Values

The XML reader property `nullValueOn` accepts the value `blank` (the default) or `empty`.

The example maps the value of the `title` element to a `String` and value of the `author` element to
`null` because the XML reader property `nullValueOn` is set to `empty`.

#### Input

The following XML serves as input to the DataWeave source. Notice that the `title` and `author`
elements lack values. The difference between the two elements is the space between the starting and
ending tags. The tags of the `title` element are separated by line breaks (the hidden characters,
`\n`), while the tags of the `author` element are not separated by any characters.

Assume that this input is content within the file, `myInput.xml`.

myXML.xml content:

```xml
<book>
    <author></author>
    <title>

</title>
</book>
```

#### Source

The DataWeave script uses a DataWeave variable to input the content of `myXML.xml` and applies the
`nullValueOn: "empty"` to it. The script transforms the XML input to JSON.

```dataweave
%dw 2.0
var myInput readUrl('classpath://myXML.xml', 'application/xml', {nullValueOn: "empty"})
output application/json
---
myInput
```

#### Output

The JSON output maps the value of the `author` element to `null` and value of the `title` element to
the `String` value `"\n\n"`, which is for the new line characters.

```json
{
  "book": {
    "author": null,
    "title": "\n\n"
  }
}
```

### Example: Represent XML Attributes in the DataWeave (dw) Format

This example maps XML attributes to a canonical DataWeave representation, the `application/dw`
format and MIME type.

#### Input

The XML serves as the input payload to the DataWeave source. Notice that the input contains XML
attributes.

```xml
<users>
  <company>MuleSoft</company>
  <user name="Leandro" lastName="Shokida"/>
  <user name="Mariano" lastName="Achaval"/>
</users>
```

#### Source

The DataWeave script transforms the XML input payload to the DataWeave (dw) format and MIME type.

```dataweave
%dw 2.0
output application/dw
---
payload
```

#### Output

The output shows how the DataWeave (dw) format represents the XML input. Notice how the attributes
from the XML input and the empty values are represented.

```dataweave
{
  users: {
    company: "MuleSoft",
    user @(name: "Leandro",lastName: "Shokida"): "",
    user @(name: "Mariano",lastName: "Achaval"): ""
  }
}
```

### Example: Represent XML Namespaces in the DataWeave (dw) Format

This example maps XML namespaces to a canonical DataWeave representation, the `application/dw`
format and MIME type.

#### Input

The XML serves as the input payload to the DataWeave source. Notice that the input contains XML
namespaces.

```xml
<root>
    <h:table xmlns:h="http://www.w3.org/TR/html4/">
      <h:tr>
        <h:td>Apples</h:td>
        <h:td>Bananas</h:td>
      </h:tr>
    </h:table>

    <f:table xmlns:f="https://www.w3schools.com/furniture">
      <f:name>African Coffee Table</f:name>
      <f:width>80</f:width>
      <f:length>120</f:length>
    </f:table>
</root>
```

#### Source

The DataWeave script transforms the XML input payload to the DataWeave (dw) format and MIME type.

```dataweave
%dw 2.0
output application/dw
---
payload
```

#### Output

The output shows how the DataWeave (dw) format represents the XML input. Notice how the namespaces
from the XML are represented.

```dataweave
ns h http://www.w3.org/TR/html4/
ns f https://www.w3schools.com/furniture
---
{
  root: {
      h#table: {
        h#tr: {
          h#td: "Apples",
          h#td: "Bananas"
        }
      },
      f#table: {
        f#name: "African Coffee Table",
        f#width: "80",
        f#length: "120"
      }
  }
}
```

### Example: Create a CDATA Element

This example shows how to use the `CData` type to create a CDATA element in the XML output.

#### Source

The body of the DataWeave script coerces the `String` value to the `CData` type.

```dataweave
%dw 2.0
output application/xml
---
{
    test: "A text <a>" as CData
}
```

#### Output

The output encloses the input `String` value in a CDATA block, which contains the special
characters, `<` and `>`, from the input.

```xml
<?xml version='1.0' encoding='UTF-8'?>
<test><![CDATA[A text <a>]]></test>
```

### Example: Check for CDATA in a `String`

This example indicates whether a given `String` value is CDATA.

#### Input

The XML serves as the input payload to the DataWeave source. Notice that the `test` element contains
a CDATA block.

```xml
<?xml version='1.0' encoding='UTF-8'?>
<test><![CDATA[A text <a>]]></test>
```

#### Source

The DataWeave script uses the `is CData` expression to determine whether the `String` value is
CDATA.

```dataweave
%dw 2.0
output application/json
---
{
    test: payload.test is CDATA
}
```

#### Output

The JSON output contains the value `true`, which indicates tha the input `String` value is CDATA.

```json
{
  "test": true
}
```

### Example: Use the `inlineCloseOn` Writer Property

This example uses the `inlineCloseOn` writer property with the value `none` to act on the key-value
pairs from the input.

#### Source

The DataWeave script transforms the body content to XML. Notice that values of the `emptyElement`
keys are `null`.

```dataweave
%dw 2.0s
output application/xml inlineCloseOn="none"
---
{
  someXml: {
    parentElement: {
      emptyElement1: null,
      emptyElement2: null,
      emptyElement3: null
    }
  }
}
```

#### Output

The `emptyElement` elements are empty. They do not contain the value `null`.

```xml
<?xml version='1.0' encoding='UTF-8'?>
<someXml>
  <parentElement>
    <emptyElement1></emptyElement1>
    <emptyElement2></emptyElement2>
    <emptyElement3></emptyElement3>
  </parentElement>
</someXml>
```

### Example: Transforms Repeated JSON Keys to Repeated XML Elements

XML encodes collections using repeated (unbounded) elements. DataWeave represents unbounded elements
by repeating the same key.

This example shows how to convert the repeated keys in a JSON array of objects into repeated XML
elements.

#### Input

The JSON input serves as the payload to the DataWeave source. Notice that the `name` keys in the
array are repeated.

```json
{
  "friends": [{ "name": "Mariano" }, { "name": "Shoki" }, { "name": "Tomo" }, { "name": "Ana" }]
}
```

#### Source

The DataWeave script selects the value of the `friends` key.

```dataweave
%dw 2.0
output application/xml
---
friends: {
    (payload.friends)
}
```

#### Output

The output represents the `name` keys as XML elements.

```xml
<?xml version='1.0' encoding='UTF-8'?>
<friends>
  <name>Mariano</name>
  <name>Shoki</name>
  <name>Tomo</name>
  <name>Ana</name>
</friends>
```

See also,
[Example: Outputting Self-closing XML Tags](https://docs.mulesoft.com/dataweave/2.3/dataweave-cookbook-output-self-closing-xml-tags).

### Example: Transform XML elements into JSON format and replace characters

This example iterates over an XML file that contains details of employees such as the `Id`, `Name`,
and `Address`, and converts the file into JSON format. The DataWeave script uses the `replace`
function to iterate over each `Address` element and replace the characters `-` and `/` with blank
space.

#### Input

The XML input serves as the payload to the DataWeave source. Notice that the `Address` element
contains `-` and `/` characters.

```xml
<?xml version='1.0' encoding='UTF-8'?>
<root>
<employees>
<Id>1</Id>
<Name>Mule</Name>
<Address>MuleSoft Avenue - 123</Address>
</employees>
<employees>
<Id>2</Id>
<Name>Max</Name>
<Address>MuleSoft Avenue-456/5/e</Address>
</employees>
</root>
```

#### Source

The following DataWeave script iterates over the payload elements and performs a mapping to an
object. The instruction `payload01.Address replace /([\-\,\/])/ with " "` replaces the `-` and `/`
characters with blank spaces.

```dataweave
%dw 2.0
output application/json
---
payload.root.*employees map ((payload01 , indexOfPayload01) ->
{ Id: payload01.Id as String, Name: payload01.Name as String, Address: payload01.Address replace /([\-\,\/])/ with " " }
)
```

#### Output

The output represents the transformed XML elements into JSON.

```JSON
[
  {
    "Id": "1",
    "Name": "Mule",
    "Address": "MuleSoft Avenue   123"
  },
  {
    "Id": "2",
    "Name": "Max",
    "Address": "MuleSoft Avenue 456 5 e"
  }
]
```

## Configuration Properties

DataWeave supports the following configuration properties for the XML format.

### Reader Properties

The XML format accepts properties that provide instructions for reading input data.

<table><colgroup><col> <col> <col> <col></colgroup><thead><tr><th>Parameter</th><th>Type</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><p><code>collectionPath</code></p></td><td><p><code>String</code></p></td><td><p><code>null</code></p></td><td><div><div><p>Path to the document where the collection is located. It specifies a path expression that identifies the location of the elements to stream. See <a href="#example1">Example: Stream Input XML Data</a>.</p></div></div></td></tr><tr><td><p><code>externalEntities</code></p></td><td><p><code>Boolean</code></p></td><td><p><code>false</code></p></td><td><div><div><p>Indicates whether external entities should be processed or not. By default this is disabled to avoid XXE attacks. Valid values are <code>true</code> or <code>false</code>.</p></div></div></td></tr><tr><td><p><code>indexedReader</code></p></td><td><p><code>Boolean</code></p></td><td><p><code>true</code></p></td><td><div><div><p>DataWeave uses the indexed reader by default when reaching the threshold. Supports US-ASCII, UTF-8 and ISO-8859-1 encodings only. For other encodings and when set to <code>false</code>, DataWeave uses the in-memory reader. Valid values are <code>true</code> or <code>false</code>.</p></div></div></td></tr><tr><td><p><code>maxAttributeSize</code></p></td><td><p><code>Number</code></p></td><td><p><code>-1</code></p></td><td><div><div><p>Sets the maximum number of characters accepted in an XML attribute. Available since Mule 4.2.1.</p></div></div></td></tr><tr><td><p><code>maxEntityCount</code></p></td><td><p><code>Number</code></p></td><td><p><code>1</code></p></td><td><div><div><p>The maximum number of entity expansions. The limit is in place to avoid Billion Laughs attacks.</p></div></div></td></tr><tr><td><p><code>nullValueOn</code></p></td><td><p><code>String</code></p></td><td><p><code>blank</code></p></td><td><div><div><p>Indicates whether to read an element with empty or blank text as a <code>null</code> value. Valid values are <code>empty</code>, <code>none</code>, or <code>blank</code>. See <a href="#example3">Example: Output <code>null</code> Values for Missing XML Values</a> and <a href="#example4">Example: Output <code>null</code> Values for Missing XML Values</a>.</p></div></div></td></tr><tr><td><p><code>optimizeFor</code></p></td><td><p><code>String</code></p></td><td><p><code>'speed'</code></p></td><td><div><div><p>Indicates how to configure the XML parser. Valid values are <code>speed</code> and <code>memory</code>.</p></div></div></td></tr><tr><td><p><code>streaming</code></p></td><td><p><code>Boolean</code></p></td><td><p><code>false</code></p></td><td><div><div><p>Indicates whether to stream input (use only if entries are accessed sequentially). Valid Options are <code>true</code> or <code>false</code>. See <a href="#example1">Example: Stream Input XML Data</a>.</p></div></div></td></tr><tr><td><p><code>supportDtd</code></p></td><td><p><code>Boolean</code></p></td><td><p><code>false</code></p></td><td><div><div><p>Enable or disable DTD support. Disabling skips (and does not process) internal and external subsets. Valid values are <code>true</code> or <code>false</code>. You can also enable this property by setting the Mule system property <code>com.mulesoft.dw.xml.supportDTD</code>. Note that the default for this property changed from <code>true</code> to <code>false</code> in Mule version 4.3.0-20210601, which includes the June 2021 patch of DataWeave version 2.3.0.</p></div></div></td></tr></tbody></table>

### Writer Properties

The XML format accepts properties that provide instructions for writing output data.

<table><colgroup><col> <col> <col> <col></colgroup><thead><tr><th>Parameter</th><th>Type</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><p><code>bufferSize</code></p></td><td><p><code>Number</code></p></td><td><p><code>8192</code></p></td><td><div><div><p>Size of the buffer writer.</p></div></div></td></tr><tr><td><p><code>encoding</code></p></td><td><p><code>String</code></p></td><td><p><code>null</code></p></td><td><div><div><p>Encoding for the writer to use.</p></div></div></td></tr><tr><td><p><code>deferred</code></p></td><td><p><code>Boolean</code></p></td><td><p><code>false</code></p></td><td><div><div><p>When set to <code>true</code>, DataWeave generates the output as a data stream, and the script’s execution is deferred until it is consumed. Valid values are <code>true</code> or <code>false</code>.</p></div></div></td></tr><tr><td><p><code>escapeCR</code></p></td><td><p><code>Boolean</code></p></td><td><p><code>false</code></p></td><td><div><div><p>Whether to escape a carriage return (CR). Valid values are <code>true</code> or <code>false</code>. Available since Mule 4.2.1.</p></div></div></td></tr><tr><td><p><code>indent</code></p></td><td><p><code>Boolean</code></p></td><td><p><code>true</code></p></td><td><div><div><p>Indicates whether to indent the code for better readability or to compress it into a single line. Valid values are <code>true</code> or <code>false</code>.</p></div></div></td></tr><tr><td><p><code>inlineCloseOn</code></p></td><td><p><code>String</code></p></td><td><p><code>empty</code></p></td><td><div><div><p>Indicates when the writer uses inline close tag or use open close tags. Valid values are <code>empty</code> or <code>none</code>.</p></div></div></td></tr><tr><td><p><code>onInvalidChar</code></p></td><td><p><code>String</code></p></td><td><p><code>null</code></p></td><td><div><div><p>Valid values are <code>base64</code>, <code>ignore</code>, or <code>none</code>.</p></div></div></td></tr><tr><td><p><code>skipNullOn</code></p></td><td><p><code>String</code></p></td><td><p><code>null</code></p></td><td><div><div><p>Skips <code>null</code> values in the specified data structure. By default, the writer does not skip them. Valid values are <code>elements</code>, <code>attributes</code>, or <code>everywhere</code>.</p></div></div></td></tr><tr><td><p><code>writeDeclaration</code></p></td><td><p><code>Boolean</code></p></td><td><p><code>true</code></p></td><td><div><div><p>Indicates whether to write the XML header declaration. Valid values are <code>true</code> or <code>false</code>.</p></div></div></td></tr><tr><td><p><code>writeNilOnNull</code></p></td><td><p><code>Boolean</code></p></td><td><p><code>false</code></p></td><td><div><div><p>Indicates whether to write a nil attribute when the value is <code>null</code>. Valid values are <code>true</code> or <code>false</code>.</p></div></div></td></tr></tbody></table>

## Supported MIME Types

The XML format supports the following MIME types.

<table><colgroup><col></colgroup><thead><tr><th>MIME Type</th></tr></thead><tbody><tr><td><p><code>*/xml</code></p></td></tr><tr><td><p><code><strong>/</strong>+xml</code></p></td></tr></tbody></table>
