将对象编组为XML会导致添加重复节点

时间:2013-01-03 17:02:48

标签: java jaxb marshalling

我有一个需要编组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结果而不是多个orderItems。

有人能指出我离开赛道的方向吗?

1 个答案:

答案 0 :(得分:3)

您需要

  • 围绕循环或
  • 创建new Order()new OrderItem()每次迭代
  • 在您创建order.getOrderItem().add(orderItem);Order个实例后立即将OrderItem移至循环外部。

您当前的逻辑是每次循环时向列表中添加相同的OrderItem实例,因此第一次迭代您将获得一个<order_item>元素,第二次迭代您将得到两个相同的那些,第三次迭代三等等。