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>