9

私は xjc を使用して XML スキーマから Java クラスを生成しています。以下は XSD の抜粋です。

<xs:element name="NameInfo">
  <xs:complexType>
    <xs:sequence>
      <xs:choice>
        <xs:element ref="UnstructuredName"/> <!-- This line -->
        <xs:sequence>
          <xs:element ref="StructuredName"/>
          <xs:element ref="UnstructuredName" minOccurs="0"/> <!-- and this line! -->
        </xs:sequence>
      </xs:choice>
      <xs:element ref="SomethingElse" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

ほとんどの場合、生成されたクラスは問題ありませんが、上記のブロックでは次のようになります。

public List<Object> getContent() {
  if (content == null) {
    content = new ArrayList<Object>();
  }
  return this.content;
}

その上に次のコメントを付けます。

* You are getting this "catch-all" property because of the following reason: 
* The field name "UnstructuredName" is used by two different parts of a schema. See: 
* line XXXX of file:FILE.xsd
* line XXXX of file:FILE.xsd
* To get rid of this property, apply a property customization to one 
* of both of the following declarations to change their names: 
* Gets the value of the content property.

問題の 2 行の最後にコメントを入れました。

現時点では、スキーマを変更するのは簡単ではないと思います。これはベンダー間で決定されたものであり、進行がかなり遅くなるため、(可能であれば) このルートには行きたくありません。

検索したところ、このページを見つけました。外部カスタマイズは私がやりたいことですか? 私は主に生成されたクラスを扱ってきたので、これらのクラスを生成するプロセスに完全に精通しているわけではありません。「プロパティのカスタマイズ」の簡単な例は素晴らしいでしょう! Java クラスを生成する別の方法は、スキーマを使用できる限り問題ありません。

UnstructuredName編集:2つが実際に同じ要素であることを明確にする必要があります。

4

4 に答える 4

5

と呼ばれるバインディングのカスタマイズを使用することもできます<xjc:simple />

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings 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:version="2.0">
        <jxb:globalBindings>
            <xjc:simple />
        </jxb:globalBindings>
</jxb:bindings>

ただし、これはベンダー固有であることに注意してください (ただし、XJC 以外のものを使用しているのは ;) )

詳細はこちら

于 2012-10-17T08:19:37.563 に答える
2

私は同じ問題を抱えています。私はxmlbeansと軸に切り替えました。XMLBeans は問題なく、問題なくスキーマをコンパイルできます。JaxB はこれを処理できません。JaxB にこれを処理させるために、スキーマを少し変更することができます。

  <xs:sequence>
          <xs:choice>
    <!-- changed the following line -->
            <xs:element name="UnstructuredTop" type="UnstructuredName"/> 
    <!-- end of change -->
            <xs:sequence>
              <xs:element ref="StructuredName"/>
              <xs:element ref="UnstructuredName" minOccurs="0"/>
            </xs:sequence>
          </xs:choice>
          <xs:element ref="SomethingElse" minOccurs="0"/>
    </xs:sequence>

その後、JaxB は 2 つを区別し、反転しません。

しかし、あなたの状況は私の状況のようです。スキーマを変更することは問題外でした。そこで、xmlBeans と軸 (sux) を使用しました。

于 2011-03-03T23:08:54.840 に答える
1

ここでの本質的な問題は、 Java で「物事の a」に変換される<xs:sequence>で構成される があることです。Java の型構造は、これをより適切に表現できるほど柔軟ではありません。<xs:choice>List

バインディングのカスタマイズが役立つかもしれませんが、この場合、この情報を表現するより良い方法が見つからないため、そうではないと思います。

私が過去に使用した代替手法は、最初に単純な XSLT 変換を介してスキーマを渡し、コンポーネントをより JAXB に適したものに再配置しながら、ドキュメントが実際に持つのと同じ構造を許可することです。このようにして、元のスキーマを変更せずにスキーマを「変更」できます。

于 2010-04-27T08:47:12.153 に答える