3

次のような xsd があります (スニペット):

<xs:complexType name="IDType">
  <xs:choice minOccurs="1" maxOccurs="2">
    <xs:element name="FileID"    minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="IDNumber1" minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="Number"    minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="PNumber"   minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="SS"        minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="Player"    minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="Prior"     minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="BIN"       minOccurs="0" maxOccurs="1" type="an..35" />
    <xs:element name="Mutual"    minOccurs="0" maxOccurs="1" type="an..35" />
  </xs:choice>
</xs:complexType>
<xs:simpleType name="an..35">
  <xs:restriction base="an">
    <xs:maxLength value="35" />
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="an">
   <xs:restriction base="xs:string">
     <xs:pattern value="[ !-~]*" />
   </xs:restriction>
</xs:simpleType>

何らかの理由で、これは生成される Java コードです。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "IDType", propOrder = {
    "fileID"
})
public class PatientIDType {
    @XmlElementRefs({
        @XmlElementRef(name = "FileED", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "IDNumber1", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "Number", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "PNumber", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "SS", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "Plaer", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "Prior", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "BIN", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class),
        @XmlElementRef(name = "Mutual", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class)
    })
    protected List<JAXBElement<String>> fileID;
    /**
     * Gets the value of the fileID 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 fileID property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getFileID().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     * {@link JAXBElement }{@code <}{@link String }{@code >}
     */
    public List<JAXBElement<String>> getFileID() {
        if (fileID == null) {
            fileID = new ArrayList<JAXBElement<String>>();
        }
        return this.fileID;
    }

クラスがこのように生成され、単にある種の文字列配列ではないのはなぜですか? 何かを作成するたびに JAXBElements を作成する必要は本当にありませんか?

単に文字列などを表す型ごとにクラスを生成するにはどうすればよいですか?

前もって感謝します、

イアン

4

3 に答える 3

6

このコードは、複合型 IDType に maxOccurrence が 1 より大きい選択肢が含まれているために生成されます。

<xs:choice minOccurs="1" maxOccurs="2">

このリストの内容は、名前は異なるが同じタイプの要素です。これは、標準のオブジェクト指向モデルに相当するものはありません。次に、JAXB はJAXBElementクラスを使用してこれを回避します。 aJAXBElementは、データを含む単純なオブジェクトをラップし、それに a を割り当てますQName

したがって、以下を指定することで、このリストから読み取り、明確にリストに書き込むことができます。

  • データオブジェクト(あなたの場合、文字列からのすべての制限はJava文字列として表されるため、文字列)
  • JAXBElementメソッドが文字列をgetValue()返すA

JAXB 仕様には、繰り返し選択と繰り返しシーケンスを処理する方法について、かなり詳細でかなり複雑な説明が含まれています。シーケンスに異なる型と異なる名前のオブジェクトが含まれている場合は、最終的にList<Object>になることに注意してください。

以上が長い説明でした。次に、いくつかのオプションを示します。

  • スキーマを変更できる場合は、「Wrapper」など、8 つの項目の周りにラッパー要素を配置します。ラッパーには要素の 1 つの選択肢が含まれます。次に IDType に、minOccurs = 1 および maxOccurs = 2 の一連の Wrapper 要素を含めます。
  • JAXBElements をすばやく作成するためのヘルパー関数をいくつか作成します。JAXB は、役立つターゲット パッケージに Factory クラスを配置します。たとえば、Schema 名前空間などへの参照が含まれます。
于 2009-05-03T19:52:23.753 に答える
4

ObejctFActory クラスには、次のような thosr 値の createMethod が必要です。

@XmlElementDecl(namespace = "http://www.surescripts.com/messaging", name = "SocialSecurity", scope = PatientIDType.class)
public JAXBElement<String> createPatientIDTypeSocialSecurity(String value) {
    return new JAXBElement<String>(_PayerIDTypeSocialSecurity_QNAME, String.class, PatientIDType.class, value);
}
于 2011-12-21T22:14:04.953 に答える
1

Sun JAXB 実装を使用している場合は、xjc:simple モードを有効にしてコンパイルしてみてください。例については、簡易バインディングに関するドキュメントを参照してください。回すべし

public class PatientIDType {
    protected List<JAXBElement<String>> fileID;
}

の中へ

public class PatientIDType {
    String fileID;
    ...
}

バインディング カスタマイズ ファイルを使用してスキーマをコンパイルする必要があります。方法の例については、Kohsuke のブログを参照してください。

于 2009-04-26T21:59:13.447 に答える