2012-10-04 20 views
8

tengo los siguientes tipos XML:Haga JAXB XJC generar una clase envoltorio para un tipo simple

<xsd:element name="FaxNumbers" minOccurs="0"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" /> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

El tipo FaxNumber se ve así:

<xsd:simpleType name="FaxNumber"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:minLength value="1" /> 
    </xsd:restriction> 
</xsd:simpleType> 

el XML resultante debe ser algo como esto :

<FaxNumbers> 
    <FaxNumber>3878374</FaxNumber> 
    <FaxNumber>387833434</FaxNumber> 
    <FaxNumber>3878334</FaxNumber> 
</FaxNumbers> 

Al ejecutar JAXB XJC para generar clases de java desde XSD genera la siguiente clase:

@XmlType(name = "FaxNumbers") 
public class FaxNumbers { 

    /** 
    * No comment. 
    */ 
    @XmlElement(name = "FaxNumber", required = true) 
    protected List<String> faxNumber = new ArrayList<String>(); 

} 

sin embargo me gustaría unen FaxNumber a clase compuesta así:

@XmlType(name = "FaxNumbers") 
public class FaxNumbers { 

    /** 
    * No comment. 
    */ 
    @XmlElement(name = "FaxNumber", required = true) 
    protected List<FaxNumber> faxNumber = new ArrayList<String>(); 

} 

Where FaxNumber class looks like this: 

public class FaxNumber{ 

    @XmlValue 
    private String value; 
} 

¿Hay una manera de definir tales vinculante en JAXB fijaciones xml?

Nota: Por desgracia no tengo control sobre y no puedo cambiar el XSD

Respuesta

6

no creo que se puede obtener xjc para generar una clase de tales FaxNumber para usted, pero usted puede escribirlo usted mismo y luego usar un archivo de enlace externo para colocarlo en el lugar correcto.

package com.example; 
public class FaxNumber { 
    private String value; 
    // getter/setter 

    public static FaxNumber parse(String s) { 
    FaxNumber n = new FaxNumber(); 
    n.value = s; 
    return n; 
    } 

    public static String print(FaxNumber n) { 
    return n.value; 
    } 
} 

enlaces:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      jaxb:version="2.0"> 
    <jaxb:bindings schemaLocation="example.xsd"> 
    <jaxb:bindings node="//xsd:simpleType[@name='FaxNumber']"> 
     <jaxb:javaType name="com.example.FaxNumber" 
      parseMethod="com.example.FaxNumber.parse" 
      printMethod="com.example.FaxNumber.print"/> 
    </jaxb:bindings> 
    </jaxb:bindings> 
<jaxb:bindings> 
1

en lugar de la línea <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" /> en sus FaxNumbers uso xsd definición <xsd:element name="FaxNumber" ref="FaxNumber" maxOccurs="unbounded" />. Creo que este es tu problema

+0

Por desgracia, no controlan y no se puede cambiar el XSD (se actualizará el post original). –

+0

entonces me temo que está atascado con la modificación manual del archivo java generado antes de usarlo. Si es posible para su caso –

+0

Edición manual de los archivos Java generados funciona bien. Sin embargo, cuando se cambia el XSD y pregenero los archivos, tengo que hacer la actualización de forma manual todo el tiempo. –

1

Los siguientes trabajos para mí. ¡Espero que ayude!

XSD:

<xsd:schema xmlns="http://www.hcentive.com/ws/eligibility/schema/beans" 
    targetNamespace="http://www.hcentive.com/ws/eligibility/schema/beans" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="FaxNumbers"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" /> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 
<xsd:complexType name="FaxNumber"> 
    <xsd:sequence> 
     <xsd:element type="xsd:string" name="value" /> 
    </xsd:sequence> 
</xsd:complexType> 
</xsd:schema> 

objeto generado: FaxNumbers.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "faxNumber" 
}) 
@XmlRootElement(name = "FaxNumbers") 
public class FaxNumbers { 

    @XmlElement(name = "FaxNumber", required = true) 
    protected List<FaxNumber> faxNumber; 

    /** 
    * Gets the value of the faxNumber property. 
    * 
    * <p> 
    * This accessor method returns a reference to the live list, 
    * not a snapshot. Therefore any modification you make to the 
    * returned list will be present inside the JAXB object. 
    * This is why there is not a <CODE>set</CODE> method for the faxNumber property. 
    * 
    * <p> 
    * For example, to add a new item, do as follows: 
    * <pre> 
    * getFaxNumber().add(newItem); 
    * </pre> 
    * 
    * 
    * <p> 
    * Objects of the following type(s) are allowed in the list 
    * {@link FaxNumber } 
    * 
    * 
    */ 
    public List<FaxNumber> getFaxNumber() { 
     if (faxNumber == null) { 
      faxNumber = new ArrayList<FaxNumber>(); 
     } 
     return this.faxNumber; 
    } 

} 
+1

Como publiqué en la pregunta, no puedo modificar el XSD. –

+0

Entonces, ¿qué puedes modificar? Está generando clases de Java solo desde XSD ¿verdad? – Anshu

+0

Eso es exactamente lo que estoy haciendo. –

Cuestiones relacionadas