Java 跳过与使用XStream的列表相关的标记

Java 跳过与使用XStream的列表相关的标记,java,xstream,Java,Xstream,我正在尝试使用XStream将类的实例转换为XML。除了一件我希望有人能帮我解决的事情外,一切都很顺利 作为前提,我有许多“嵌套”类(在order中,OrderStatusImport->OrderCollection->order->OrderLine),但焦点由类order表示;如上所述,它的每个实例都包含一个OrderLine对象列表。就这样: public class Order { //attribute's declarations... ArrayList<Ord

我正在尝试使用XStream将类的实例转换为XML。除了一件我希望有人能帮我解决的事情外,一切都很顺利

作为前提,我有许多“嵌套”类(在order中,
OrderStatusImport
->
OrderCollection
->
order
->
OrderLine
),但焦点由类
order
表示;如上所述,它的每个实例都包含一个
OrderLine
对象列表。就这样:

public class Order {
   //attribute's declarations...
   ArrayList<OrderLine> orderLines;
}
公共类秩序{
//属性的声明。。。
ArrayList命令行;
}
这是我的格式化程序类,我在其中调用主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);
}
私有字符串createImportXml(OrderStatusImport OrderStatusImport){
对象xstream=null;
if(xstream==null){
xstream=newxstream(){
@凌驾
受保护的MapperWrapper包装器(MapperWrapper next){
返回新的UpperCaseMapper(下一个);
}
};
}
((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.omit字段(Order.class,“OrderLines”);
字符串decl=“\n”;
字符串标题=”;
字符串xml=”“;
xml+=((XStream)XStream.toXML(orderStatusImport);
返回(header+decl+xml+decl);
}
问题是生成的XML具有不需要的标记顺序行。 其内容如下:

  <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>

266
0
0
266
H4
000001
DC10
1001
C0
1.
167
000002
DC10
1001
C0
1.
99
,而我想要这个(不带订单行标记):


266
0
0
266
H4
000001
DC10
1001
C0
1.
167
000002
DC10
1001
C0
1.
99
与使用
@xstreamitfield
注释相比,我使用
omitField()
尝试了这两种方法,但可能我误解了这些方法(我是XStream的新手)。
在您提到这一点之前,我还可以在结果字符串上使用一个简单的
replace()
,但我不知道如何以这种方式保留缩进。

您想要的是所谓的隐式集合。您可以用两种方式定义它

通过使用注释

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

非常感谢你!为了指出这一点,第一种解决方案不适合我(也许我对注释的分辨率有一些问题?),但第二种解决方案是完美的
public class Order {
   @XStreamImplicit(itemFieldName="OrderLine")
   ArrayList<OrderLine> orderLines;
}
xstream.addImplicitCollection(Order.class, "orderLines", "OrderLine", OrderLine.class);