19

私は JAXB と xjc を使用して、XML スキーマを Java クラスにコンパイルしています。この生成されたクラスを手動で編集したくありません。私はそのようなxmlスキーマを持っています:

<xs:element name="root">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="items">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="item" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

xjc はItems、オブジェクトのリストのみを含むクラスを生成しItemます。クラスを省略しItemsて、オブジェクトのリストをクラスItemに直接持つ可能性はありますRootか?

これは注釈で実行できることは知ってい@XMLElementWrapperますが、xjc に注釈を作成するように指示する方法がわかりません。

ご提案ありがとうございます。

よろしく、 マーカス

4

2 に答える 2

11

Bjarne Hansen は、これを処理できる xjc 用のプラグインを開発しました。残念ながら、元の実装へのリンクは現在無効になっています。ただし、github には Dmitry Katsubo によるプロジェクトがあり、Bjarne のオリジナル コードにいくつかの改良が加えられています。

https://github.com/dmak/jaxb-xew-plugin


(参考までに:元のリンクは現在死んでいます:http://www.conspicio.dk/blog/bjarne/jaxb-xmlelementwrapper-plugin

于 2010-03-15T13:44:40.463 に答える
9

最初にスキーマを分割して、内部クラスが生成されないようにします。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">
    <xs:element name="root" type="Root" />

    <xs:complexType name="Root">
        <xs:sequence>
            <xs:element name="items" type="Items" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Items">
        <xs:sequence>
            <xs:element name="item" type="xs:string" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

すべてが 1 つのファイルに含まれているわけではありませんが、追加のクラスを引き続き取得できます。ここで、ビルドにセクションを追加して、jaxb-xew-plugin. 私はMavenを使用しているので、私にとっては次のようになります。

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.8.2</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <args>
                    <arg>-no-header</arg>
                    <arg>-Xxew</arg>
                    <arg>-Xxew:instantiate lazy</arg>
                    <arg>-Xxew:delete</arg>
                </args>
                <plugins>
                    <plugin>
                        <groupId>com.github.jaxb-xew-plugin</groupId>
                        <artifactId>jaxb-xew-plugin</artifactId>
                        <version>1.0</version>
                    </plugin>
                </plugins>
            </configuration>
        </execution>
    </executions>
</plugin>

生成されたクラスにパッケージ名が含まれるように名前空間の使用を開始する場合は、-Xxew:deleteフラグをオフのままにします。これは、オブジェクトを削除してはならない場所で最近修正したバグがあるためです。または、github からコードを取得して、1.1-SNAPSHOT として使用することもできます。

これを行うと、あなたが探していると思われるコードが生成されます。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Root", propOrder = {
    "items"
})
public class Root {

    @XmlElementWrapper(name = "items", required = true)
    @XmlElement(name = "item")
    protected List<String> items;

    public List<String> getItems() {
        if (items == null) {
            items = new ArrayList<String>();
        }
        return items;
    }

    public void setItems(List<String> items) {
        this.items = items;
    }

}
于 2012-09-26T13:05:02.637 に答える