2011-03-15 16 views
6

He estado perder el tiempo con JAXB desde hace un tiempo, necesito para generar XML, como a continuación¿Cómo usar las propiedades de hashmap con JAXB?

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

Los atributos del elemento raíz es dinámico y podría venir de cualquier archivo de propiedades o una plantilla. ¿Cuál es la mejor manera de introducirlo en la estructura como se muestra arriba? Estoy usando HashMaps de variables dinámicas y luego trató de mapeo con XmlJavaTypeAdapter, lo mejor que podría hacer es

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

¿Hay alguna manera en jaxb decir utilice la tecla de HashMap como el nombre del atributo y el valor de esa tecla como el valor de ese atributo en xml? O si crees que hay una mejor manera de hacerlo, estoy abierto a sugerencias. Estoy pensando en usar el Marshaller de jaxb para agregar el nodo Root por separado. Sin embargo, sería mejor si pudiera usar el adaptador de jaxb. ¡Gracias!

+0

ningún chicos sugerencias? – opensourcegeek

Respuesta

6

@XmlAnyAttribute está en la línea de lo que necesita:

Raíz

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

} 

cNodo

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

} 

demostración

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

Gracias, Blaise, escribí algo usando DOM y JAXB, este es un enfoque mucho más limpio. ¡Aclamaciones! – opensourcegeek

Cuestiones relacionadas