2013-09-30 34 views
0

對不起,標題我想不出一個好方法來解釋我需要什麼。當尺寸不同時,需要將一個列表鏈接到另一個列表

我正在嘗試創建一個xml文件,這個文件將被系統拾取以運行某些命令,但是我正陷入如何正確創建該文件。

該文件包含: 訂單號,每個訂單號可以有多個訂單行,每個訂單行都有一個產品,每個產品都有一個數量。

例如

<ORDER="123"> 
<ORDER_LINE="1" product="abc" QUANTITY="1"/> 
<ORDER_LINE="2" product="def" QUANTITY="2"/> 
</ORDER> 
<ORDER="456"> 
<ORDER_LINE="3" product="ghi" QUANTITY="3"/> 
<ORDER_LINE="4" product="jkl" QUANTITY="4"/> 
<ORDER_LINE="5" product="mno" QUANTITY="2"/> 
</ORDER> 

我寫的,我想在所有的信息傳遞,然後創建XML的輔助工具。問題是我很困惑如何確定1個訂單結束和下一個開始的地方。

我打算髮送一個列表中的所有訂單ID,另一個等所有的訂單,但是我不知道我何時到達一個訂單的末尾。

在上面的示例中,order 123有兩個產品,其中order 456有3個,因此它不是將orderID與列表大小的其餘部分分開的情況。

有人可以提出一種方法,我可以做到這一點?

我希望我的幫手儘可能方便地打電話,而不必依賴訂單的長度。

+1

向我們顯示您的代碼。它很難理解你。 – Jayamohan

回答

0

你的'助手'可能應該是Builder。我建議以下API

new OderBuilder() 
    .startOrder(123) // starts a new order and finishes the first 
    .addLineItem("abc",1) 
    .addLineItem("def",2) 
    .createXml(); // actually writes out the xml or returns it, or what ever you want 

見關鍵是通過返回船廠本身上的每個方法調用創建一個fluent API

在Builder中,您可能想要爲Orders和OrderItems創建對象。

0

首先,我想指出的是您的例子不是一個XML文件:沒有根元素,我想這<ORDER="123"><ORDER_LINE="3">應該是像<ORDER ID="123"><ORDER_LINE ID="3">

其次,如果我不得不創建一個XML文件,我會用JAXB library和註釋:

我已經創建了一個包含所有有關訂單的信息類Order(它有一個列表的引用OrderLine):

import java.util.ArrayList; 
import java.util.List; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Order { 

    @XmlAttribute(name="ID") 
    private String id; 
    @XmlElement(name="ORDER_LINE") 
    private List<OrderLine> orderLineList = new ArrayList<OrderLine>(); 

    public Order(String id) { 
     this.id = id; 
    } 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    public List<OrderLine> getOrderLineList() { 
     return orderLineList; 
    } 
    public void setOrderLineList(List<OrderLine> orderLineList) { 
     this.orderLineList = orderLineList; 
    } 
    public Order addOrderLine(OrderLine orderLine) { 
     orderLineList.add(orderLine); 
     return this; 
    } 

} 

然後,我已經創建了一個包含所有關於ORDER_LINE信息類OrderLine

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class OrderLine { 
    @XmlAttribute(name="ID") 
    private String id; 
    @XmlAttribute(name="product") 
    private String product; 
    @XmlAttribute(name="QUANTITY") 
    private String quantity; 

    public OrderLine(String id, String product, String quantity) { 
     this.id = id; 
     this.product = product; 
     this.quantity = quantity; 
    } 

    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    public String getProduct() { 
     return product; 
    } 
    public void setProduct(String product) { 
     this.product = product; 
    } 
    public String getQuantity() { 
     return quantity; 
    } 
    public void setQuantity(String quantity) { 
     this.quantity = quantity; 
    } 


} 

最後,我創建了一個類Orders,這將是我的XML文件的根元素:

import java.util.ArrayList; 
import java.util.List; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="ORDERS") 
public class Orders { 

    @XmlElement(name="ORDER") 
    List<Order> orderList = new ArrayList<Order>(); 

    public List<Order> getOrderList() { 
     return orderList; 
    } 

    public Orders addOrder(Order order) { 
     orderList.add(order); 
     return this; 
    } 

    public static void main(String[] args) { 
     Orders orders = new Orders() 
      .addOrder(new Order("123") 
       .addOrderLine(new OrderLine("1", "abc", "1")) 
       .addOrderLine(new OrderLine("2", "def", "2"))) 
      .addOrder(new Order("456") 
       .addOrderLine(new OrderLine("3", "ghi", "3")) 
       .addOrderLine(new OrderLine("4", "jkl", "4")) 
       .addOrderLine(new OrderLine("5", "mno", "2"))); 
     try { 
      JAXBContext jaxbContext = JAXBContext.newInstance(Orders.class); 
      Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
      // output pretty printed 
      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      jaxbMarshaller.marshal(orders, System.out); 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

在main方法我剛創建的Orders一個實例,並使用所需的信息填充它。之後,我只使用JAXB庫中的方法。 輸出結果如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ORDERS> 
    <ORDER ID="123"> 
     <ORDER_LINE ID="1" product="abc" QUANTITY="1"/> 
     <ORDER_LINE ID="2" product="def" QUANTITY="2"/> 
    </ORDER> 
    <ORDER ID="456"> 
     <ORDER_LINE ID="3" product="ghi" QUANTITY="3"/> 
     <ORDER_LINE ID="4" product="jkl" QUANTITY="4"/> 
     <ORDER_LINE ID="5" product="mno" QUANTITY="2"/> 
    </ORDER> 
</ORDERS> 

希望這對我很有幫助。

相關問題