Elemento XML con atributo y contenido usando JAXB

¿Cómo puedo generar el siguiente XML usando JAXB?

 sport description  

@XmlAttribute las propiedades de tipo y sexo con @XmlAttribute y la propiedad de descripción con @XmlValue :

 package org.example.sport; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement public class Sport { @XmlAttribute protected String type; @XmlAttribute protected String gender; @XmlValue; protected String description; } 

Para más información

El esquema correcto debería ser:

                  

El código generado para SportType será:

 package org.example.sport; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "sportType") public class SportType { @XmlValue protected String value; @XmlAttribute protected String type; @XmlAttribute protected String gender; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getType() { return type; } public void setType(String value) { this.type = value; } public String getGender() { return gender; } public void setGender(String value) { this.gender = value; } } 

Aquí está la solución de trabajo:

Salida:

 public class XmlTest { private static final Logger log = LoggerFactory.getLogger(XmlTest.class); @Test public void createDefaultBook() throws JAXBException { JAXBContext jaxbContext = JAXBContext.newInstance(Book.class); Marshaller marshaller = jaxbContext.createMarshaller(); StringWriter writer = new StringWriter(); marshaller.marshal(new Book(), writer); log.debug("Book xml:\n {}", writer.toString()); } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "book") public static class Book { @XmlElementRef(name = "price") private Price price = new Price(); } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "price") public static class Price { @XmlAttribute(name = "drawable") private Boolean drawable = true; //you may want to set default value here @XmlValue private int priceValue = 1234; public Boolean getDrawable() { return drawable; } public void setDrawable(Boolean drawable) { this.drawable = drawable; } public int getPriceValue() { return priceValue; } public void setPriceValue(int priceValue) { this.priceValue = priceValue; } } } 

Salida:

22: 00: 18.471 [main] DEBUG com.grebski.stack.XmlTest – Book xml:

   1234  

Solución actualizada: utilizando la solución de esquema que estábamos debatiendo. Esto te lleva a tu respuesta:

Esquema de muestra:

              

Código generado

SportType:

 package org.example.sport; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "sportType") public class SportType { @XmlAttribute protected String type; @XmlAttribute protected String gender; public String getType() { return type; } public void setType(String value) { this.type = value; } public String getGender() { return gender; } public void setGender(String value) { this.gender = value; } } 

Deportes:

 package org.example.sport; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "sport" }) @XmlRootElement(name = "sports") public class Sports { protected List sport; public List getSport() { if (sport == null) { sport = new ArrayList(); } return this.sport; } } 

Los archivos de clase de salida se producen ejecutando xjc contra el esquema en la línea de comando