2015-11-03 9 views
5

Ich bin mit XStream und habe eine Klasse mit einem Feld wie folgt aus:XStream-benutzerdefinierter Konverter, der eine flache XML-Struktur aus List generieren kann?

private Map<String, String> data; 

Ich möchte XML Ausgabe wie folgt generieren:

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

Deshalb möchte ich die Mapkey die sein Element. Der mapvalue soll der XML-Wert sein und ich möchte nicht, dass die XML in ein Element wie <data></data> eingepackt wird. Kann jemand auf Beispielcode zeigen, der dies oder etwas ähnliches tut?

UPDATE

Dies nur ein Ausschnitt, gibt es ein Stammelement.

UPDATE 2

Der Code benutzerdefinierte Konverter I unten geschrieben fast funktioniert. Ich bekomme eine flache Struktur, aber ich muss das äußere Element entfernen. Irgendeine Idee dazu?

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

Dies ist der Code

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

Valid XML müssen nicht mehrere Stammelemente aufweisen. – dummy

+0

Dies ist nur ein Ausschnitt. Es gibt ein Wurzelelement. Ich möchte nur, dass die Listenelemente flach erscheinen. –

+0

Was ist mit den Schlussabstimmungen? Dies scheint eine Frage zu sein, für die SO geschaffen wurde. –

Antwort

0

ich diese Arbeit bekommen konnte. Der folgende SO Post ist was ich letztendlich tat: custom converter in XStream. Ich musste aus dem ReflectionConverter erweitern:

Dieser nächste Beitrag half auch, obwohl, als ich diesen Ansatz versuchte die context.convertAnother() -Methode nicht zu funktionieren schien. Also wechselte ich zu der Methode im 1. Post.

Xstream Implicit Map As Attributes to Root Element