Storing a <String> List Using XStream with Specific Names
I want to save some class in xml:
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)); Config class modules:
@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; } } Result:
<modules-config> <moduleName> <string>mod1</string> <string>mod2</string> </moduleName> </modules-config> But I want the elements to be named "moduleName". How to configure xstream or what annotations should I add to the class? I want this result:
<modules-config> <moduleNames> <moduleName>mod1</moduleName> <moduleName>mod2</moduleName> </moduleNames> </modules-config> +8
Hleb
source share3 answers
This will not have an exact result for your query, but seems cleaner:
@XStreamImplicit(itemFieldName="moduleName") private List<String> moduleNames; The result will be:
<modules-config> <moduleName>mod1</moduleName> <moduleName>mod2</moduleName> </modules-config> +4
mrembisz
source shareYou can define moduleNames as a Bean, Like this
@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); } } +1
Tzig
source shareI donโt know the XSteam framework, but I think it will be very similar to JAXB. There you can do something like this.
ModuleConfig Class
@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")); } } Class 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; } } which will generate output like this
<moduleConfig> <moduleNames> <moduleName>mod1</moduleName> </moduleNames> <moduleNames> <moduleName>mod2</moduleName> </moduleNames> </moduleConfig> 0
sandrozbinden
source share