2013-08-02 113 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