Adding multiple XML elements/containers dynamically using XML MarkupBuilder in Groovy Adding multiple XML elements/containers dynamically using XML MarkupBuilder in Groovy xml xml

Adding multiple XML elements/containers dynamically using XML MarkupBuilder in Groovy


Yes there is a way of using loop. Extending your example here:

import groovy.xml.*def writer = new StringWriter()def xml = new MarkupBuilder(writer)//List of items represented as a mapdef items = [[itemCode: "A", unitPrice: 10, quantity: 2],              [itemCode: "B", unitPrice: 20, quantity: 3],              [itemCode: "C", unitPrice: 30, quantity: 4],              [itemCode: "D", unitPrice: 40, quantity: 6],              [itemCode: "E", unitPrice: 50, quantity: 5]]xml.Order{  StoreID("Store1")  City("New York")  Items{    //Loop through the list.    //make sure you are using a variable name instead of using "it"    items.each{item->      Item{        ItemCode(item.itemCode)        UnitPrice(item.unitPrice)        Quantity(item.quantity)      }    }  }}println writer

Should give you what you are expecting.


This contribution has helped me to solve a similar problem : I wanted to call functions in MarkupBuilder blocks, like the addElement() function in my example.

I wanted to split the code into different functions.

Example for calling functions in MarkupBuilder blocks :

static void addElement(Map<String,String> elements, MarkupBuilder mb) {    mb."${elements.tag}"(elements.content)}static void example() {    def writer = new StringWriter()    def htmlBuilder = new MarkupBuilder(writer)    String tag = "a"    Map<String, String> attributes1 = new HashMap<>()    attributes1.put("href","http://address")    String content1 = "this is a link"    Map<String, String> element1 = new HashMap<>()    element1.put("tag","b")    element1.put("content","bold content 1")    Map<String, String> element2 = new HashMap<>()    element2.put("tag","b")    element2.put("content","bold content 2")    List<Map<String, String>> elements = new ArrayList<>()    elements.add(element1)    elements.add(element2)    htmlBuilder."html" {        "${tag}"( attributes1, content1 )        elements.each { contentIterator ->            addElement(contentIterator, htmlBuilder)        }    }    println writer }

and it produces this output :

<html>  <a href='http://address'>this is a link</a>  <b>bold content 1</b>  <b>bold content 2</b></html>