2012-10-04 9 views
8

ho i seguenti tipi di xml:Fare JAXB XJC generare una classe involucro per un tipo semplice

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

Il tipo FaxNumber assomiglia a questo:

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

il codice XML risultante dovrebbe essere qualcosa di simile :

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

Quando si esegue JAXB XJC per generare le classi Java da XSD che genera la seguente classe:

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

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

} 

però vorrei legano FaxNumber alla classe composta in questo modo:

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

C'è un modo per definire quali vincolanti in JAXB binding XML?

Nota: Purtroppo non ho il controllo su e non posso cambiare il XSD

risposta

6

non credo che si può ottenere xjc per generare una tale classe FaxNumber per voi, ma voi puoi scriverlo da solo e quindi utilizzare un file di bind esterno per inserirlo nel posto giusto.

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

Attacchi:

<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

anziché la linea <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" /> nei vostri FaxNumbers uso XSD definizione <xsd:element name="FaxNumber" ref="FaxNumber" maxOccurs="unbounded" />. Penso che questo sia il tuo problema

+0

Purtroppo non mi controllo e non può cambiare il XSD (aggiornerà il post originale). –

+0

quindi temo di essere bloccato con la modifica manuale del file java generato prima di utilizzarlo. Se è possibile per il tuo caso –

+0

La modifica manuale dei file java generati funziona correttamente. Tuttavia, quando l'XSD viene modificato e pre-generi i file, devo eseguire l'aggiornamento manualmente ogni volta. –

1

A seguito di lavori per me. Spero possa aiutare!

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> 

oggetto Generated: 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

Come ho postato nella domanda, non posso modificare l'XSD. –

+0

Allora cosa si può modificare? Stai generando classi Java solo da XSD, giusto? – Anshu

+0

Questo è esattamente quello che sto facendo. –

Problemi correlati