1

Java-xml バインディングに JAXB を使用しています。最初にドメイン クラスを作成し、次にschemagenコマンドライン ツールを使用して、次のスキーマが生成されました。しかし、生成されたスキーマは有効ではなく、次のエラー メッセージが表示されます。

エラー メッセージ: cos-all-limited.1.2: すべてのモデル グループは、{最小発生数} = {最大発生数} = 1 のパーティクルに出現する必要があり、そのパーティクルは、{コンテンツ タイプ} を構成するペアの一部である必要があります。複合型定義。

ユース ケース: Emp (基本クラス) と Dept (子クラス) の 2 つのクラスがあります。
1. 要素の順序に制限はありません (つまり、empId、deptId、および deptName は任意の順序で表示できます)。そのため、xs:all 要素を使用し
ました。 2. Dept クラスでは、deptId フィールドは 1 回だけ出現する必要があり (minOccurs =1、maxOccurs=1)、deptName はオプションです。
私のユースケースによると、有効なスキーマを生成できません。グーグルで検索しました。しかし、私は解決策を見つけることができませんでした。したがって、専門家がこの質問に答えることができると期待しています。以下のクラス、スキーマを調べて、正しい方向に導いてください。

注: 一時的なドメイン クラスをいくつか作成するように勧めないでください。
ありがとうございます。

Emp.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="EmpType", propOrder={})
@XmlRootElement
public class Emp {

    @XmlElement(name="empId", required = true)
    private String empId;
}

部門.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="DeptType", propOrder={})
public class Dept extends Emp
{

    @XmlElement(name="deptId", required = true)
    private String deptId;
    private String deptName;
}

Schema1.xsd

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="emp" type="EmpType"/>

  <xs:complexType name="EmpType">
    <xs:sequence>
      <xs:element name="empId" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="DeptType">
    <xs:complexContent>
      <xs:extension base="EmpType">
        <xs:all>  <!--showing error message, mentioned above -->
          <xs:element name="deptId" type="xs:string" minOccurs="1" maxOccurs="1"/>
          <xs:element name="deptName" type="xs:string" minOccurs="0"/>
        </xs:all>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>
4

1 に答える 1

1

許可しようとしている文書構造は、実際には XML スキーマで表現するのが困難です。JAXB (JSR-222)アノテーション付きモデルからは生成できない場合があります。ただし、いくつかのオプションがあります。

オプション #1 - より単純な XML スキーマを生成する

XML スキーマで XML コンテンツを検証しておらず、人々がガイドとして使用できるドキュメントとして単純に使用している場合は、allセクションを削除してsequence代わりに使用します。これは、あなたが持っている継承関係でうまく機能します。のインスタンスを指定しない場合、要素SchemaUnmarshaller順序は強制されないため、ルールを満たすすべての XML ドキュメントを読み取ることができます。

オプション #2 - 独自の XML スキーマを作成する

可能なすべての入力を XML スキーマに正確に反映させたい場合は、自分で記述する必要があります。@XmlSchemaパッケージ レベルの注釈を使用して、この既存の XML スキーマを参照できます。

@XmlSchema(location = "http://www.example.com/package/YourSchema.xsd")
package com.example;

import javax.xml.bind.annotation.XmlSchema;
于 2012-10-24T16:32:49.897 に答える