4

xsdスキームからxjcを介して自動クラス生成を使用する場合のJAXB

alpha.xsd

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="alpha">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="persons">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="person" maxOccurs="unbounded" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:string" name="name"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

beta.xml

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="country">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="class">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="person">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:string" name="name"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

ご覧のとおりPerson、これら 2 つのスキーム間で共有される要素があります。私がやりたいことは次のとおりです。

  • ObjectFactoryクラスが両方のスキーマ クラスで共有されるように、xjc を使用してクラスを生成します (出力クラスは 1 つのパッケージになります)。
  • ネストされた静的クラスを使用しない (属性を使用localScoping="toplevel")
  • クラスを使用Personしてバインドする/alpha/persons/personため/country/class/person、2つの Person クラスが作成されません

この目的は、1 つの xml をアンマーシャリングし、ビジネス ロジックを適用し、一部の要素 ( などPerson) が同じで両方の xml ファイルで共有される出力として別のものを作成することです。名前空間は両方のファイルで同じになります。

完全な .xjb バインディング設定ファイルを提示していただければ幸いです。これまでのところ、私のものは次のとおりです。

<jxb:bindings version="1.0" 
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
  jxb:extensionBindingPrefixes="xjc">

  <jxb:globalBindings localScoping="toplevel"/>
</jxb:bindings>

Personもちろん、バインディング コンパイラを同じエンティティ/要素として表示するように設定する方法がわからないため、名前の衝突エラーが発生します。

4

2 に答える 2

6

You can use an external binding file to indicate that during class generation we wish to use our existing class for the complex type called Document.

binding.xml

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="beta.xsd">
        <jxb:bindings node="//xs:element[@name='person']/complexType">
            <jxb:class ref="alpha.Person"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

XJC Call

xjc -b binding.xml beta.xsd
于 2013-11-07T15:29:14.807 に答える