2012-10-04 19 views
8

mam następujące typy XML:Bądź JAXB XJC wygenerować klasę owijania prostego typu

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

Typ FaxNumber wygląda następująco:

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

Powstały xml powinno być coś takiego :

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

Podczas uruchamiania JAXB XJC do generowania klas java z XSD generuje następującą klasę:

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

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

} 

Jednak chciałbym powiązania FaxNumber do klasy kompozytowego takiego:

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

Czy istnieje sposób, aby określić takie wiąże w JAXB wiązaniami xml?

Uwaga: Niestety nie mam kontroli nad i nie można zmienić XSD

Odpowiedz

6

Nie sądzę, można uzyskać XJC wygenerować taką klasę FaxNumber dla ciebie, ale ty możesz napisać to samemu, a następnie użyć zewnętrznego pliku wiążącego, aby umieścić go we właściwym miejscu.

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

Wiązania:

<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

zamiast linii <xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" /> w swoim FaxNumbers zastosowania xsd definicja <xsd:element name="FaxNumber" ref="FaxNumber" maxOccurs="unbounded" />. Myślę, że to twój problem.

+0

Niestety nie kontroluje i nie może zmienić XSD (zaktualizuje oryginalny post). –

+0

obawiam się, że utknąłeś z ręczną modyfikacją wygenerowanego pliku Java, zanim go użyjesz. Jeśli jest to możliwe w twoim przypadku –

+0

Ręczne edytowanie wygenerowanych plików java działa poprawnie. Jednak po zmianie XSD i wstępnym generowaniu plików muszę ręcznie aktualizować za każdym razem. –

1

Kolejne prace dla mnie. Mam nadzieję, że pomaga!

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> 

wygenerowanego obiektu: 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

Jak napisałem w pytaniu, nie mogę zmodyfikować XSD. –

+0

Co zatem można zmodyfikować? Generujesz klasy Java tylko z XSD, prawda? – Anshu

+0

Dokładnie to robię. –

Powiązane problemy