2013-08-02 2 views
10

Próbuję wygenerować XML za pomocą Groovy MarkupBuilder.Dynamiczne dodawanie wielu elementów XML/kontenerów za pomocą XML MarkupBuilder w Groovy

XML potrzebna jest tej postaci (uproszczony):

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

Dane są przechowywane w pliku Excel i jest łatwo dostępny. Mój skrypt Groovy analizuje program Excel i generuje kod XML.

np.

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") 
    } 
    } 
} 

W "elementach" może znajdować się wiele kontenerów "przedmiotowych".

Moje pytanie brzmi: Załóżmy, że chcemy wygenerować porządek XML zawierający 10 elementów. Czy istnieje sposób na napisanie czegoś w rodzaju pętli for wewnątrz kontenera "items"? W ten sposób nie będziemy musieli pisać kodu MarkupBuilder dla 10 różnych pozycji.

Istnieje podobne pytanie Adding dynamic elements and attributes to groovy MarkupBuilder or StreamingMarkupBuilder. Ale nie omawia pętli.

Odpowiedz

16

Tak, istnieje sposób użycia pętli. Rozszerzając swój przykład tutaj:

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 

Powinien dać ci to, czego się spodziewasz.

+0

Rozumiem. MOŻEMY więc napisać regularny kod pętli Groovy wewnątrz znaczników. Sądziłem, że znaczniki powinny zawierać tylko kod znaczników. Dziękuję za szczegółową odpowiedź. Doceniam to! :) – CodeVenture

+0

Dzięki za sugestię. to pomaga mi dużo wysiłku. – Tung

+0

Dzięki za wspaniałą odpowiedź! Jako początkujący Groovy, dużo szukałem, aż znalazłem to! – eerriicc