Contact Free trial Login

Remove Specified XML Attributes

You might want to remove specific attributes from within an XML tag that are known to contain sensitive data. The DataWeave example defines a function in the DataWeave header that removes a specific XML attribute from the passed element and its children. Before you begin, note that DataWeave 2.0 (%dw 2.0) is for Mule 4 apps. For a Mule 3 app, refer to DataWeave 1.0 (%dw 1.0) examples, within the Mule 3.9 documentation set. For other Mule versions, you can use the Mule Runtime version selector in the table of contents.

This example uses:

  • mapObject to go through each element.

  • @ to refer to the attributes in an XML element.

  • if and else to conditionally only list XML attributes when they are present, and also to only recursively call the function when a child element is an object.

  • is to check if each child is of type Object .

  • - to remove an element from the list of XML attributes.

  • inlineCloseOn="empty" on the output directive, so that the output XML displays self-closing tags when there are no values.

If the parent users object or child user objects within the input contain an attribute with the key password, removeAttributes removes that attribute from the object.

DataWeave Script:
%dw 2.0
input payload application/json
output application/xml inlineCloseOn="empty"
var removeAttribute = (element,attrName) ->
  element mapObject (value, key) -> {
    // Pass the name of the key of the input object,
    // for example, whether the key is "users" or "user",
    // and use @() to remap the XML attributes.
    (key) @(
        (
          // If the element contains attributes (key.@?),
          // remove any attribute that has the provided key,
          // "password".
          if (key.@?)
            (key.@ - attrName)
          // Otherwise, do nothing.
          else {}
        )
    ) :
    // If the value of the input object contains one or
    // more objects, apply removeAttribute to remove any
    // attribute with the key "password" from those objects.
    if (value is Object)
      removeAttribute(value, attrName)
    // Otherwise, return the value of the input object.
    else value
  }
---
removeAttribute(payload, "password")
Input XML Payload:
<users>
  <user username="Julian" password="1234"/>
  <user username="Mariano" password="4321"/>
</users>
Output XML:
<?xml version='1.0' encoding='US-ASCII'?>
<users>
  <user username="Julian"/>
  <user username="Mariano"/>
</users>

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub