Добавление нескольких 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
Должен дать вам то, что вы ожидаете.