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、別のリスト内のすべての注文行などを送信するつもりでしたが、1 つの注文がいつ終了するかわかりません。

上記の例では、注文 123 には 2 つの製品があり、注文 456 には 3 つの製品があるため、orderID を残りのリスト サイズで除算するだけではありません。

誰でもこれを行う方法を提案できますか?

ヘルパーをできるだけ簡単に呼び出して、特定の長さの注文に依存する必要がないようにしたいと考えています。

4

2 に答える 2

0

まず第一に、あなたの例は xml ファイルではないことを指摘したいと思います: ルート要素はなく、<ORDER="123">andはand<ORDER_LINE="3">のようなものであると思われます。<ORDER ID="123"><ORDER_LINE ID="3">

次に、xml ファイルを作成する必要がある場合は、JAXB ライブラリと注釈を使用します。

OrderORDER に関するすべての情報を含むクラスを作成しました(のリストへの参照があります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;
    }

}

OrderLine次に、ORDER_LINE に関するすべての情報を含むクラスを作成しました。

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();
        }
    }
}

メイン メソッドでは、 のインスタンスを作成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>

これがお役に立てば幸いです。

于 2013-09-30T14:36:09.627 に答える