2011-07-20 30 views
6

Estoy luchando con algunos análisis JAXB y necesito orientación.Agregar un atributo a un elemento JAXB

Básicamente, estoy tratando de agregar atributos a mis variables de clase que ya he declarado como Elementos usando @XmlElement. Hasta el momento, cualquier intento de usar @XmlAttribute establece el atributo en el nivel de clase.

Lo que "estoy recibiendo actualmente es la siguiente:

<DataClass newAttribute="test"> 
    <myElement>I wish this element had an attribute</myElement> 
    <anotherElement>I wish this element had an attribute too</anotherElement> 
</DataClass> 

me gustaría hacer esto:

<DataClass> 
    <myElement thisAtt="this is what I'm talking about">This is better</myElement> 
    <anotherElement thisAtt="a different attribute here">So is this</anotherElement> 
</DataClass> 

que he visto otros puestos añadir un atributo a un solo elemento utilizando el @XmlValue, pero eso no funciona cuando tienes Elementos, y no funciona en múltiples elementos.

¿Alguien tiene una idea de cómo esto podría lograrse?

Gracias! Jason

+0

Tendrá que enviar el código de Java relevante por lo que w Puedo ver lo que sucede en realidad. –

Respuesta

3

Esto creará XML que:

public class JaxbAttributes { 
    public static void main(String[] args) throws Exception { 
     Marshaller marshaller = 
      JAXBContext.newInstance(DataClass.class).createMarshaller(); 
     StringWriter stringWriter = new StringWriter(); 
     DataClass dataClass = new DataClass(
       new Foo("this is what I'm talking about", "This is better"), 
       new Foo("a different attribute here", "So is this")); 
     marshaller.marshal(dataClass, stringWriter); 
     System.out.println(stringWriter); 
    } 

    @XmlRootElement(name = "DataClass") 
    @XmlType(propOrder = {"myElement", "anotherElement"}) 
    static class DataClass { 
     private Foo myElement; 
     private Foo anotherElement; 

     DataClass() {} 
     public DataClass(Foo myElement, Foo anotherElement) { 
      this.myElement = myElement; 
      this.anotherElement = anotherElement; 
     } 

     public Foo getMyElement() { return myElement; } 
     public void setMyElement(Foo myElement) { this.myElement = myElement; } 
     public Foo getAnotherElement() { return anotherElement; } 
     public void setAnotherElement(Foo anotherElement) { this.anotherElement = anotherElement; } 
    } 

    static class Foo { 
     private String thisAtt; 
     private String value; 

     Foo() {} 
     public Foo(String thisAtt, String value) { 
      this.thisAtt = thisAtt; 
      this.value = value; 
     } 

     @XmlAttribute 
     public String getThisAtt() { return thisAtt; } 
     public void setThisAtt(String thisAtt) { this.thisAtt = thisAtt; } 
     @XmlValue 
     public String getValue() { return value; } 
     public void setValue(String value) { this.value = value; } 
    } 
} 
+0

Mi foo está en deuda con usted. Muchas gracias. No había pensado en usarlo de esa manera, su OO básico, pero por alguna razón no lo vi. Una vez más, muchas gracias. – JasonH

2

Nota: soy el plomo EclipseLink JAXB (MOXy), y un miembro de la JAXB 2.X (JSR-222) grupo de expertos.

otra posibilidad es utilizar la extensión @XmlPath en moxy para manejar este caso de uso:

DATACLASS

La anotación @XmlPath se puede utilizar con las anotaciones estándar JAXB:

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="DataClass") 
@XmlType(propOrder={"myElement", "anotherElement"}) 
public class DataClass { 

    private String myElement; 
    private String myElementThisAtt; 
    private String anotherElement; 
    private String anotherElementThisAtt; 

    public String getMyElement() { 
     return myElement; 
    } 

    public void setMyElement(String myElement) { 
     this.myElement = myElement; 
    } 

    @XmlPath("myElement/@thisAtt") 
    public String getMyElementThisAtt() { 
     return myElementThisAtt; 
    } 

    public void setMyElementThisAtt(String myElementThisAtt) { 
     this.myElementThisAtt = myElementThisAtt; 
    } 

    public String getAnotherElement() { 
     return anotherElement; 
    } 

    public void setAnotherElement(String anotherElement) { 
     this.anotherElement = anotherElement; 
    } 

    @XmlPath("anotherElement/@thisAtt") 
    public String getAnotherElementThisAtt() { 
     return anotherElementThisAtt; 
    } 

    public void setAnotherElementThisAtt(String anotherElementThisAtt) { 
     this.anotherElementThisAtt = anotherElementThisAtt; 
    } 

} 

Demostración

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

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

     DataClass dataClass = new DataClass(); 
     dataClass.setMyElement("This is better"); 
     dataClass.setMyElementThisAtt("this is what I'm talking about"); 
     dataClass.setAnotherElement("So is this"); 
     dataClass.setAnotherElementThisAtt("a different attribute here"); 

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

salida

<?xml version="1.0" encoding="UTF-8"?> 
<DataClass> 
    <myElement thisAtt="this is what I'm talking about">This is better</myElement> 
    <anotherElement thisAtt="a different attribute here">So is this</anotherElement> 
</DataClass> 

Más información

Cuestiones relacionadas