7
<ProductInformation Context="GL">
 <Assets>
  <Asset ID="assetID" UserTypeID="ID">
    <Name>name</Name>
    <Reference ClassificationID="id"/>
      <Values>
        <Value AttributeID="ID">Value1</Value>
        <Value AttributeID="ID">Value2</Value>
          <MultiValue AttributeID="attributeID">
             <Value>value3a</Value>
             <Value>value3b</Value>
          </MultiValue>
     </Values>
   </Asset>
 </Assets>

 <Products>....</Products>

</ProductInformation>

このxml->xsdとxjcを使用して、そこからクラスを作成しました。

次に、ProductInformationオブジェクトを作成し、それをマーシャリングします。

私の問題は、xjcが3つのクラスとobjectfactoryを作成し、ProductInformation内にいくつかのネストされたクラスを作成することです。利用可能なメソッドを見ると、ほとんどの場合、セッターではなくゲッターが表示されます。

「Asset」クラスには、次のようなメソッドはありません。

asset.setValues(List<Value> values)

また、私はこのような面白いコードを書くことになりました。

ProductInformation.Assets.Asset.Values.MultiValue multivalue=new ProductInformation.Assets.Asset.Values.MultiValue();

これはJaxbでは正常ですか?

4

3 に答える 3

5

JAXB が通常複数の値を持つプロパティを処理する方法は、getter のみを提供し、変更可能なリストを返す setter を提供しないList<Whatever>ことです。最初は空のリストを取得するために getter を呼び出してから、このリストのメンバー オブジェクトを作成する必要があります。new通常の方法で使用し、addそれらを直接リストに追加します。newトップレベルのクラスとまったく同じ方法で、静的なネストされたクラスを作成できます。

単一値のプロパティ (リストではない) は、getter と setter の両方で生成されている必要があります。

于 2012-11-16T10:17:03.303 に答える
1

これは実際には Blaise Doughan の回答に対する単なるコメントですが、xml を投稿したいと思います。

より複雑な xsd で作業していて、node属性のパスが長くなりすぎている場合は、次のことができます。

<jaxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
    <jaxb:globalBindings localScoping="toplevel"/>
    <jaxb:bindings schemaLocation="company.xsd">
        <jaxb:bindings node="//xsd:element[@name='employee']">
            ....
                <jaxb:bindings node=".//xsd:element[@name='address']/xsd:complexType">
                    <jaxb:class name="EmployeeAddress"/>
                </jaxb:bindings>
            ....
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>
于 2018-07-27T11:29:31.760 に答える