xstream marshal to XML - 根据子节点数添加属性

时间:2015-12-24 20:50:03

标签: java xml xstream

我对xstream很新。 我正在研究一个如下所示的模型类:

@XStreamAlias("MyRootClass")
public class MyRootClass {

// A bunch of other classes as child nodes

    @XStreamAlias("MyClassList")
    private List<MyClass> foo;
}

现在,有没有办法让我在编组时生成以下XML而不修改类?

<MyRootClass>
    <!-- a bunch of other class nodes -->
    <MyClassList COUNT="3">
        <MyClass>MyClass 1</MyClass>
        <MyClass>MyClass 2</MyClass>
        <MyClass>MyClass 3</MyClass>
    </MyClassList>
</MyRootClass>

主要问题是如何将属性“COUNT”正常添加到MyClass列表中。它将始终显示MyClassList中MyClass的数量。

我不允许修改模型类。但是,我可以实现自己的转换器来实现上述目标。

问题是:最好的方法是什么? MyRootClass中有许多其他(复杂)类,并且它们都是别名&amp;注释。那么,从零开始创建一个“元帅”方法可能有点过分了吗?

1 个答案:

答案 0 :(得分:0)

welp,我明白了。 不确定这是否是“最佳”方式,但它确实有效。

关键是使用转换器和嵌套转换器。 这就是我最终做的事情:

public class MyRootClassConverter implements Converter {
    @Override
    public boolean canConvert(Class type) {
        return type.equals(MyRootClassConverter.class);
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        MyRootClass rootClass= (MyRootClass) source;

        // as necessary
        writer.startNode("Other Class1");
        writer.setValue("Other Class Value");
        writer.endNode();

        if (rootClass.getMyClassList() != null || !rootClass.getMyClassList().isEmpty()) {
            writer.startNode("MyClassList");
            writer.addAttribute("COUNT", String.valueOf(rootClass.getMyClassList().size()));
            for (MyClass child : rootClass.getMyClassList()) {
                writer.startNode("MyClass");
                context.convertAnother(child); // this is where the nesting happens
                writer.endNode();
            }
            writer.endNode(); 
        }
    }
}