1

XMLにマーシャリングする必要のあるオブジェクトがあります。これを行うために、私はJAXBを使用しています。結果のXMLファイルが作成されますが、ノードが重複することになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<order>
    <supplier_id>suppliername</supplier_id>
    <store_name>storename</store_name>
    <order_id>1234567890</order_id>
    <order_item>
        <order_item_id>0987654321</order_item_id>
        <item_state>Shipped</item_state>
        <item_state_date>2012-12-27T14:40:00.000-05:00</item_state_date>
        <carrier_code>NA</carrier_code>
        <carrier_name>CarrierName</carrier_name>
        <shipping_method>Expedited</shipping_method>
        <tracking_number>348134987124872734817324</tracking_number>
        <backorder_replacement_sku_price>0.0</backorder_replacement_sku_price>
    </order_item>
    <order_item>
        <order_item_id>0987654321</order_item_id>
        <item_state>Shipped</item_state>
        <item_state_date>2012-12-27T14:40:00.000-05:00</item_state_date>
        <carrier_code>NA</carrier_code>
        <carrier_name>CarrierName</carrier_name>
        <shipping_method>Expedited</shipping_method>
        <tracking_number>348134987124872734817324</tracking_number>
        <backorder_replacement_sku_price>0.0</backorder_replacement_sku_price>
    </order_item>
    ....

最初のノードだけが必要ですが<order_item>、後続のノードが誤って存在します。

私のコードは次のとおりです。

JAXBContext context = JAXBContext.newInstance(classname.class.getPackage().getName());
Marshaller marsheller = context.createMarshaller();

Order order = new Order();
OrderItem orderItem = new OrderItem();

...Business logic related to our ERP system...
//We start a loop here to iterate over search results. The goal is to have one XML file per search row returned. No knowledge of the ERP system is required. 

for (SearchRow row : results.getSearchRowList().getSearchRow()) {   
    //we capture our variables from the search results here and build our order and orderItem objects with them. 

    order.setSupplierId("suppliername");
    order.setStoreName("storename");
    order.setOrderId(orderNumber);
    orderItem.setOrderItemId(orderItemId);
    orderItem.setItemState(StatusCodeType.SHIPPED);
    orderItem.setItemStateDate(date2);
    orderItem.setCarrierCode("NA");
    orderItem.setCarrierName(carrierName);
    orderItem.setShippingMethod(shippingMethod);
    orderItem.setTrackingNumber(trackingNumber);

    order.getOrderItem().add(orderItem);
    File f = new File("tempFiles/" + order.getOrderId() + ".xml");
    marsheller.marshal(order, f);
}

問題はループだと思いましたが、オブジェクトからオブジェクトを作成した後にすべての変数をログに記録すると、オブジェクト自体からorderItemの結果のみが表示され、複数のorderItemは表示されません。

誰かが私を軌道から外す方向に向けることができますか?

4

1 に答える 1

3

あなたはどちらかをする必要があります

  • を作成しnew Order()new OrderItem()ループの周りの各反復または
  • およびインスタンスorder.getOrderItem().add(orderItem);を作成した直後に、をループの外側に移動します。OrderOrderItem

現在のロジックではOrderItem、ループをラウンドするたびに同じインスタンスがリストに追加されるため、最初の反復では1つの要素が取得さ<order_item>れ、2番目の反復では2つの同じ要素が取得され、3番目の反復では3つの要素が取得されます。

于 2013-01-03T17:06:18.990 に答える