XML スキーマの再利用

xmlschema!​ モジュールローダーを使用して、XML スキーマファイル (​.xsd​) をモジュールとして DataWeave スクリプトにインポートできます。このローダーにより、各自のスキーマで宣言されている型を DataWeave で直接使用できます。 DataWeave は、XSD ファイルを読み込み、ファイルの宣言を他の DataWeave モジュールの型と同じようにアクセスできる DataWeave 型ディレクティブを変換します。ディレクティブを使用して、新しい型を作成したり、変数の型をチェックしたり、パターンを照合したり、型を使用する新しい関数を宣言したりします。DataWeave では、これらの型の使用方法に制限はありません。

次の例は、DataWeave スクリプトでパス ​org/weave/myfolder/User.xsd​ の XSD ファイルを検索する方法を示しています。

import * from xmlschema!org::weave::myfolder::User

インポート構文

XML スキーマの型をインポートするには、以下の構文を使用します。

  • typeToImport​: *​ を使用してスキーマで定義されているすべての型をインポートしたり、スキーマの 1 つの型 (​Root​ など) をインポートしたりできます。異なる名前の XML スキーマの型 (​Root as Person​ など) をインポートすることもできます。これにより、スクリプトでその名前を使用して型を参照できます。

  • pathToXsdSchemaFile​: スキーマファイルへのパスを指定するには、ファイルの区切り文字を ​::​ に置き換えて、ファイル名の ​.xsd​ 拡張子を削除します。たとえば、スキーマへのパスが ​example/schema/Person.xsd​ の場合、​example::schema::Person​ を使用します。

import _typesToImport_ from xmlschema!_pathToXsdSchemaFile_

次の例は、型をインポートする方法を示しています。

import * from xmlschema!example::schema::Person

DataWeave スクリプトでの型の使用

次の例は、型を使用して XML スキーマファイルを DataWeave スクリプトにインポートする方法を示しています。

XSD ファイル (​User.xsd​):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Root">
        <xs:complexType>
            <xs:choice>
                <xs:element name="employee" type="employee"/>
                <xs:element name="member" type="member"/>
            </xs:choice>
            <xs:attribute name="id" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="employee">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>


    <xs:complexType name="member">
        <xs:sequence>
            <xs:element name="id" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
DataWeave スクリプト:
%dw 2.0
import * from xmlschema!org::weave::myfolder::User


{
      Root @(id:"test") :{
        employee: {
            "name": "Mariano"
        }
      } match {
             case is Root -> true
             else -> false
        }
}

XML モデルから DataWeave 型へ

XML スキーマの型システムは DataWeave 型ディレクティブに変換されますが、この 2 つの型モデルは異なるため、結果として DataWeave 型で表される XML モデルがまったく同じにはならない可能性があります。 次のファイルは、XSD がどのように DataWeave コードに変換されるのかを示しています。これらのファイルは動的に生成されて表示されませんが、生成された XSD ファイルの型がどのようにコンシュームされるのかを理解するのに役立ちます。

組み込みの XML スキーマの型

DataWeave では、次の XSD 型がサポートされています。​xs​ は XMLSchema のデフォルトの名前空間です。

XSD 型 DataWeave 型

xs:number

Number

xs:int

Number

xs:integer

Number

xs:long

Number

xs:short

Number

xs:byte

Number

xs:double

Number

xs:decimal

Number

xs:unsignedLong

Number

xs:unsignedInt

Number

xs:unsignedShort

Number

xs:unsignedByte

Number

xs:positiveInteger

Number

xs:negativeInteger

Number

xs:nonNegativeInteger

Number

xs:nonPositiveInteger

Number

xs:hexBinary

Binary

xs:base64Binary

Binary

xs:boolean

Boolean

xs:any

String

xs:string

String

xs:normalizedString

String

xs:datetime

DateTime

xs:time

Time

xs:date

LocalDateTime

XSD:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Root">
        <xs:complexType>
            <xs:all>
                <xs:element name="string" type="xs:string"/>
                <xs:element name="normalizedString" type="xs:normalizedString"/>


                <xs:element name="integer" type="xs:integer"/>
                <xs:element name="negativeInteger" type="xs:negativeInteger"/>
                <xs:element name="int" type="xs:int"/>
                <xs:element name="unsignedInt" type="xs:unsignedInt"/>
                <xs:element name="unsignedLong" type="xs:unsignedLong"/>
                <xs:element name="unsignedShort" type="xs:unsignedShort"/>
                <xs:element name="float" type="xs:float"/>
                <xs:element name="double" type="xs:double"/>


                <xs:element name="date" type="xs:date"/>
                <xs:element name="dateTime" type="xs:dateTime"/>
                <xs:element name="time" type="xs:time"/>


                <xs:element name="boolean" type="xs:boolean"/>


                <xs:element name="hexBinary" type="xs:hexBinary"/>
                <xs:element name="base64Binary" type="xs:base64Binary"/>
                <xs:element name="decimal" type="xs:decimal"/>








            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>
生成された DataWeave モジュール
%dw 2.0


type RootElementDefinition = {| Root: { string: String, normalizedString: String, integer: Number, negativeInteger: Number, int: Number, unsignedInt: Number, unsignedLong: Number, unsignedShort: Number, float: Number, double: Number, date: LocalDateTime, dateTime: DateTime, time: Time, boolean: Boolean, hexBinary: Binary, base64Binary: Binary, decimal: Number } |}


type Root = RootElementDefinition

ルート要素の宣言

XSD ファイルで宣言されている各ルート要素 (​<xs:element>​) では、以下が生成されます。

  • 要素名の後に ​ElementDefinition​ 拡張が続く DataWeave ​type​ ディレクティブ。

  • XSD のすべてのルート要素で構成される、​Union​ 型の ​Root​ という ​type​ ディレクティブ。

次の例は、ルート要素を宣言する方法を示しています。

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


    <xs:element name="Root">
        <xs:complexType>
            <xs:sequence>
                <xs:element type="xs:string" name="color" default="Red"/>
                <xs:element type="xs:integer" name="age" default="12"/>
            </xs:sequence>
            <xs:attribute type="xs:string" name="type" default="ALBA"/>
        </xs:complexType>
    </xs:element>


    <xs:element name="AnotherRoot">
        <xs:complexType>
            <xs:sequence>
                <xs:element type="xs:string" name="name" default="Red"/>
            </xs:sequence>
            <xs:attribute type="xs:string" name="type"/>
        </xs:complexType>
    </xs:element>
</xs:schema>
生成された DataWeave モジュール
%dw 2.0


type AnotherRootElementDefinition = {| AnotherRoot @("type"?: String): {- name: String -} |}


type RootElementDefinition = {| Root @("type"?: String): {- color: String, age: Number -} |}


type Root = AnotherRootElementDefinition | RootElementDefinition

複雑型

各自のスキーマで参照したり、他の構造で再利用したりできる、スキーマの最上位要素として宣言されている名前付き複雑型は、独自の型ディレクティブを生成します。これらの型ディレクティブ名には、​Definition​ 拡張が続く ​complextype​ 名が含まれます。

次の例は、複雑型を宣言する方法を示しています。

XSD:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Root">
        <xs:complexType>
            <xs:choice>
                <xs:element name="employee" type="employee"/>
                <xs:element name="member" type="member"/>
            </xs:choice>
            <xs:attribute name="id" default="foo"/>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="employee">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>


    <xs:complexType name="member">
        <xs:sequence>
            <xs:element name="id" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
生成された DataWeave モジュール
%dw 2.0


type EmployeeDefinition = { employee: {- name: String -} }


type MemberDefinition = { member: {- id: String -} }


type RootElementDefinition = {| Root @(id?: String): {| employee: EmployeeDefinition.employee |} | {| member: MemberDefinition.member |} |}


type Root = RootElementDefinition

Imports/Includes

XSD スキーマファイルの imports または includes を使用すると、指定された ​schemaLocation​ にあるスキーマファイルを参照するために XML スキーマモジュールローダーを使用する ​import​ ディレクティブが DataWeave モジュールに含まれます。この場所は、メインスキーマに相対的に宣言されている必要があります。次の例の型の選択の使用方法に注意してください。

XSD:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
						xmlns:common="http://common.com/COMMON">


	<xsd:import schemaLocation="common.xsd" namespace="http://common.com/COMMON" />


	<xsd:element name="Root" type="common:RequestHeader"/>


</xsd:schema>
生成された DataWeave モジュール
%dw 2.0


ns ns0 http://common.com/COMMON


import xmlschema!org::mule::weave::v2::module::xmlschema::moduleloader::imports::common


type RootElementDefinition = {| Root: common::RequestHeaderDefinition.ns0#RequestHeader |}


type Root = RootElementDefinition

Choice

この XML スキーマ構造を DataWeave の ​UnionType​ にマップできます。

XSD:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Root">
        <xs:complexType>
            <xs:choice>
                <xs:element name="employee" type="employee"/>
                <xs:element name="member" type="member"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="employee">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>


    <xs:complexType name="member">
        <xs:sequence>
            <xs:element name="id" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
生成された DataWeave モジュール
%dw 2.0


type EmployeeDefinition = { employee: {- name: String -} }


type MemberDefinition = { member: {- id: String -} }


type RootElementDefinition = {| Root: {| employee: EmployeeDefinition.employee |} | {| member: MemberDefinition.member |} |}


type Root = RootElementDefinition

名前空間

XML スキーマファイルの名前空間は、DataWeave 型ディレクティブに直接変換されます。

次の例は、要素が存在する特定の ​targetNamespace​ 属性を設定する方法を示しています。DataWeave に変換されるこの名前空間では、これらの型の選択および移動が必要になります。

XSD:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema attributeFormDefault="unqualified" targetNamespace="http://NamespaceTest.com/CommonTypes" elementFormDefault="qualified"  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Root">
        <xs:complexType>
            <xs:all>
                <xs:element name="string" type="xs:string"/>
                <xs:element name="normalizedString" type="xs:normalizedString"/>
                <xs:element name="integer" type="xs:integer"/>
                <xs:element name="negativeInteger" type="xs:negativeInteger"/>
                <xs:element name="int" type="xs:int"/>
                <xs:element name="unsignedInt" type="xs:unsignedInt"/>
                <xs:element name="unsignedLong" type="xs:unsignedLong"/>
                <xs:element name="unsignedShort" type="xs:unsignedShort"/>
                <xs:element name="float" type="xs:float"/>
                <xs:element name="double" type="xs:double"/>
                <xs:element name="date" type="xs:date"/>
                <xs:element name="dateTime" type="xs:dateTime"/>
                <xs:element name="time" type="xs:time"/>
                <xs:element name="boolean" type="xs:boolean"/>
                <xs:element name="hexBinary" type="xs:hexBinary"/>
                <xs:element name="base64Binary" type="xs:base64Binary"/>
                <xs:element name="decimal" type="xs:decimal"/>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>
生成された DataWeave モジュール
%dw 2.0


ns ns0 http://NamespaceTest.com/CommonTypes


type RootElementDefinition = {| ns0#Root: { ns0#string: String, ns0#normalizedString: String, ns0#integer: Number, ns0#negativeInteger: Number, ns0#int: Number, ns0#unsignedInt: Number, ns0#unsignedLong: Number, ns0#unsignedShort: Number, ns0#float: Number, ns0#double: Number, ns0#date: LocalDateTime, ns0#dateTime: DateTime, ns0#time: Time, ns0#boolean: Boolean, ns0#hexBinary: Binary, ns0#base64Binary: Binary, ns0#decimal: Number } |}


type Root = RootElementDefinition