5

私は次のスキーマを持っています

<complexType name="BookShelf">
   <sequence>
      <element name="newBook" type="string" minOccurs="0" maxOccurs="unbounded"/>
      <element name="oldBook" type="string" minOccurs="0" maxOccurs="unbounded"/>
   </sequence>
</complexType>

XJC は、newBook 用と oldBook 用の 2 つのリストを持つ BookShelf クラスを生成します。優秀な!

ここで、本を任意の順序で表示したいと考えています。そこで、スキーマを次のように書き換えます。

<complexType name="BookShelf">
   <sequence>
      <choice minOccurs="0" maxOccurs="unbounded">
         <element name="newBook" type="string"/>
         <element name="oldBook" type="string"/>
      </choice>
   </sequence>
</complexType>

しかし現在、XJC は、 type のリスト newBookOrOldBook を 1 つだけ持つ BookShelf を生成しList<JAXBElement<String>>ます。

本が表示される順序は気にせず、XML ライターが任意の順序で本を指定できるようにしたいのですが、生成された BookShelf クラスで各タイプの本を List として指定したいと考えています。これを達成する方法はありますか?

4

4 に答える 4

2

JAXB2 BasicsのSimplify プラグインを使用できます。順序をあまり気にしない場合は、単純化してプロパティを作成できるため、物事がはるかに簡単になります。以下に例を示します (ドキュメントからの抜粋)。@XmlElements@XmlElementRefs

次の選択を検討してください。

<xs:complexType name="typeWithReferencesProperty">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="a" type="someType"/>
        <xs:element name="b" type="someType"/>
    </xs:choice> 
</xs:complexType>

これは通常、次のようなプロパティを生成します。

@XmlElementRefs({
    @XmlElementRef(name = "a", type = JAXBElement.class),
    @XmlElementRef(name = "b", type = JAXBElement.class)
})
protected List<JAXBElement<SomeType>> aOrB;

この要素を使用して、simplify:as-element-propertyこの複雑なプロパティを 2 つの要素プロパティまたはsimplify:as-reference-property2 つの参照プロパティとして再モデル化できます。

参照プロパティの場合、 ではxs:elementなく のいずれかをカスタマイズする必要があるというわけではありませんxs:choice

<xs:complexType name="typeWithReferencesProperty">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="a" type="someType">
            <xs:annotation>
                <xs:appinfo>
                    <simplify:as-element-property/>
                </xs:appinfo>
            </xs:annotation>
        </xs:element>
        <xs:element name="b" type="someType"/>
    </xs:choice> 
</xs:complexType>

結果:

@XmlElement(name = "a")
protected List<SomeType> a;
@XmlElement(name = "b")
protected List<SomeType> b;
于 2012-03-26T12:46:31.213 に答える
0

カスタムJavaまたはXSLTを作成しない限り、これはJAXBでは不可能だと思います。

JAXB は、あなたのような異なる構造を持つオブジェクトと xml の間のマッピングにはあまり適していません。また、Java で 2 つの別個のリストに変換すると、XML での新しい書籍に対する古い書籍の順序付けが失われ、JAXB は一般に情報を保存したいと考えています。

以下はあなたの質問に答えませが、おそらくあなたが望むものへの一歩です:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="bookShelf" type="BookShelf"/>
  <xs:complexType name="BookShelf">
    <xs:sequence>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="newBook" minOccurs="0" type="xs:string"/>
        <xs:element name="oldBook" minOccurs="0" type="xs:string"/>
      </xs:sequence>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

JAXB でこれを試したことはありませんが、 newBookoldBookの 2 つのフィールドを持つクラスのリストが生成されると思います。そのため、instanceof をキャストしたり使用したりする必要はありませんが、null をチェックしてそれがどれであるかを確認できます。私が言ったように、それは解決策ではありませんが、少し近いかもしれません。

于 2009-05-21T13:05:25.047 に答える
0

たぶん、このようなものですか?

<schema 
   elementFormDefault = "qualified" 
   xmlns              = "http://www.w3.org/2001/XMLSchema"
   xmlns:xs           = "http://www.w3.org/2001/XMLSchema"
   xmlns:tns          = "urn:cheeso.examples.2009.05.listofbooks" 
   targetNamespace    = "urn:cheeso.examples.2009.05.listofbooks" 
  >

  <element name="Shelf" nillable="true" type="tns:BookShelf" />

  <complexType name="BookShelf">
    <sequence>
      <element minOccurs="0" maxOccurs="1" name="Store" type="tns:ArrayOfChoice1" />
    </sequence>
  </complexType>

  <complexType name="ArrayOfChoice1">
    <choice minOccurs="0" maxOccurs="unbounded">
      <element minOccurs="1" maxOccurs="1" name="newBook" nillable="true" type="tns:newBook" />
      <element minOccurs="1" maxOccurs="1" name="oldBook" nillable="true" type="tns:oldBook" />
    </choice>
  </complexType>

  <complexType name="Book">
    <attribute name="name" type="string" />
  </complexType>

  <complexType name="newBook">
    <complexContent mixed="false">
      <extension base="tns:Book" />
    </complexContent>
  </complexType>

  <complexType name="oldBook">
    <complexContent mixed="false">
      <extension base="tns:Book" />
    </complexContent>
  </complexType>

</schema>

もちろん、次のように単純化できます

<schema 
   elementFormDefault = "qualified" 
   xmlns              = "http://www.w3.org/2001/XMLSchema"
   xmlns:xs           = "http://www.w3.org/2001/XMLSchema"
   xmlns:tns          = "urn:cheeso.examples.2009.05.listofbooks" 
   targetNamespace    = "urn:cheeso.examples.2009.05.listofbooks" 
  >

  <element name="Shelf" nillable="true" type="tns:BookShelf" />

  <complexType name="BookShelf">
    <sequence>
      <element minOccurs="0" maxOccurs="1" name="Store" type="tns:ArrayOfChoice1" />
    </sequence>
  </complexType>

  <complexType name="ArrayOfChoice1">
    <choice minOccurs="0" maxOccurs="unbounded">
      <element minOccurs="1" maxOccurs="1" name="newBook" nillable="true" type="xs:string" />
      <element minOccurs="1" maxOccurs="1" name="oldBook" nillable="true" type="xs:string" />
    </choice>
  </complexType>

</schema>
于 2009-05-20T17:15:51.333 に答える
-1

特に、他の要素でそれらの要素のリスト(新旧の本のリスト)を参照することを計画しているため、1つの要素に異なる要素のリストを混在させる(本棚に古い本と新しい本を混在させる)という考えを拒否する必要があると思います. そうしないと、すぐに Java コードの悪夢になってしまいます。次のスキーマで終了しました。

<schema
   xmlns="http://www.w3.org/2001/XMLSchema"
   xmlns:tns="http://www.example.org/books"
   targetNamespace="http://www.example.org/books"
   elementFormDefault="qualified"
>
   <complexType name="BookShelf">
      <sequence>
         <element name="newBooks" type="tns:NewBookList" minOccurs="0" />
         <element name="oldBooks" type="tns:OldBookList" minOccurs="0" />
      </sequence>
   </complexType>

   <complexType name="NewBookList">
      <sequence>
         <element name="newBook" type="tns:NewBook" maxOccurs="unbounded" />
      </sequence>
   </complexType>

   <complexType name="OldBookList">
      <sequence>
         <element name="oldBook" type="tns:OldBook" maxOccurs="unbounded" />
      </sequence>
   </complexType>

   <complexType name="NewBook" />
   <complexType name="OldBook" />
</schema>

私がこれを実現するのを手伝ってくれてありがとう。このスキーマにより、より明確で単純な Java コードと、より読みやすく予測可能な XML ドキュメントが得られます。

于 2009-05-21T15:38:34.177 に答える