【问题标题】:Skip a tag related to a List with XStream使用 XStream 跳过与列表相关的标签
【发布时间】:2015-09-11 21:48:47
【问题描述】:

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

作为前提,我有许多“嵌套”类(按顺序,OrderStatusImport -> OrderCollection -> Order -> OrderLine),但焦点由类 @987654325 表示@;如上所述,它的每个实例都包含一个 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(),但我不知道如何以这种方式保留缩进。

【问题讨论】:

    标签: java xstream


    【解决方案1】:

    你想要的叫做隐式集合。您可以通过两种方式定义它

    使用注解

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

    或使用代码

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

    【讨论】:

    • 非常感谢!只是为了指出,第一个解决方案对我不起作用(也许我对注释的分辨率有一些问题?),但第二个是完美的。
    • 首先使用你必须设置xstream.autodetectAnnotations(true);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多