2013-08-02 57 views
10

我正尝试使用Groovy MarkupBuilder生成XML。需要在Groovy中使用XML MarkupBuilder动态添加多个XML元素/容器

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

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

的数据被存储在一个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") 
    } 
    } 
} 

“items”中可以有多个“item”容器。

我的问题是: 比方说,我们想要生成包含10个项目的订单XML。有没有办法在“items”容器内写入类似for循环的东西?这样,我们不需要为10个不同的项目编写MarkupBuilder代码。

还有一个类似的问题Adding dynamic elements and attributes to groovy MarkupBuilder or StreamingMarkupBuilder。但它没有讨论循环。

回答

16

是的,有一种使用循环的方法。扩展你的例子:

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 

应该给你你所期待的。

+0

我明白了。所以我们可以在标记内部编写常规的Groovy循环代码。我认为标记应该包含标记代码以外的内容。感谢您的详细解答。欣赏它! :) – CodeVenture

+0

感谢您的建议。这帮助我做了很多努力。 – Tung

+0

感谢您的好评!作为一名Groovy新手,我搜索了很多,直到我找到了这个! – eerriicc