1. ホーム
  2. xml

[解決済み] cvc-complex-type.2.4.a: 要素 'ProcessDesc' で始まる無効なコンテンツが見つかりました。ProcessNameのいずれかが期待されます。

2022-02-12 07:45:15

質問

Validatorクラスでjaxbオブジェクトを検証しています。下記はjaxbオブジェクトを検証するために使用しているコードです。しかし、検証中にこのエラーが発生しました。

jc = JAXBContext.newInstance(obj.getClass());
source = new JAXBSource(jc, obj);
Schema schema = schemaInjector.getSchema();
Validator validator = schema.newValidator();
validator.validate(source);

ERROR(SAXParseException): cvc-complex-type.2.4.a: 要素 'ProcessDesc' で始まる無効なコンテンツが見つかりました。ProcessName のいずれかが必要です。

私のxsdで何が間違っていて、このエラーを引き起こしているのか理解できません。私の xsd ファイルで定義されている要素は以下の通りですが、この要素に対してエラーが発生します。

<xs:schema xmlns:cc="http://www.ms.com/cm.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ms.com/cm.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:complexType name="Process">
    <xs:sequence>
      <xs:element name="ProcessId" type="xs:int" />
      <xs:element name="ProcessName" type="xs:string" />
      <xs:element name="ProcessDesc" type="xs:string" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>

よろしくお願いします。ありがとうございます。

どのように解決するのですか?

XML スキーマのコード

<xs:complexType name="Process">
  <xs:sequence>
    <xs:element name="ProcessId" type="xs:int" />
    <xs:element name="ProcessName" type="xs:string" />
    <xs:element name="ProcessDesc" type="xs:string" minOccurs="0" />
  </xs:sequence>
</xs:complexType>

は、次のようなXMLを記述しています。

<proc> <!-- of type Process -->
  <ProcessId>123</ProcessId>
  <ProcessName>procA</ProcessName>
  <ProcessDesc>A funny process</ProcessDesc> <!-- this could be omitted -->
<proc>

しかし、あなたのXMLデータは次のようになります。

<proc> <!-- of type Process -->
  <ProcessId>123</ProcessId>
  <ProcessDesc>A funny process</ProcessDesc>
  <!-- ... don't know what follows -->

Id、Name、Descの順番を気にしないのであれば、XMLスキーマを変更する必要があります。そうでなければ、XMLを修正する必要があります(これはより簡単です)。

要素の順序を問わないということであれば、quot;any order of elements"を使用します。

<xs:complexType name="Process">
  <xs:all>
    <xs:element name="ProcessId" type="xs:int" />
    <xs:element name="ProcessName" type="xs:string" />
    <xs:element name="ProcessDesc" type="xs:string" minOccurs="0" />
  </xs:all>
</xs:complexType>