XML Module を使用した XSD スキーマに対するドキュメントの検証 - Mule 4

XML Module の ​Validate schema​ 操作は、入力コンテンツが指定した XSD スキーマに準拠していることを検証します。操作では、カンマ (​,​) を区切り文字として使用して多数のスキーマを参照できます。 デフォルトではこの操作はメッセージペイロードレベルで入力ドキュメントを検索しますが、独自の入力を指定することもできます。 Validation Module の ​All​ スコープ内で ​Validate schema​ 操作を使用できます。

Studio で Validation Schema 操作を設定する

次の例では、スクリプトが含まれる XML スキーマを検証します。

  1. Studio で、​Validate schema​ 操作をフローにドラッグします。 [Schemas (スキーマ)]​ 項目で、カンマを使用してファイル名を区切ってスキーマファイルを追加します (例: schema1.xsd, schema2.xsd​)。

  2. [Flow Reference]​ コンポーネントを ​[Validate schema]​ 操作の右にドラッグします。

  3. [Flow name (ファイル名)]​ を ​processValidDocument​ に設定します。

「Schemas (スキーマ)」 項目で、スキーマ名ファイルを追加します。

設定 XML​ エディターでは、​<xml-module:validate-schema>​ 設定は次のように記述されます。

<flow name="process">
    <xml-module:validate-schema schemas="schema1.xsd, schema2.xsd" />
    <flow-ref name="processValidDocument" />
</flow>
xml

次の例では、独自の入力を行って ​Validate schema​ 操作を設定します。

  1. Studio で、​File Read​ 操作をフローにドラッグします。

  2. 設定画面で、​[File Path (ファイルパス)]​ を ​document.xml​ に設定します。

  3. [Advanced (詳細)]​ タブで、​[Target Variable (対象変数)]​ を ​xmlDoc​ に設定します。

  4. XML Module の ​[Validate schema]​ 操作を ​[Read]​ 操作の右にドラッグします。

  5. [Schemas (スキーマ)]​ 項目で、スキーマを追加し、カンマを使用してそれらの名前を区切ります (例: schema1.xsd, schema2.xsd​)。

  6. [Content (コンテンツ)]​ 項目を検証する XML コンテンツに設定します (例: #[vars.xmlDoc]​)。

  7. [Flow Reference]​ コンポーネントを ​[Validate schema]​ 操作の右にドラッグします。

  8. [Flow name (ファイル名)]​ を ​processValidDocument​ に設定します。

「Content (コンテンツ)」 項目で、検証する XML コンテンツファイルを追加します。

設定 XML​ エディターでは、​<xml-module:validate-schema>​ および ​<xml-module:content>​ 設定は次のように記述されます。

<flow name="process">
    <file:read path="document.xml" target="xmlDoc" />
    <xml-module:validate-schema schemas="schema1.xsd, schema2.xsd">
        <xml-module:content>#[vars.xmlDoc]</xml-module:content>
    </xml:module:validate-schema>
    <flow-ref name="processValidDocument" />
</flow>
xml

検証エラーを管理する

検証に成功した場合はフローの次の操作に進みます。ただし、検証に失敗すると、​XML-MODULE:SCHEMA_NOT_HONOURED​ エラーが発生します。
検証に失敗する理由は複数あるため、エラーの説明にはメッセージのリストが含まれます。各メッセージには、次のような構造の ​SchemaViolation​ オブジェクトが含まれます。

{
  lineNumber: Number,
  columnNumber: Number,
  description: String
}
yaml

次の例では、​Validate schema​ 操作と Error Handler コンポーネントの ​XML-MODULE:SCHEMA_NOT_HONOURED​ エラーを設定します。

  1. Studio で ​Try​ スコープコンポーネントをフローにドラッグします。

  2. XML Module の ​[Validate schema]​ 操作を ​[Try]​ スコープコンポーネントにドラッグします。

  3. [Schemas (スキーマ)]​ 項目で、スキーマを追加します (例: schema.xsd​)。

  4. フローで、​[Error handling (エラー処理)]​ 矢印をクリックして、[error-handling (エラー処理)] セクションを展開します。

  5. [On Error Propagate]​ コンポーネントを ​[Error handling (エラー処理)]​ セクションにドラッグします。

  6. [Type (種別)]​ 項目をこの On-Error 戦略によって処理される Mule エラーに設定します (例: XML-MODULE:SCHEMA_NOT_HONOURED​)。

  7. [Enable Notifications (通知を有効化)]​ および ​[Log Exception (例外を記録)]​ 項目をオフにします。

  8. [For Each]​ スコープコンポーネントを ​[On Error Propagate]​ コンポーネントにドラッグして各 ​errorMessage.payload​ を反復処理します。

  9. [Collection (コレクション)]​ 項目を、ペイロードを各部分に分割する式に設定します (例: #[error.errorMessage.payload]​)。

  10. [Logger]​ コンポーネントを ​[For Each]​ スコープコンポーネントにドラッグして、XML Module エラーを記録します。

  11. [Message (メッセージ)]​ 項目を、メッセージを記述する ​SchemaViolation​ オブジェクトが含まれる式に設定します (例: #['At line: $(payload.lineNumber), column: $(payload.columnNumber) → $(payload.description)']​)。

  12. 変更を保存します。

  13. Package Explorer​ でプロジェクト名をクリックし、​[Run (実行)] > [Run As (別のユーザーとして実行)] > [Mule Application (Mule アプリケーション)]​ をクリックします。

  14. コンソールビューに移動して、ロガーメッセージを読み取ります。

    ERROR 2018-02-16 14:35:45,722 [[MuleRuntime].cpuIntensive.01: [SchemaValidationTestCase#extractErrorsUsingExpressions].extractErrorsFromException.CPU_INTENSIVE @411e886b] org.mule.runtime.core.internal.processor.LoggerMessageProcessor: At line: -1, column: -1 -> cvc-complex-type.2.4.a: Invalid content was found starting with element 'fail'. One of '{used}' is expected.
    XML Module で検証エラーを管理するフロー

設定 XML​ エディターでは、​<on-error-propagate type="XML-MODULE:SCHEMA_NOT_HONOURED">​ 設定は次のように記述されます。

 <flow name="extractErrorsFromException">
    <try>
        <xml-module:validate-schema schemas="schema.xsd" />
        <error-handler>
            <on-error-propagate type="XML-MODULE:SCHEMA_NOT_HONOURED">
                <foreach collection="#[error.errorMessage.payload]">
                    <logger level="ERROR" message="#['At line: $(payload.lineNumber), column: $(payload.columnNumber) -> $(payload.description)']" />
                </foreach>
            </on-error-propagate>
        </error-handler>
    </try>
</flow>
xml

スキーマテキストコンテンツを設定する

次の例では、​Validate schema​ 操作の ​[Schema contents (スキーマコンテンツ)]​ 項目を設定します。スキーマテキストをこの項目に入力して、スキーマ検証を実行します。

スキーマコンテンツを追加するには、スキーマとスキーマコンテンツの両方ではなくいずれかのみを指定します。​[Schemas (スキーマ)]​ 項目でファイルをアップロードするか、または ​[Schema contents (スキーマコンテンツ)]​ 項目で直接スキーマテキストコンテンツを手動で追加することができます。
  1. Studio で、フローから ​Validate schema​ 操作を選択します。

  2. Validate schema​ 操作の設定画面で、​[Schema contents (スキーマコンテンツ)]​ を ​[Edit inline (インライン編集)]​ に設定します。

Validate schema の設定画面で [Edit inline (インライン編集)] に設定された [Schema content (スキーマコンテンツ)] 項目
  1. プラス記号をクリックして、スキーマ名とテキストを追加します。

  2. [Schema content (スキーマコンテンツ)]​ ウィンドウの ​[Schema name (スキーマ名)]​ 項目に、​schema1.xsd​ などのスキーマ名を入力します。

  3. [Schema text (スキーマテキスト)]​ 項目に、次のようなスキーマテキストコンテンツを入力します。

<?xml version = "1.0"?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
             <xs:element name = 'student' type = 'StudentType' minOccurs = '0'
                maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
</xs:schema>
xml
「Schema name (スキーマ名)」 項目と 「Schema text (スキーマテキスト)」 項目が含まれる 「Schema content (スキーマコンテンツ)」 ウィンドウ
  1. [Finish (完了)]​ をクリックします。