2011-03-15 79 views
6

我已經和JAXB現在擺弄了一段時間,我需要生成XML像下面如何在JAXB中使用hashmap屬性?

<Root attr1="" attr2="" .. attrn="" > 
    <CNode attr1="" attr2="" /> 
    . 
    . 
    . 
    <CNode .. /> 
</Root> 

根元素的屬性是動態的,會來,無論是從屬性文件或模板。如上所示,將其納入結構的最佳方法是什麼?我使用動態變量包含HashMap,然後試圖使用XmlJavaTypeAdapter映射的話,我能做的最好的是

<Root> 
    <Attribs> 
     <entry key="attr1">Value</entry> 
    </Attribs> 
    <CNode .. /> 
</Root> 

是否有JAXB的方式說作爲屬性名稱使用HashMap中的鍵和該鍵的值作爲XML屬性的值?或者如果您認爲有更好的方法可以做到這一點,我很樂意提供建議。我很想使用jaxb的編組器來分別添加Root節點。不過,如果我可以使用jaxb的適配器,它會更好。謝謝!

+0

任何建議傢伙? – opensourcegeek 2011-03-16 16:22:25

回答

6

@XmlAnyAttribute是沿行你需要什麼:

import java.util.List; 
import java.util.Map; 

import javax.xml.bind.annotation.XmlAnyAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.namespace.QName; 

@XmlRootElement(name="Root") 
public class Root { 

    private Map<QName, String> extension; 
    private List<CNode> cnodes; 

    @XmlAnyAttribute 
    public Map<QName, String> getExtension() { 
     return extension; 
    } 

    public void setExtension(Map<QName, String> extension) { 
     this.extension = extension; 
    } 

    @XmlElement(name="CNode") 
    public List<CNode> getCnodes() { 
     return cnodes; 
    } 

    public void setCnodes(List<CNode> cnodes) { 
     this.cnodes = cnodes; 
    } 

} 

CNode

import java.util.Map; 
import javax.xml.bind.annotation.XmlAnyAttribute; 
import javax.xml.namespace.QName; 

public class CNode { 

    private Map<QName, String> extension; 

    @XmlAnyAttribute 
    public Map<QName, String> getExtension() { 
     return extension; 
    } 

    public void setExtension(Map<QName, String> extension) { 
     this.extension = extension; 
    } 

} 

演示

import java.io.File; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Root root = (Root) unmarshaller.unmarshal(new File("input.xml")); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

的input.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Root att1="A" att2="B"> 
    <CNode att3="C" att4="D"/> 
    <CNode att5="E" att6="F"/> 
</Root> 
+1

感謝Blaise,我用DOM和JAXB寫了一些東西 - 這是一種更簡潔的方法。乾杯! – opensourcegeek 2011-03-17 11:22:01