2013-08-02 24 views
10

Tôi đang cố gắng tạo XML bằng cách sử dụng Groovy MarkupBuilder.Thêm nhiều phần tử/thùng chứa XML tự động bằng cách sử dụng XML MarkupBuilder trong Groovy

XML cần thiết là của mẫu đơn này (giản thể):

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

Dữ liệu được lưu trữ trong một tập tin Excel và có thể dễ dàng tiếp cận. Kịch bản Groovy của tôi phân tích cú pháp Excel và tạo ra XML.

ví dụ:

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

Có thể có nhiều mục "mục" bên trong "mục".

Câu hỏi của tôi là: Giả sử chúng tôi muốn tạo XML đơn đặt hàng có 10 mục. Có cách nào để viết một cái gì đó giống như một vòng lặp cho bên trong "mặt hàng" container? Bằng cách đó, chúng tôi sẽ không cần phải viết mã MarkupBuilder cho 10 mục khác nhau.

Có một câu hỏi tương tự Adding dynamic elements and attributes to groovy MarkupBuilder or StreamingMarkupBuilder. Nhưng nó không thảo luận về vòng lặp.

Trả lời

16

Có cách sử dụng vòng lặp. Mở rộng ví dụ của bạn tại đây:

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 

Nên cung cấp cho bạn những gì bạn đang mong đợi.

+0

Tôi hiểu. Vì vậy, chúng ta có thể viết mã lặp Groovy thông thường bên trong đánh dấu. Tôi nghĩ rằng đánh dấu không nên có gì khác hơn là mã đánh dấu. Cảm ơn các câu trả lời chi tiết. Cảm kích điều đó! :) – CodeVenture

+0

Cảm ơn bạn đã đề xuất. điều này giúp tôi rất nhiều công sức. – Tung

+0

Cảm ơn câu trả lời tuyệt vời! Là một người mới làm quen Groovy, tôi đã tìm kiếm rất nhiều cho đến khi tôi tìm thấy điều này! – eerriicc

Các vấn đề liên quan