【问题标题】:xstream marshal to XML - add attribute based on number of child nodesxstream 编组到 XML - 根据子节点的数量添加属性
【发布时间】:2015-12-24 20:50:03
【问题描述】:

我对 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 中有许多其他(复杂的)类,它们都被别名和注释。那么,从头开始创建一个“元帅”方法可能是矫枉过正吗?

【问题讨论】:

    标签: java xml xstream


    【解决方案1】:

    哎呀,我想通了。 不确定这是否是“最好”的方法,但它确实有效。

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

    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(); 
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 2012-07-06
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      相关资源
      最近更新 更多