Хранение списка <String>с XStream с определенными именами - PullRequest
8 голосов
/ 16 января 2012

Я хочу сохранить некоторый класс в 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));

Class 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;
    }
}

Результат:

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

Но я хочу, чтобы элементы были названы"MODULENAME".Как настроить xstream или какие аннотации я должен добавить в класс?Я хочу такой результат:

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

Ответы [ 3 ]

4 голосов
/ 16 января 2012

Это не будет точный результат, как вы просили, но кажется чище:

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

Полученный результат будет:

<modules-config>
  <moduleName>mod1</moduleName>
  <moduleName>mod2</moduleName>
</modules-config>
1 голос
/ 13 ноября 2013

Вы можете определить moduleNames как Боб, Как это

@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);
    }
}
0 голосов
/ 16 января 2012

Я действительно не знаю фреймворк XSteam, но думаю, что он будет очень похож на JAXB. Там вы можете сделать что-то вроде этого.

Класс 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"));
   }

}

Класс 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;
     }

}

Сгенерирует вывод, подобный этому

<moduleConfig>
  <moduleNames>
   <moduleName>mod1</moduleName>
  </moduleNames>
  <moduleNames>
   <moduleName>mod2</moduleName>
  </moduleNames>
 </moduleConfig>
...