9

次のxmlタイプがあります。

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

FaxNumber 型は次のようになります。

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

結果の xml は次のようになります。

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

JAXB XJC を実行して XSD から Java クラスを生成すると、次のクラスが生成されます。

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

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

}

ただし、FaxNumberを次のような複合クラスにバインドしたいと思います。

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

JAXBバインディングxmlでそのようなバインディングを定義する方法はありますか?

注: 残念ながら、私は XSD を制御できず、変更できません。

4

3 に答える 3

6

xjc にそのような FaxNumber クラスを生成させることはできないと思いますが、それを自分で作成し、外部バインディング ファイルを使用して適切な場所に挿入することはできます。

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

バインディング:

<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>
于 2012-10-04T08:28:44.780 に答える
1

<xsd:element name="FaxNumber" type="FaxNumber" maxOccurs="unbounded" />FaxNumbers xsd 定義の行の代わりに を使用します<xsd:element name="FaxNumber" ref="FaxNumber" maxOccurs="unbounded" />。これはあなたの問題だと思います

于 2012-10-04T06:41:08.903 に答える
1

以下は私にとってはうまくいきます。それが役立つことを願っています!

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>

生成されたオブジェクト: 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;
    }

}
于 2012-10-04T06:46:56.990 に答える