2013-09-30 35 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> 

希望这对我很有帮助。

相关问题