使用Groovy中的XML MarkupBuilder动态添加多个XML元素/容器

Cod*_*ure 11 xml groovy markupbuilder

我正在尝试使用Groovy MarkupBuilder生成XML.

所需的XML是这种形式(简化):

<Order>
  <StoreID />
  <City />
  <Items>
    <Item>
      <ItemCode />
      <UnitPrice />
      <Quantity />
    </Item>
  </Items>
</Order>
Run Code Online (Sandbox Code Playgroud)

数据存储在Excel文件中,易于访问.我的Groovy脚本解析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")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

"items"中可以有多个"item"容器.

我的问题是:假设我们要生成包含10个项目的Order XML.有没有办法在"items"容器中写一个类似for循环的东西?这样,我们就不需要为10个不同的项目编写MarkupBuilder代码.

有一个类似的问题将动态元素和属性添加到groovy MarkupBuilder或StreamingMarkupBuilder.但它没有讨论循环.

dma*_*tro 21

是的,有一种使用循环的方法.在此处扩展您的示例:

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
Run Code Online (Sandbox Code Playgroud)

应该给你你期待的.