XML 形式

MIME タイプ: application/xml

ID: xml

XML データ構造は、他のオブジェクト、文字列、または ​null​ 値が含まれている可能性がある DataWeave オブジェクトにマップされます。XML で無制限要素を使用してコレクションを表します。コレクションは DataWeave オブジェクトの反復キーにマップされます。また、DataWeave では ​namespaces​、​CData​、​xsi:types​ がネイティブにサポートされます。

XML 入力の DataWeave リーダーでは、次の解析戦略がサポートされます。

  • インデックス付き

  • メモリ内

  • ストリーミング

DataWeave リーダーおよびライターでこの形式に適用できる解析戦略を理解するには、​「DataWeave 解析戦略」​を参照してください。

CData​ カスタム型

CData​ は、文字データ (CDATA) ブロックを識別するために使用する XML のカスタム DataWeave データ型です。​CData​ 型により、XML ライターは ​CDATA​ ブロック内でコンテンツをラップしたり、​CDATA​ ブロック内に入力文字列があるかどうかを確認したりできるようになります。DataWeave では、​CData​ は型 ​String​ から継承されます。

DocType​ カスタム型

DocType​ は、文書型宣言 (DTD) を識別するために使用する XML のカスタム DataWeave データ型です。

DTD の読み取りおよび書き込み

DataWeave 2.5.0 で導入されました。Mule 4.5.0 以降でサポートされます。

DataWeave は、XML ファイルの文書型宣言の読み取りおよび書き込みを行うことができます。

文書型宣言を読み取るには、​システムプロパティ​を ​com.mulesoft.dw.xml_reader.parseDtd​ に設定できます。

DataWeave は、読み取りフェーズで文書型宣言を解析して、コンテンツをルート要素のメタデータとして保存します。​DocType​ 値は、​docType​ 変数に保存されます。メタデータセレクター (​^​) を使用して、次のような式でその変数の値を抽出できます。

メタデータセレクター​を使用してアクセスできます。

NOTE

デフォルトでは、宣言が読み取りおよび書き込みされる場合でも、DTD は無効になっています。詳細は、​Reader のプロパティ​の XML リーダープロパティ ​supportDtd​ を参照してください。

次の例は、XML 形式の使用方法を示しています。

さまざまなデータ形式で使用可能なリーダーとライターのプロパティについての詳細は、​「サポートされるデータ形式」​を参照してください。

例: 入力 XML データをストリーミング

次の例は、XML ストリーミングのセットアップ方法を示しています。ユーザーは次のリーダープロパティを指定する必要があります。

  • streaming=true

  • collectionPath="root.repeated"

collectionPath​ 設定では、ストリーミングする要素を選択します。

ストリーミング時は、XML パーサーはすべての XML コンテンツがなくてもコンテンツの処理を開始できます。

入力

次の XML が DataWeave ソースへの入力ペイロードとして機能します。これは ​myXML.xml​ という XML ファイルのコンテンツであるとします。

myXML.xml
<root>
    <text>
        Text
    </text>
    <repeated>
        <user>
            <name>Mariano</name>
            <lastName>de Achaval</lastName>
            <age>36</age>
        </user>
        <user>
            <lastName>Shokida</lastName>
            <name>Leandro</name>
            <age>30</age>
        </user>
        <user>
            <age>29</age>
            <name>Ana</name>
            <lastName>Felissati</lastName>

        </user>
        <user>
            <age>29</age>
            <lastName>Chibana</lastName>
            <name>Christian</name>
        </user>

    </repeated>
</root>

ソース

DataWeave スクリプトのリーダープロパティ設定は、入力をストリーミングして反復キーを処理するように XML リーダーに指示します。スクリプトは DataWeave ​map​ 関数を使用して反復キーを反復処理します。

%dw 2.0
var myInput  readUrl('classpath://myXML.xml', 'application/xml', {streaming:true, collectionPath: "root.repeated"})
output application/dw
---
myInput.root.repeated.*user map {
    n: $.name,
    l: $.lastName,
    a: $.age
}

出力

スクリプトは、マップされた入力 XML を DataWeave (dw) 形式および MIME タイプに変換します。

[
  {
    "n": "Mariano",
    "l": "de Achaval",
    "a": "36"
  },
  {
    "n": "Leandro",
    "l": "Shokida",
    "a": "30"
  },
  {
    "n": "Ana",
    "l": "Felissati",
    "a": "29"
  },
  {
    "n": "Christian",
    "l": "Chibana",
    "a": "29"
  }
]

例: XML の null または空の文字列

XML で ​null​ 値を表す標準の方法はないため、​nil​ 属性が ​true​ に設定されている場合、リーダーは値を ​null​ にマップします。

入力

次の XML が DataWeave ソースへの入力ペイロードとして機能します。 <xsi:nil="true"​/> の ​nil​ 設定に注意してください。

<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <author xsi:nil="true"/>
</book>

ソース

DataWeave スクリプトは入力 XML を JSON 形式および MIME タイプに変換します。

%dw 2.0
output application/json
---
payload

出力

出力は JSON 形式です。入力の ​nil​ 値が ​null​ に変換されていることに注意してください。

{
  "book": {
    "author": null
  }
}

例: 欠落している XML 値に対して ​null​ 値を出力

XML リーダープロパティ ​nullValueOn​ は、値 ​blank​ (デフォルト) または ​empty​ を受け入れます。

次の例では ​nullValueOn​ のデフォルトを使用するため、​title​ および ​author​ 要素の値を ​null​ にマップします。

入力

次の XML が DataWeave ソースへの入力として機能します。​title​ および ​author​ 要素の値がないことに注意してください。

この入力はファイル ​myInput.xml​ 内のコンテンツであるとします。

myXML.xml コンテンツ:
<book>
    <author></author>
    <title>

</title>
</book>

ソース

DataWeave スクリプトは XML 入力を JSON に変換します。デモ目的で ​nullValueOn​ のデフォルト (​blank​) が明示的に設定されていることに注意してください。

%dw 2.0
var myInput readUrl('classpath://myXML.xml', 'application/xml', {nullValueOn: "blank"})
output application/json
---
myInput

出力

JSON 出力の ​title​ および ​author​ キーは ​null​ 値に割り当てられます。

{
  "book": {
    "author": null,
    "title": null
  }
}

例: 欠落している XML 値に対して ​null​ 値を出力

XML リーダープロパティ ​nullValueOn​ は、値 ​blank​ (デフォルト) または ​empty​ を受け入れます。

次の例では、XML リーダープロパティ ​nullValueOn​ が ​empty​ に設定されているため、​title​ 要素の値を ​String​ にマップし、​author​ 要素の値を ​null​ にマップします。

入力

次の XML が DataWeave ソースへの入力として機能します。​title​ および ​author​ 要素の値がないことに注意してください。この 2 つの要素の違いは、開始タグと終了タグ間のスペースにあります。​title​ 要素のタグは改行 (非表示文字 ​\n​) によって分割されていますが、​author​ 要素のタグはどの文字によっても分割されていません。

この入力はファイル ​myInput.xml​ 内のコンテンツであるとします。

myXML.xml コンテンツ:
<book>
    <author></author>
    <title>

</title>
</book>

ソース

DataWeave スクリプトは DataWeave 変数を使用して ​myXML.xml​ のコンテンツを入力し、​nullValueOn: "empty"​ を適用します。スクリプトは XML 入力を JSON に変換します。

%dw 2.0
var myInput readUrl('classpath://myXML.xml', 'application/xml', {nullValueOn: "empty"})
output application/json
---
myInput

出力

JSON 出力では ​author​ 要素の値が ​null​ にマップされ、​title​ 要素の値が ​String​ 値の ​"\n\n"​ (改行文字) にマップされます。

{
  "book": {
    "author": null,
    "title": "\n\n"
  }
}

例: XML 属性を DataWeave (dw) 形式で表す

次の例では、XML 属性を正規 DataWeave 表現 (​application/dw​ 形式および MIME タイプ) にマップします。

入力

この XML が DataWeave ソースへの入力ペイロードとして機能します。入力に XML 属性が含まれていることに注意してください。

<users>
  <company>MuleSoft</company>
  <user name="Leandro" lastName="Shokida"/>
  <user name="Mariano" lastName="Achaval"/>
</users>

ソース

DataWeave スクリプトは XML 入力ペイロードを DataWeave (dw) 形式および MIME タイプに変換します。

%dw 2.0
output application/dw
---
payload

出力

出力は、XML 入力が DataWeave (dw) 形式でどのように表されるかを示しています。XML 入力からの属性と空の値がどのように表されているかに注意してください。

{
  users: {
    company: "MuleSoft",
    user @(name: "Leandro",lastName: "Shokida"): "",
    user @(name: "Mariano",lastName: "Achaval"): ""
  }
}

例: XML 名前空間を DataWeave (dw) 形式で表す

次の例では、XML 名前空間を正規 DataWeave 表現 (​application/dw​ 形式および MIME タイプ) にマップします。

入力

この XML が DataWeave ソースへの入力ペイロードとして機能します。入力に XML 名前空間が含まれていることに注意してください。

<root>
    <h:table xmlns:h="http://www.w3.org/TR/html4/">
      <h:tr>
        <h:td>Apples</h:td>
        <h:td>Bananas</h:td>
      </h:tr>
    </h:table>

    <f:table xmlns:f="https://www.w3schools.com/furniture">
      <f:name>African Coffee Table</f:name>
      <f:width>80</f:width>
      <f:length>120</f:length>
    </f:table>
</root>

ソース

DataWeave スクリプトは XML 入力ペイロードを DataWeave (dw) 形式および MIME タイプに変換します。

%dw 2.0
output application/dw
---
payload

出力

出力は、XML 入力が DataWeave (dw) 形式でどのように表されるかを示しています。XML からの名前空間がどのように表されているかに注意してください。

ns h http://www.w3.org/TR/html4/
ns f https://www.w3schools.com/furniture
---
{
  root: {
      h#table: {
        h#tr: {
          h#td: "Apples",
          h#td: "Bananas"
        }
      },
      f#table: {
        f#name: "African Coffee Table",
        f#width: "80",
        f#length: "120"
      }
  }
}

例: CDATA 要素を作成

次の例は、​CData​ 型を使用して XML 出力内で CDATA 要素を作成する方法を示しています。

ソース

DataWeave スクリプトの本文では、​String​ 値が ​CData​ 型に型強制されます。

%dw 2.0
output application/xml
---
{
    test: "A text <a>" as CData
}

出力

出力では、入力の ​String​ 値が CDATA ブロックで囲まれ、CDATA ブロックには入力からの特殊文字 (​<​ と ​>​) が含まれます。

<?xml version='1.0' encoding='UTF-8'?>
<test><![CDATA[A text <a>]]></test>

例: String​ に CDATA があるかどうかを確認

次の例は、提供された ​String​ 値が CDATA かどうかを示しています。

入力

この XML が DataWeave ソースへの入力ペイロードとして機能します。​test​ 要素に CDATA ブロックが含まれていることに注意してください。

<?xml version='1.0' encoding='UTF-8'?>
<test><![CDATA[A text <a>]]></test>

ソース

DataWeave スクリプトは ​is CData​ 式を使用して ​String​ 値が CDATA かどうかを判別します。

%dw 2.0
output application/json
---
{
    test: payload.test is CDATA
}

出力

JSON 出力には、入力の ​String​ 値が CDATA であることを示す値 ​true​ が含まれます。

{
    "test": true
}

例: inlineCloseOn​ ライタープロパティを使用

次の例では、​inlineCloseOn​ ライタープロパティを値 ​none​ と共に使用して、入力からのキー-値ペアに基づいてアクションを実行します。

ソース

DataWeave スクリプトは本文コンテンツを XML に変換します。​emptyElement​ キーの値が ​null​ であることに注意してください。

%dw 2.0
output application/xml inlineCloseOn="none"
---
{
  someXml: {
    parentElement: {
      emptyElement1: null,
      emptyElement2: null,
      emptyElement3: null
    }
  }
}

出力

emptyElement​ 要素は空です。これに値 ​null​ は含まれません。

<?xml version='1.0' encoding='UTF-8'?>
<someXml>
  <parentElement>
    <emptyElement1></emptyElement1>
    <emptyElement2></emptyElement2>
    <emptyElement3></emptyElement3>
  </parentElement>
</someXml>

例: 反復 JSON キーを反復 XML 要素に変換

XML は反復 (無制限) 要素を使用してコレクションをエンコードします。DataWeave では、同じキーを繰り返して無制限の要素を表します。

次の例は、オブジェクトの JSON 配列内の反復キーを反復 XML 要素に変換する方法を示しています。

入力

この JSON 入力が DataWeave ソースへのペイロードとして機能します。配列内の ​name​ キーが反復していることに注意してください。

{
  "friends": [
    {"name": "Mariano"},
    {"name": "Shoki"},
    {"name": "Tomo"},
    {"name": "Ana"}
  ]
}

ソース

DataWeave スクリプトは、​friends​ キーの値を選択します。

%dw 2.0
output application/xml
---
friends: {
    (payload.friends)
}

出力

出力では、​name​ キーが XML 要素として表されます。

<?xml version='1.0' encoding='UTF-8'?>
<friends>
  <name>Mariano</name>
  <name>Shoki</name>
  <name>Tomo</name>
  <name>Ana</name>
</friends>

「自己終了 XML タグの出力」の例​も参照してください。

例: XML 要素を JSON に変換して文字を置換する

この例では、​Id​、​Name​、​Address​ など、従業員の詳細を含む XML ファイルを反復処理して、ファイルを JSON 形式に変換します。DataWeave スクリプトでは、​replace​ 関数を使用して各 ​Address​ 要素を反復処理し、文字 ​-​ と ​/​ を空白スペースに置き換えます。

入力

この XML 入力が DataWeave ソースへのペイロードとして機能します。​Address​ 要素に ​-​ と ​/​ の文字が含まれていることに注意してください。

<?xml version='1.0' encoding='UTF-8'?>
<root>
  <employees>
    <Id>1</Id>
    <Name>Mule</Name>
    <Address>MuleSoft Avenue - 123</Address>
  </employees>
  <employees>
    <Id>2</Id>
    <Name>Max</Name>
    <Address>MuleSoft Avenue-456/5/e</Address>
  </employees>
</root>

ソース

次の DataWeave スクリプトでは、ペイロード要素を反復処理して、オブジェクトへのマッピングを実行します。​payload01.Address replace /([\-\,\/])/ with " "​ の指示により、​-​ と ​/​ の文字が空白スペースに置き換えられます。

%dw 2.0
output application/json
---
payload.root.*employees map ((payload01 , indexOfPayload01) ->
  {
     Id: payload01.Id as String,
     Name: payload01.Name as String,
     Address: payload01.Address replace /([\-\,\/])/ with " "
  }
)

出力

出力は、JSON に変換された XML 要素を表します。

[
  {
    "Id": "1",
    "Name": "Mule",
    "Address": "MuleSoft Avenue   123"
  },
  {
    "Id": "2",
    "Name": "Max",
    "Address": "MuleSoft Avenue 456 5 e"
  }
]

例: DTD 値を読み取る

次の DataWeave スクリプトは、​DocType​ 値が含まれる XML 入力ペイロードを JSON に変換します。式 ​payload.^docType​ を使用して、その文書型ディレクティブの値を抽出します。

入力

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd">
<cXML xml:lang="en-US" payloadID="1615232861.000506@prd327utl1.int.coupahost.com" timestamp="2021-03-08T11:47:42-08:00">
    <Header>
        <From>
            <Credential domain="NetworkID">
                <Identity>TestIdentity</Identity>
            </Credential>
        </From>
        <To>
            <Credential domain="TEST">
                <Identity>Identity</Identity>
            </Credential>
        </To>
    </Header>
</cXML>

ソース

%dw 2.0
output application/json
---
{
    header: {
        senderId: payload.cXML.Header.From.Credential.Identity,
        receiverId: payload.cXML.Header.To.Credential.Identity,
        docType: payload.^docType
    }
}

出力

{
  "header": {
    "senderId": "Identity",
    "receiverId": "TestIdentity",
    "docType": {
      "rootName": "cXML",
      "systemId": "http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd"
    }
  }
}

例: DTD 値を書き込む

次の例は、​docType​ メタデータを使用して XML 出力内で ​DocType​ 値を作成する方法を示しています。

ソース

%dw 2.0
output application/xml
ns xml http://www.w3.org/XML/1998/namespace

var cXmlObj = {
  cXML @(payloadID: "9949494", xml#lang: "en-US", timestamp: "2002-02-04T18:39:09-08:00"): {
      Header: {
        From: {
          Credential @(domain: "NetworkId"): {
            Identity: "Identity"
          }
        }
    }
  }
} as Object {
    docType: { rootName: "cXML", systemId: "http://xml.cXML.org/schemas/cXML/1.2.014/cXML.dtd" }
}
---
cXmlObj

出力

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE cXML SYSTEM "http://xml.cXML.org/schemas/cXML/1.2.014/cXML.dtd">
<cXML payloadID="9949494" xmlns:xml="http://www.w3.org/XML/1998/namespace" xml:lang="en-US" timestamp="2002-02-04T18:39:09-08:00">
  <Header>
    <From>
      <Credential domain="NetworkId">
        <Identity>Identity</Identity>
      </Credential>
    </From>
  </Header>
</cXML>

例: DTD 値を文字列表現に変換する

次の例では、​Dtd Module (dw::xml::Dtd)​ を使用して、​systemId​ が含まれる ​DocType​ 値を文字列表現に変換します。

入力

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd">
<cXML xml:lang="en-US" payloadID="1615232861.000506@prd327utl1.int.coupahost.com" timestamp="2021-03-08T11:47:42-08:00">
    <Header>
        <From>
            <Credential domain="NetworkID">
                <Identity>Identity</Identity>
            </Credential>
        </From>
        <To>
            <Credential domain="TEST">
                <Identity>Identity</Identity>
            </Credential>
        </To>
    </Header>
</cXML>

ソース

%dw 2.0
output application/json
import * from dw::xml::Dtd
---
docTypeAsString(payload.^docType)

出力

"cXML SYSTEM http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd"

Configuration のプロパティ

DataWeave では、この形式の以下の設定プロパティがサポートされています。

Reader のプロパティ

この形式は、入力データを読み取るための指示を提供するプロパティを受け入れます。

パラメーター デフォルト 説明

collectionPath

String

null

コレクションが配置されているドキュメント内の場所へのパスを設定します。ストリーミングする要素の場所を識別するパス式を受け入れます。

externalEntities

Boolean

false

外部エンティティを処理するかどうかを示します。デフォルトでは、XML 外部エンティティ (XXE) 攻撃を回避するために無効になっています。

有効な値は、​true​ または ​false​ です。

indexedReader

Boolean

true

しきい値に達したとき、デフォルトでインデックス付きリーダーを使用します。US-ASCII、UTF-8、および ISO-8859-1 エンコードのみをサポートします。他のエンコードの場合、DataWeave ではメモリ内リーダーを使用します。

有効な値は、​true​ または ​false​ です。

maxAttributeSize

Number

-1

XML 属性で受け入れられる最大文字数を設定します。 Mule 4.2.1 以降で使用できます。

maxEntityCount

Number

1

エンティティ拡張の最大数を設定します。この制限は Billion Laughs 攻撃の回避に役立ちます。

nullValueOn

String

'blank'

空または空白のテキストを含む要素を ​null​ 値として読み取るかどうかを示します。

有効な値は ​empty​、​none​、​blank​ です。

optimizeFor

String

'speed'

使用する XML パーサーの最適化の種別を設定します。

有効な値は、​speed​ または ​memory​ です。

streaming

Boolean

false

true​ に設定すると、入力をストリーミングします。エントリを順次アクセスする場合のみ使用します。入力は最上位の配列である必要があります。​ストリーミング例​と 「DataWeave リーダー」​を参照してください。

有効な値は、​true​ または ​false​ です。

supportDtd

Boolean

false

DTD サポートを有効または無効にします。無効にすると、内部および外部のサブセットがスキップされ、処理されません。Mule システムプロパティ ​com.mulesoft.dw.xml.supportDTD​ を設定してこのプロパティを有効にすることもできます。このプロパティのデフォルトは、Mule バージョン 4.3.0-20210601 (2021 年 6 月の DataWeave バージョン 2.3.0 のパッチを含む) で ​true​ から ​false​ に変更されました。

有効な値は、​true​ または ​false​ です。

Writer のプロパティ

この形式は、出力データを書き込むための指示を提供するプロパティを受け入れます。

パラメーター デフォルト 説明

bufferSize

Number

8192

バッファライターのサイズ。値は 8 よりも大きい必要があります。

defaultNamespace

String

null

出力 XML のデフォルトの名前空間を指定します。

deferred

Boolean

false

true​ に設定すると、出力をデータストリームとして生成し、スクリプトの実行は生成されたコンテンツがコンシュームされるまで延期されます。

有効な値は、​true​ または ​false​ です。

doubleQuoteInDeclaration

Boolean

false

true​ に設定すると、XML 宣言の二重引用符をエスケープします。

有効な値は、​true​ または ​false​ です。

encoding

String

null

出力で使用するエンコード (UTF-8 など)。

escapeCR

Boolean

false

true​ に設定すると、​CR​ 文字をエスケープします。

有効な値は、​true​ または ​false​ です。

escapeGT

Boolean

false

true​ に設定すると、「>」文字をエスケープします。

有効な値は、​true​ または ​false​ です。

indent

Boolean

true

デフォルトでは出力をインデントして読みやすくします。​false​ に設定すると、出力を 1 行に圧縮します。

有効な値は、​true​ または ​false​ です。

inlineCloseOn

String

'empty'

インラインの終了タグを出力します。この値が ​null​ の場合は明示的に開始および終了タグを出力します。

有効な値は、​empty​ または ​none​ です。

onInvalidChar

String

null

有効な値は ​base64​、​ignore​、​none​ です。

skipNullOn

String

null

指定されたデータ構造の ​null​ 値をスキップします。デフォルトではスキップしません。

  • elements​ + XML 出力内の ​null​ 要素を無視して除外します。たとえば、​output application/xml skipNullOn="arrays"​ のようにします。

  • attributes `​ + XML 内の ​`null​ 属性を無視して除外します。たとえば、​output application/xml skipNullOn="objects"​ のようにします。

  • everywhere​ + ​skipNullOn​ を要素と属性に適用します。たとえば、​output application/xml skipNullOn="everywhere"​ のようにします。

有効な値は ​elements​、​attributes​、​everywhere​ です。

writeDeclaration

Boolean

true

true​ に設定すると、XML ヘッダー宣言を出力します。

有効な値は、​true​ または ​false​ です。

writeDeclaredNamespaces

String

null

XML のルート要素内の宣言する名前空間をマークします。

  • All​: ルート要素内の宣言された名前空間をすべて出力します。

  • ids:<comma separated namespace id>​: 指定された名前空間のみを出力します。

  • regex:<regex>​: 一致する名前空間のみを出力します。

writeNilOnNull

Boolean

false

このプロパティが ​true​ に設定されている場合、​null​ 値の ​nil​ 属性を出力します。

有効な値は、​true​ または ​false​ です。

サポートされる MIME タイプ

この形式では、次の MIME タイプがサポートされます。

MIME タイプ

*/xml

/​+xml