2

私はこの信じられないほど単純なマッピングに本当に困惑しています。例の1つのように見えます。内部構造をコメントアウトすると、バインディング コンパイラが正常に実行されます。内部構造を元に戻すと、失敗します。内部構造は XML を定義しているだけであることに注意してください。これは基本的に、JIBX チュートリアルの例の example5 です。

<binding>
  <mapping name="RequestTransaction" class="TransactionRequest">
    <value name="version" set-method="setVersion" get-method="getVersion" style="attribute" />
    <structure name="transHeader">
      <value name="requestCount" set-method="setRequestCount" get-method="getRequestCount"/>
    </structure>
  </mapping>
 <binding>

次に、jibx コンパイルで次のエラーが発生します。

エラー: 検証中のエラー: null; マッピング要素 (jibx-binding.xml の行 2、列 97)

私は完全に困惑しており、アイデアがありません。Google は役に立たないことを示しています。

4

2 に答える 2

1

これ<structure>は、間違いなく、JiBX バインディングで最も重要な概念です。これにより、入れ子になった Java オブジェクトとクラスの肥大化した醜いレイヤーを作成して XML 設計に一致させることなく、任意の XML を Java クラスにマップできるからです。

この場合、バインディング<transHeader>は、Java クラスに存在しないという名前の XML 要素があることを宣言します。

XML 形式に若干の修正を加えると、バインディングは完全に機能します。あなたのバインディングには<binding>open と close ではなく 2 つの open タグがあるという事実<binding></binding>はタイプミスだと思います。構造なしで動作するようになったと言ったからです。<?xml version="1.0"?>バインディング ファイルの先頭にも追加します。これら 2 つの XML mod により、JiBX 1.2 バインディング コンパイラは次の Java クラスを操作できます。

(注: このバインディングの対象となる Java クラスを提供していないため、バインディング ファイルに入力した情報から再構築する必要がありました。これによる明らかな副作用は、このバインディングで動作するクラスを再構築したことです。しかし、単純な事実として、JiBX バインディングには、クラスと XML について知っておく必要のあるすべての情報が設計上含まれています。)

public class TransactionRequest {
    private String version;
    private int requestCount;

    public void setVersion(String ver) {
        version = ver;
    }

    public String getVersion() {
        return version;
    }

    public void setRequestCount(int count) {
        requestCount = count;
    }

    public int getRequestCount() {
        return requestCount;
    }    
}

クラスをコンパイルしてから、バインディング コンパイラを次のように実行します。

>java -jar jibx-bind.jar jibx-binding.xml

それをテストするために、次の sample.xml を使用しました。

(注:マッピングしようとしているXMLも提供していないため、提供したものに基づいてサンプルを作成しました)

<?xml version="1.0"?>
<RequestTransaction version="0.1">
    <transHeader>
        <requestCount>3</requestCount>
    </transHeader>
</RequestTransaction>

テストを実行するには、次のコードを使用します。

    public static void main(String[] argz) {
        String fileName = "./sample.xml";
        IBindingFactory bfact = null;
        IUnmarshallingContext uctx = null;
        TransactionRequest sample = null;
        try {
            bfact = BindingDirectory.getFactory(TransactionRequest.class);
            uctx = bfact.createUnmarshallingContext();
            InputStream in = new FileInputStream(fileName);
            sample = (TransactionRequest)uctx.unmarshalDocument(in, null);
            System.out.println(sample.getRequestCount());
            System.out.println(sample.getVersion());
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

そして、それは正常に実行されます。

于 2009-08-05T13:19:03.007 に答える