4

我正在使用生成此类 XML 的系统:

<address>
  <addressLine>123 Main Street</addressLine>
  <addressLine>Suite 123</addressLine>
  <city>Test City</city>
  <stateOrProvince>AA</stateOrProvince>
  <postalCode>00000</postalCode>
</address>

两个 addressLine 元素应该是 XStream 隐式集合的一部分——我想调用一个getAddressLine()方法并获得一个List<String>输出。

我一直在使用 XStream 的教程,但还没有完全弄清楚如何让addressLine元素正确映射。XStream 的 Tweaking Output 教程中有一个类似的用例,但没有提供示例代码:

另一个用例是集合、数组和映射。如果一个类有一个属于这些类型之一的字段,则默认情况下,它的所有元素都嵌入在表示容器对象本身的元素中。通过使用 、 和 方法配置 XStream,XStream.addImplicitCollection()可以 XStream.addImplicitArray()XStream.addImplicitMap()元素直接保留为类的子元素,并且省略容器对象的周围标记。甚至可以为一个类声明多个隐式集合、数组或映射,但是这些元素必须是可区分的,以便在反序列化时正确填充不同的容器。

在以下示例中,表示农场的 Java 类型可能有两个容器,一个用于猫,一个用于狗:

<farm>
  <cat>Garfield</cat>
  <cat>Arlene</cat>
  <cat>Nermal</cat>
  <dog>Odie</dog>
</farm>

但是,这个SO 答案表明 XStream 场示例是不可能的。

我已尝试使用此 Java 代码对我的 Java 代码进行单元测试,但还没有运气:

XStream xstream = new XStream(new StaxDriver());        
xstream.alias("address", Address.class);
xstream.alias("addressLine", String.class);     
xstream.addImplicitCollection(Address.class, "addressLines");       

Address address = (Address) xstream.fromXML( 
    new FileInputStream("src/test/resources/addressTest.xml"));

我应该尝试任何其他配置更改吗?

注意:我目前使用的是 XStream v1.2.2。

4

1 回答 1

11

首先,如果可能的话,您应该升级到更新的 XStream - 2007 年发布的 1.2.2。但要回答您的问题,请尝试:

XStream xstream = new XStream(new StaxDriver());
xstream.alias("address", Address.class);
xstream.addImplicitCollection(Address.class, "addressLines", "addressLine", String.class);

这表示将具有名称的所有元素addressLine视为字符串,并将它们收集到addressLines集合中(即someAddress.getAddressLines())。

于 2012-10-01T21:47:15.270 回答