2012-01-16 12 views
8

Quiero guardar una cierta clase a xml:Almacenamiento Lista <String> con xstream con nombres definidos

XStream xstream = new XStream(new DomDriver()); 

    List<String> modules = new ArrayList<String>(); 
    modules.add("mod1"); 
    modules.add("mod2"); 
    ModulesConfig modulesConfig = new ModulesConfig(modules); 

xstream.processAnnotations(ModulesConfig.class); 
log.info(xstream.toXML(modulesConfig)); 

Clase ModulesConfig:

@XStreamAlias("modules-config") 
public class ModulesConfig { 

    @XStreamAlias("moduleName") 
    private List<String> moduleNames; 

    public ModulesConfig(List<String> moduleNames) { 
     this.moduleNames = moduleNames; 
    } 

    public List<String> getModuleNames() { 
     return moduleNames; 
    } 

    public void setModuleNames(List<String> moduleNames) { 
     this.moduleNames = moduleNames; 
    } 
} 

Resultado: Elementos

<modules-config> 
    <moduleName> 
    <string>mod1</string> 
    <string>mod2</string> 
    </moduleName> 
</modules-config> 

pero quiero fueron nombrados "moduleName". ¿Cómo configurar xstream o qué anotaciones debo agregar a la clase? Quiero tales resultado:

<modules-config> 
    <moduleNames> 
    <moduleName>mod1</moduleName> 
    <moduleName>mod2</moduleName> 
    </moduleNames> 
</modules-config> 
+0

posible duplicado de [personalización de la serialización de colecciones java utilizando xstream] (http://stackoverflow.com/questions/1791178/customising-serialisation-of-java-collections-using-xstream) –

+0

Lea [esto] (http : //xstream.codehaus.org/alias-tutorial.html) – mre

Respuesta

4

Esto no tendrá el resultado exacto como usted pidió, pero parece más limpio:

@XStreamImplicit(itemFieldName="moduleName") 
private List<String> moduleNames; 

El resultado producido será:

<modules-config> 
    <moduleName>mod1</moduleName> 
    <moduleName>mod2</moduleName> 
</modules-config> 
+0

Sí, pero ¿cómo obtener la etiqueta ? – timomeinen

0

I don' Realmente conozco el framework XSteam, pero creo que será bastante similar a JAXB. Allí podrías hacer algo como esto.

Clase ModuleConfig

@XmlRootElement(name="moduleConfig") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ModuleConfig { 

    List<ModuleName> moduleNames; 
    public ModuleConfig() { 
     moduleNames = new ArrayList<ModuleName>(); 
     moduleNames.add(new ModuleName("mod1")); 
     moduleNames.add(new ModuleName("mod2")); 
    } 

} 

Clase ModuleName

@XmlRootElement(name="moduleName") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ModuleName { 

    private String moduleName; 

    public ModuleName() { } 

    public ModuleName(String moduleName) { 
     this.moduleName = moduleName; 
    } 

    public String getModuleName() { 
     return moduleName; 
    } 

} 

Wich generará una salida como esta

<moduleConfig> 
    <moduleNames> 
    <moduleName>mod1</moduleName> 
    </moduleNames> 
    <moduleNames> 
    <moduleName>mod2</moduleName> 
    </moduleNames> 
</moduleConfig> 
+0

No, necesito un nodo moduleNames. – Hleb

1

Se puede definir el moduleNames como Bean, como no

@XStreamAlias("moduleNames") 

public class ModuleNames{ 

    @XStreamImplicit(itemFieldName="moduleName") 
    private List<String> moduleNames; 

    public List<String> getModuleNames() { 
     return moduleNames; 
    } 

    public void setModuleNames(List<String> moduleNames) { 
     this.moduleNames = moduleNames; 
    } 
} 


//then add the ModuleNames as The List<String> and hide the List Tag 

@XStreamAlias("modules-config") 

public class ModulesConfig { 

    @XStreamAlias("moduleNames") 
    private ModuleNames moduleNames; 

    public ModulesConfig(List<String> moduleNames) { 
     this.moduleNames = moduleNames; 
    } 

    public List<String> getModuleNames() { 
     return moduleNames.getModuleNames(); 
    } 

    public void setModuleNames(List<String> moduleNames) { 
     this.moduleNames.set(moduleNames); 
    } 
} 
Cuestiones relacionadas