对不起标题我想不出解释我需要的好方法。
我正在尝试创建一个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发送到列表中,将所有订单行发送到另一个订单行等,但是当我到达一个订单的末尾时,我将不知道。
在上面的示例中,订单123有2个产品,其中订单456有3个,因此不仅仅是将orderID除以列表大小的其余部分。
有人可以建议我这样做吗?
我希望我的助手尽可能轻松地打电话,而不必依赖订单一定的长度。
答案 0 :(得分: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
请参阅关键是通过在每次方法调用时返回Builder本身来创建fluent API。
在Builder内部,您可能希望为Orders和OrderItems创建对象。
答案 1 :(得分:0)
首先,我想指出您的示例不是xml文件:没有根元素,我猜<ORDER="123">
和<ORDER_LINE="3">
应该是{{1} 1}}和<ORDER ID="123">
。
其次,如果我必须创建一个xml文件,我会使用JAXB library和注释:
我创建了一个类<ORDER_LINE ID="3">
,其中包含有关ORDER的所有信息(它引用了Order
列表):
OrderLine
然后我创建了一个包含有关ORDER_LINE的所有信息的类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;
}
}
:
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;
}
}
,它将成为我的xml文件的根元素:
Orders
在main方法中,我只创建一个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();
}
}
}
的实例,并用所需信息填充它。之后我只使用JAXB库中的方法。
输出如下:
Orders
希望这有用。