2015-11-03 2 views
5

Я использую XStream и есть класс с полем, как следующее:XStream настраиваемый конвертер, который может генерировать плоскую структуру XML из списка?

private Map<String, String> data; 

Я хочу, чтобы сгенерировать вывод XML так:

<key1>test data</key1> 
<key2>test data</key2> 
<key3>test data</key3> 

Так что я хочу ключ карты, чтобы быть элемент. Значение map должно быть значением XML, и я не хочу, чтобы XML, обернутый в элемент, такой как <data></data>. Может ли кто-нибудь указать пример кода, который делает это, или что-то подобное?

UPDATE

Это только отрывок, есть корневой элемент.

UPDATE 2

Обычай конвертер код, который я разместил ниже почти работает. Я получаю плоскую структуру, но мне нужно удалить внешний элемент. Есть идеи по этому поводу?

//this is the result need to remove <data> 
<data> 
    <key1>test data</key1> 
    <key2>test data</key2> 
    <key3>test data</key3> 
</data> 

Это код

public class MapToFlatConverter implements Converter{ 
    public MapToFlatConverter() { 
    } 

    @Override 
    public boolean canConvert(Class type) { 
     return Map.class.isAssignableFrom(type); 
    } 

    @Override 
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { 
     Map<String, String> map = (Map<String, String>) source; 
     for (Map.Entry<String, String> entry : map.entrySet()) { 
      writer.startNode(entry.getKey()); 
      writer.setValue(entry.getValue().toString()); 
      writer.endNode(); 
     } 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { 
     //not needed at this time 

     return null; 
    } 

}

+1

Действительный XML не должен иметь несколько элементов корня. – dummy

+0

это всего лишь фрагмент. Существует корневой элемент. Я просто хочу, чтобы элементы списка выглядели плоскими. –

+0

Что такое с близкими голосами? Это похоже на вопрос, для которого SO был создан. –

ответ

0

Я был в состоянии получить эту работу. Следующий пост SO - это то, что я в конечном счете сделал: custom converter in XStream. Мне нужно было перейти от ReflectionConverter:

Этот пост также помог, хотя, когда я пробовал этот подход, метод context.convertAnother(), похоже, не работал. Поэтому я переключился на метод в 1-м сообщении.

Xstream Implicit Map As Attributes to Root Element

Смежные вопросы