2012-01-16 29 views
8

Tôi muốn lưu trữ một số lớp để xml:Lưu trữ Danh sách <String> với XStream với những cái tên được xác định

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)); 

Lớp 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; 
    } 
} 

Kết quả:

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

Nhưng tôi muốn các yếu tố được đặt tên là "moduleName". Làm thế nào để cấu hình xstream hoặc những gì chú thích tôi phải thêm vào lớp học? Tôi muốn kết quả như vậy:

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

bản sao có thể có của [tùy chỉnh tuần tự hóa các bộ sưu tập java bằng cách sử dụng xstream] (http://stackoverflow.com/questions/1791178/customising-serialisation-of-java-collections-using-xstream) –

+0

Đọc [this] (http : //xstream.codehaus.org/alias-tutorial.html) – mre

Trả lời

4

này sẽ không có kết quả chính xác như bạn yêu cầu nhưng có vẻ sạch hơn:

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

Kết quả sản xuất sẽ là:

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

Có, nhưng cách lấy thẻ ? – timomeinen

0

I don' Tôi thực sự biết khuôn khổ XSteam nhưng tôi nghĩ nó sẽ khá giống với JAXB. Ở đó bạn có thể làm một cái gì đó như thế này.

Lớp 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")); 
    } 

} 

Lớp 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; 
    } 

} 

Mà sẽ tạo ra một đầu ra như thế này

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

Không, tôi cần một nút moduleNames. – Hleb

1

Bạn có thể xác định moduleNames như một Bean, Giống như

này 0
@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); 
    } 
} 
Các vấn đề liên quan