Добавление нескольких XML-элементов/контейнеров динамически с помощью XML MarkupBuilder в Groovy

Я пытаюсь создать XML, используя Groovy MarkupBuilder.

Необходимый XML имеет эту форму (упрощенную):

<Order>
  <StoreID />
  <City />
  <Items>
    <Item>
      <ItemCode />
      <UnitPrice />
      <Quantity />
    </Item>
  </Items>
</Order>

Данные хранятся в файле Excel и легко доступны. Мой Groovy script анализирует Excel и генерирует XML.

например.

import groovy.xml.*
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)

xml.Order{
  StoreID("Store1")
  City("New York")
  Items(){
    Item(){
      ItemCode("LED_TV")
      UnitPrice("800.00")
      Quantity("2")
    }
  }
}

В "элементах" может быть несколько контейнеров "item".

Мой вопрос: Предположим, мы хотим создать XML-код заказа, содержащий 10 элементов. Есть ли способ написать что-то вроде цикла for внутри контейнера "items"? Таким образом, нам не нужно будет писать код MarkupBuilder для 10 различных элементов.

Существует аналогичный вопрос Добавление динамических элементов и атрибутов в Groovy MarkupBuilder или StreamingMarkupBuilder. Но он не обсуждает цикл.

Ответ 1

Да, есть способ использования цикла. Расширение вашего примера здесь:

import groovy.xml.*
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)

//List of items represented as a map
def 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

Должен дать вам то, что вы ожидаете.