2015-12-24 7 views
0

Я довольно новичок в xstream. Я работаю на модели класса, который выглядит следующим:xstream marshal to XML - добавить атрибут на основе числа дочерних узлов

@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. Он всегда будет показывать количество MyClass внутри MyClassList.

Мне не разрешено изменять класс модели. Тем не менее, я могу реализовать свой собственный конвертер для достижения вышеуказанного.

Вопрос в том, что это лучший способ сделать это? В MyRootClass есть много других (сложных) классов, и все они были псевдонимом & аннотированы. Итак, создание метода «маршала» с нуля может быть излишним?

ответ

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