2015-06-25 6 views
2

Я пытаюсь преобразовать экземпляр класса в XML с помощью XStream. Все работает отлично, за исключением того, что я надеюсь, что кто-то может помочь мне решить.Перейти к тегам, связанным с List with XStream

В помещении, у меня есть много «вложенных» классов (в порядке, OrderStatusImport ->OrderCollection ->Order ->OrderLine), но координационный центр представлен классом Order; как выражено выше, каждый экземпляр содержит список объектов OrderLine. Просто так:

public class Order { 
    //attribute's declarations... 
    ArrayList<OrderLine> orderLines; 
} 

Это мой форматировщик класс, в котором я называю основной логики XStream:

private String createImportXml(OrderStatusImport orderStatusImport) { 
    Object xstream = null; 
    if (xstream == null) { 
     xstream = new XStream() { 
      @Override 
      protected MapperWrapper wrapMapper(MapperWrapper next) { 
       return new UpperCaseMapper(next); 
      } 
     }; 
    } 

    ((XStream) xstream).alias("OrderStatusImport", OrderStatusImport.class); 
    ((XStream) xstream).alias("OrderCollection", OrderCollection.class); 
    ((XStream) xstream).alias("Order", Order.class); 
    ((XStream) xstream).alias("OrderLine", OrderLine.class); 
    ((XStream) xstream).omitField(Order.class, "OrderLines"); 

    String decl = "\n"; 
    String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; 
    String xml = ""; 

    xml += ((XStream) xstream).toXML(orderStatusImport); 

    return (header + decl + xml + decl); 
} 

Проблема заключается в том, что полученный XML имеет нежелательные OrderLines тегов. Он представлен как:

<Order> 
    <OrderItemsTotal>266.00</OrderItemsTotal> 
    <OrderShipping>0.00</OrderShipping> 
    <OrderCodFee>0.00</OrderCodFee> 
    <OrderTotal>266.00</OrderTotal> 
    <OrderStatus>H4</OrderStatus> 
    <OrderLines> 
     <OrderLine> 
     <ItemNumber>000001</ItemNumber> 
     <DCNumber>DC10</DCNumber> 
     <StorageLocation>1001</StorageLocation> 
     <OrderLineStatus>C0</OrderLineStatus> 
     <CancelReasonCode></CancelReasonCode> 
     <Quantity>1</Quantity> 
     <ItemTotal>167.00</ItemTotal> 
     </OrderLine> 
     <OrderLine> 
     <ItemNumber>000002</ItemNumber> 
     <DCNumber>DC10</DCNumber> 
     <StorageLocation>1001</StorageLocation> 
     <OrderLineStatus>C0</OrderLineStatus> 
     <CancelReasonCode></CancelReasonCode> 
     <Quantity>1</Quantity> 
     <ItemTotal>99.00</ItemTotal> 
     </OrderLine> 
    </OrderLines> 
    </Order> 

, в то время как я хочу, чтобы это (без OrderLines теги):

<Order> 
    <OrderItemsTotal>266.00</OrderItemsTotal> 
    <OrderShipping>0.00</OrderShipping> 
    <OrderCodFee>0.00</OrderCodFee> 
    <OrderTotal>266.00</OrderTotal> 
    <OrderStatus>H4</OrderStatus> 
    <OrderLine> 
     <ItemNumber>000001</ItemNumber> 
     <DCNumber>DC10</DCNumber> 
     <StorageLocation>1001</StorageLocation> 
     <OrderLineStatus>C0</OrderLineStatus> 
     <CancelReasonCode></CancelReasonCode> 
     <Quantity>1</Quantity> 
     <ItemTotal>167.00</ItemTotal> 
    </OrderLine> 
    <OrderLine> 
     <ItemNumber>000002</ItemNumber> 
     <DCNumber>DC10</DCNumber> 
     <StorageLocation>1001</StorageLocation> 
     <OrderLineStatus>C0</OrderLineStatus> 
     <CancelReasonCode></CancelReasonCode> 
     <Quantity>1</Quantity> 
     <ItemTotal>99.00</ItemTotal> 
    </OrderLine> 
    </Order> 

Я попытался как с omitField(), чем с @XStreamOmitField аннотацию, но, может быть, я неправильно понимают эти те (Я новичок в XStream). Прежде чем вы упомянули об этом, я мог бы также использовать простой replace() на результирующей String, но я не знаю, как сохранить отступ таким образом.

ответ

5

То, что вы хотите, называется неявной коллекцией. Вы можете определить это двумя способами

с помощью аннотаций

public class Order { 
    @XStreamImplicit(itemFieldName="OrderLine") 
    ArrayList<OrderLine> orderLines; 
} 

или с помощью кода

xstream.addImplicitCollection(Order.class, "orderLines", "OrderLine", OrderLine.class); 
+0

Спасибо ОЧЕНЬ много! Как раз для того, чтобы указать на это, первое решение не работает для меня (может быть, у меня есть проблема с разрешениями аннотаций?), Но вторая - идеальна. –

+1

Для использования сначала вы должны установить 'xstream.autodetectAnnotations (true);' –