これ<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();
}
}
そして、それは正常に実行されます。