2

我正在使用 XStream 将 XML 转换为域对象,并且遇到了问题。省略一些细节,XML 看起来像这样:

<airport>
    <flights>
        <flight>.....</flight>
        <flight>.....</flight>
        <flight>.....</flight>
    </flights>
</airport>

可以有 0 到 Nflight个元素。飞行元素本身包含其他元素。我为机场、航班和航班创建了类,并使用 xstream.alias 函数注册了它们。

xstream = new XStream();
xstream.alias("airport", AirportPojo.class);
xstream.alias("flights", FlightsPojo.class);
xstream.alias("flight", FlightPojo.class);
xstream.useAttributeFor(AirportPojo.class, "flights");
xstream.addImplicitCollection(FlightsPojo.class, "flights", FlightPojo.class);
AirportPojo airportPojo = (AirportPojo) xstream.fromXML(xml);

所以,在转换之后,这给了我一个包含 FlightPojo 对象的 AirportPojo 对象,其中包含 FlightPojo 对象的集合。但是,当有 0 个飞行元素时,FlightPojos 的集合似乎是null. 我希望(并且更喜欢)列表被初始化但其中包含零个元素。我怎么能做到这一点?请记住,我不能使用注释,因为这是一个遗留项目。

4

2 回答 2

1

如何实现自定义转换器?

class FlightsConverter implements Converter {
    @Override
    public boolean canConvert(Class clazz) {
        return clazz.equals(FlightsPojo.class);
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        FlightsPojo flightsPojo = new FlightsPojo();
        flightsPojo.setFlights(new ArrayList<FlightPojo>());
        while (reader.hasMoreChildren()) {
            reader.moveDown();
            FlightPojo flightPojo = (FlightPojo) context.convertAnother(flightsPojo, FlightPojo.class);
            flightsPojo.getFlights().add(flightPojo);
            System.out.println(reader.getValue());
            reader.moveUp();
        }
        return flightsPojo;
    }

    @Override
    public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
        // todo...
    }
}

并像这样钩住它:

    XStream xstream = new XStream();
    xstream.registerConverter(new FlightsConverter());
    xstream.alias("airport", AirportPojo.class);
    xstream.alias("flights", FlightsPojo.class);
    xstream.alias("flight", FlightPojo.class);
    xstream.useAttributeFor(AirportPojo.class, "flights");
    AirportPojo airportPojo = (AirportPojo) xstream.fromXML(xml);

希望这可以帮助 ;)

于 2013-10-23T07:21:35.930 回答
0

看起来 XStream 无法以这种方式处理隐式集合。 请参阅 XStream 的常见问题解答的这一部分。

于 2013-10-23T06:59:36.967 回答