2015-11-03 13 views
5

Sto usando xstream e avere una classe con un campo simile al seguente:Convertitore XStream personalizzato in grado di generare una struttura XML piatta da Elenco?

private Map<String, String> data; 

voglio generare output XML in questo modo:

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

Quindi voglio la chiave della mappa per essere il elemento. Il valore della mappa deve essere il valore XML e non voglio che l'XML sia racchiuso in un elemento come <data></data>. Qualcuno può puntare a un codice di esempio che faccia questo o qualcosa di simile?

UPDATE

Questo solo un frammento, è presente un elemento radice.

UPDATE 2

Il codice convertitore personalizzato che ho postato qui sotto funziona quasi. Ottengo una struttura piatta, ma ho bisogno di rimuovere l'elemento esterno. Qualche idea su questo?

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

Questo è il codice

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 valido non deve avere più elementi radice. – dummy

+0

questo è solo uno snippet. C'è un elemento radice. Voglio solo che gli elementi della lista appaiano piatti. –

+0

che cosa è con i voti ravvicinati? Questa sembra una domanda per cui SO è stato creato. –

risposta

0

ero in grado di ottenere questo lavoro. Il seguente post SO è ciò che alla fine ho fatto: custom converter in XStream. Avevo bisogno di estendere da ReflectionConverter:

Questo post successivo ha aiutato anche, anche se quando ho provato questo approccio il metodo context.convertAnother() non sembrava funzionare. Così sono passato al metodo nel primo post.

Xstream Implicit Map As Attributes to Root Element

Problemi correlati