2016-06-17 17 views
0

JAXB xjcコマンドラインツールを使用してXMLスキーマ(.xsdファイル)をJavaオブジェクトに変換しています。ここでJAXBでJavaクラスを生成するとき、どのように各クラスにカスタムフィールドを追加できますか?

私の.xsdファイルの内容をされていますOwnerDog.java、ToyType.java、およびObjectFactory.java:私はの.xsd実行すると

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="ownerDog"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="owner" type="xs:string" /> 
      <xs:element name="dog" type="xs:string"/> 
      <xs:element name="toy" type="toyType"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:complexType name="toyType"> 
    <xs:sequence> 
     <xs:element name="color" type="xs:string" /> 
     <xs:element name="price" type="xs:integer" /> 
    </xs:sequence> 
</xs:complexType> 

</xs:schema> 

は、私は三つのクラスを取得します。

OwnerDog.javaとToyType.javaにカスタムフィールドを追加したいと思います。このフィールドは、XMLツリーの各ノードの統計を追跡するために使用する簿記クラスへの参照になります。

たとえば、これは私がToyType.javaのために得るコードです:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "toyType", propOrder = { 
    "color", 
    "price" 
}) 
public class ToyType { 

    @XmlElement(required = true) 
    protected String color; 
    @XmlElement(required = true) 
    protected BigInteger price; 

    public String getColor() { 
     return color; 
    } 

    public void setColor(String value) { 
     this.color = value; 
    } 

    public BigInteger getPrice() { 
     return price; 
    } 

    public void setPrice(BigInteger value) { 
     this.price = value; 
    } 

} 

私はそれは次のようになりたいと思います:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "toyType", propOrder = { 
    "color", 
    "price" 
}) 
public class ToyType { 

    private BookKeeper bk; 

    @XmlElement(required = true) 
    protected String color; 
    @XmlElement(required = true) 
    protected BigInteger price; 

    public String getColor() { 
     return color; 
    } 

    public void setColor(String value) { 
     this.color = value; 
    } 

    public BigInteger getPrice() { 
     return price; 
    } 

    public void setPrice(BigInteger value) { 
     this.price = value; 
    } 

} 

は、JAXBにフィールドを追加する方法はあります生成されたクラスはプログラムによって?明らかに、私の例では手動で行うのは簡単ですが、これはずっと大きな生産上の問題のための練習問題です。

元の.xsdファイルを変更できません。まだ見たことがない複数の.xsdファイルで動作するようにする必要があります。

答えて

0

それは少し厄介ですが、私は小さなbashスクリプトでこれを達成することができました:

xjc -p com.company.ustruc_to_xml OwnerDog.xsd 
cd ./com/company/ustruc_to_xml 
for f in *.java; do sed -i 's/\(^public class .*$\)/\1\n\n private BookKeeper bk;/' $f; done 
cp *.java /Users/car/Documents/workspace/proj_ustruc_to_xml/src/com/ibm/ustruc_to_xml 
0

私はJAXBを使用してカスタムフィールドを作成する方法を知りません。

プロジェクトの構造を変更することをお勧めします。私はJAXBデータ変数(ToyTypeまたは)を保持し、BookKeeperも保持する型を作成します。これは派生型である可能性があります。

生成されたJAXBコードを手動で変更すると、システムまたは開発チームが大きくなった場合に、より困難にすることができます。

関連する問題