2012-09-24 32 views
6

que tiene esta estructura XML:¿Cómo lidiar con JAXB ComplexType con datos de MixedContent?

<Tax> 
    <Money currency="USD">0.00</Money> 
    <Description xml:lang="en"> 
    17.5% Non-Recoverable 
    <ShortName>vatspecial</ShortName> 
    </Description> 
</Tax> 

en cuenta que Description nodo tiene MixedContent(integrado con el texto y XML) y esta es la parte XSD respecto Description nodo:

<xsd:complexType name="TaxDescriptionType"> 
    <xsd:sequence> 
    <xsd:element name="ShortName" type="xsd:string" /> 
    </xsd:sequence> 
    <xsd:attribute ref="xml:lang" /> 
</xsd:complexType> 

Todo está bien en este punto, XJC genera la generat clases de educación como ésta con respecto TaxDescriptionType:

package org.com.project; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlSchemaType; 
import javax.xml.bind.annotation.XmlType; 
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

/** 
* <p>Java class for TaxDescriptionType complex type. 
* 
* <p>The following schema fragment specifies the expected content contained within this class. 
* 
* <pre> 
* &lt;complexType name="TaxDescriptionType"> 
* &lt;complexContent> 
*  &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
*  &lt;sequence> 
*   &lt;element name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string"/> 
*  &lt;/sequence> 
*  &lt;attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/> 
*  &lt;/restriction> 
* &lt;/complexContent> 
* &lt;/complexType> 
* </pre> 
* 
* 
*/ 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "TaxDescriptionType", propOrder = { 
    "shortName" 
}) 
public class TaxDescriptionType { 

    @XmlElement(name = "ShortName", required = true) 
    protected String shortName; 
    @XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace") 
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
    @XmlSchemaType(name = "NCName") 
    protected String lang; 

    /** 
    * Gets the value of the shortName property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getShortName() { 
     return shortName; 
    } 

    /** 
    * Sets the value of the shortName property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setShortName(String value) { 
     this.shortName = value; 
    } 

    /** 
    * Gets the value of the lang property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getLang() { 
     return lang; 
    } 

    /** 
    * Sets the value of the lang property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setLang(String value) { 
     this.lang = value; 
    } 

} 

Luego, con la anterior class soy capaz de trabajar en torno a los elementos de este tipo:

taxDescriptionType.setLang("en"); 
taxDescriptionType.setShortName("vatspecial"); 
/* missing value: 17.5% Non-Recoverable */ 

pero el problema es que yo no se puede encontrar una forma de get o set el 17.5% Non-Recoverable texto del MixedContent-ComplexType del ejemplo anterior XML.


Esto es lo que he intentado y no funciona:

  • Usado mixed="true" atributo de la siguiente manera:

<xsd:complexType name="TaxDescriptionType" mixed="true">

(creo XJC es ignorando el l atributo AST)


Haciendo un poco de investigación, me encontré esto:

JAXB XJC compiler disregarding mixed=true on XML Schema documents

Pero no estoy seguro si esto es la manera de resolver esto. Una de las respuestas dice que esto es un error y en la otra muestra un código que transforma el MixedContent en un List<Serializable> y tal vez la siguiente situación será acerca de cómo lidiar con esto:

taxDescriptionType.getContent().add(Serializable element); 

(Y realmente no sé cómo tratar con un elemento Serializable)

Respuesta

4

Como usted ha mencionado es necesario añadir el atributo mixed para indicar que el tipo es compatible con contenido mixto. Sin esta especifica su contenido XML no es válido:

<xsd:complexType name="TaxDescriptionType" mixed="true"> 
    <xsd:sequence> 
     <xsd:element name="ShortName" type="xsd:string" /> 
    </xsd:sequence> 
    <xsd:attribute ref="xml:lang" /> 
</xsd:complexType> 

El TaxDescriptionType clase generada tendrá la siguiente propiedad.Esencialmente, esto significa que todo el contenido sin atributos se almacenará en un List. Esto es necesario porque necesita un mecanismo que indique dónde están los nodos de texto en el contenido del elemento.

@XmlElementRef(name = "ShortName", namespace = "http://www.example.org/schema", type = JAXBElement.class) 
@XmlMixed 
protected List<Serializable> content; 

Va a poblar esta lista de ejemplos de String (que representan nodos de texto) y JAXBElement (que representan el contenido del elemento).


ALTERNATIVAMENTE

contenido mixto en general, hace la vida más complicada de lo que debe ser. Si es posible, recomendaría una representación XML alternativa.

<Tax> 
    <Money currency="USD">0.00</Money> 
    <Description xml:lang="en" ShortName="vatspecial"> 
    17.5% Non-Recoverable 
    </Description> 
</Tax> 

O

<Tax> 
    <Money currency="USD">0.00</Money> 
    <Description xml:lang="en"> 
    <LongName>17.5% Non-Recoverable</LongName> 
    <ShortName>vatspecial</ShortName> 
    </Description> 
</Tax> 
+0

¿El parámetro de tipo 'Serializable' de' List' es significativo? –

1

Con mixta = true, en ObjectFactory debe haber una función como JAXBElement<ShortNameType> createTaxDescriptionTypeShortNameType(ShortNameType), que genera el elemento serializable para usted.

@XmlElementDecl(namespace = "", name = "shortnametype", scope = TaxDescriptionType.class) 
    public JAXBElement<ShortNameType> createTaxDescriptionTypeShortNameType(ShortNameType value) { 
     return new JAXBElement<ShortNameType>(new QName("", "shortnametype"), ShortNameType.class, TaxDescriptionType.class, value); 
}