3

XSDファイルがあります。xjc を使用して、そこからクラスを生成します。生成されたクラスの XmlType アノテーションから propOrder 値を変更するにはどうすればよいですか? 私が XSD ファイルの所有者でない限り、XSD ファイルを変更したくありません。また、このスキーマから生成されたクラスを変更したくありません。カスタムバインディングファイル(xjb)でこれを達成する方法はありますか? 問題は、 propOrder 値が私にとって望ましくないことです。最後の解決策として、このクラスに parseMethod/printMethod を使用することを検討しますが、これはややこしすぎます。

私はFpML(XMLベースフォーマット)を扱っています.XSD要素は次のとおりです:

<xsd:complexType name="TradeIdentifier">
    <xsd:sequence>
        <xsd:choice>

            <xsd:sequence>
                <xsd:element name="issuer" type="IssuerId"></xsd:element>
                <xsd:element name="tradeId" type="TradeId"></xsd:element>
            </xsd:sequence>

            <xsd:sequence>
                <xsd:group ref="PartyAndAccountReferences.model">
                </xsd:group>
                <xsd:element name="reportingRole" type="ReportingRole" minOccurs="0"></xsd:element>
                <xsd:choice maxOccurs="unbounded">
                    <xsd:element name="tradeId" type="TradeId"></xsd:element>
                    <xsd:element name="versionedTradeId" type="VersionedTradeId"></xsd:element>
                </xsd:choice>
            </xsd:sequence>

        </xsd:choice>
    </xsd:sequence>
</xsd:complexType>

ここにpropOrderがあります:

@XmlType(name = "TradeIdentifier", propOrder = {
    "issuer",
    "tradeId",
    "partyReference",
    "accountReference",
    "reportingRole",
    "tradeIdOrVersionedTradeId"
})

オブジェクト partyReference と tradeId を設定すると、生成される xml は次のようになります。

<partyTradeIdentifier>
    <tradeId>NONREF</tradeId>
    <partyReference href="Party2"/>
</partyTradeIdentifier>

次のエラーで XSD 検証に失敗します。

[org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'tradeId'. One of '{"http://www.nsd.ru/repository/fpml-5.4":issuer, "http://www.nsd.ru/repository/fpml-5.4":partyReference}' is expected.]

解決策は、tradeId の前に partyReference 要素を配置することです。手動で行うと、すべてが機能します。しかし、生成されたクラスを手動で変更したくありません。スキーマが変更された場合、そのような操作を繰り返さなければならないからです。これは地獄への道です。

1 つの tradeId の名前を変更しようとしたため、2 つのフィールドが存在します。しかし、代わりに 1 つの tradeId フィールドの名前が変更されるだけで、問題は残ります。

4

1 に答える 1

1

binding.xml

次のバインディング ファイルを使用して、XML スキーマからクラスを生成してみてください。

<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xsi:schemaLocation="
http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    version="2.1">
    <globalBindings>
        <xjc:simple />
    </globalBindings>
</bindings>

XJCコール

xjc -extension -b binding.xml schema.xsd
于 2013-04-24T12:18:05.867 に答える