DataWeave セレクタ

DataWeave 2.0 セレクタはオブジェクトと配列の構造をトラバースし、一致する値を返します。 開始する前に、DataWeave 2.0 は Mule 4 アプリケーションを対象とすることに注意してください。Mule 3 アプリケーションの場合、Mule 3.9 ドキュメントの DataWeave 1.0 ドキュメントセット​を参照してください。他の Mule バージョンの場合は、Mule Runtime の目次のバージョンセレクタを使用できます。

セレクタは常にコンテキスト内で動作し、コンテキストには、変数への参照、オブジェクトリテラル、配列リテラル、または DataWeave 関数の呼び出しとすることができます。

セレクタ種別 構文 戻り値のデータ型

単一値

.keyName

一致するキーに属する値の任意の型

複数値

.*keyName

すべての一致するキーの値の配列

下位

..keyName

すべての一致する下位キーの値の配列

動的

動的セレクタ​ を参照してください。.

 

キー-値ペア

.&keyName

一致するキーを持つオブジェクト

インデックス

[<index>]

選択された配列インデックスの位置にある任意の型の値

範囲

[<index> to <index>]

選択されたインデックスからの値を含む配列

XML 属性

@​、.@keyName

選択された属性の文字列値

名前空間

keyName.#

選択されたキーの名前空間の文字列値

キーの存在

keyName?​、keyName.@type?

ブール (オブジェクトまたは XML 属性の選択されたキーが存在する場合は true​、存在しない場合は false​)

アサートの存在

keyName!

文字列: キーが存在しない場合の例外メッセージ

検索条件

[?(boolean_expression)]

DataWeave 式が true​ を返す_場合_​、キー-値ペアを含む配列またはオブジェクト。. そうでない場合は、値 null​ を返します。

メタデータ

.^someMetadata

Mule ペイロード、変数、属性の指定したメタデータの値を返します。セレクタは、クラス (.^class​)、コンテンツ長 (.^contentLength​)、エンコード (.^encoding​)、MIME タイプ (.^mimeType​)、メディア種別 (.^mediaType​)、未加工 (.^raw​)、およびカスタムメタデータ (.^myCustomMetadata​) の値を返すことができます。詳細は、「データの抽出」​を参照してください。

以下の例では、これらのセレクタを使用しています。その他の例については、「データの抽出」​を参照してください。

照合のルール

DataWeave では、オブジェクトのキー (たとえば JSON オブジェクト { "someName" : "Data Weave" }​ のキー "someName"​) と一致する名前が、そのオブジェクトからデータを選択できます。シンプルな例については、単一値セレクタ​ を参照してください。

単一値セレクタ

このセレクタは、指定されたセレクタ名にキーが一致した最初のキー/値ペアの値と一致します。このセレクタは、オブジェクトまたは配列に適用できます。配列の場合は、配列内のすべてのオブジェクト値にセレクタが適用され、オブジェクト値以外の値はすべて無視されます。一致するキーがない場合は、値 null​ が返されます。

例: オブジェクトに対する単一値セレクタの使用

次の例は、単一の JSON オブジェクトに対するセレクタの働きを示しています。

入力ペイロード

入力ペイロードは、キー "name"​ と値 "DataWeave"​ を持つオブジェクトです。

{ "name": "Data Weave" }

DataWeave ソース

この DataWeave スクリプトは、payload.name​ を使用して、キー "name"​ を持つオブジェクトの値を選択します。 選択の実行手段としては、payload.name​ と payload."name"​ のどちらも有効です。

%dw 2.0
output application/json
---
payload.name

出力

次のスクリプトは、入力オブジェクト「Data Weave」の文字列値を出力します。

"Data Weave"

例: 配列に対する単一値セレクタの使用

配列では、すべての要素にセレクタが適用されます。

入力ペイロード

入力ペイロードは、同じキー「name」を持つ 2 つのオブジェクトを含む配列です。

[
  {
    "name": "Arg"
  },
  {
    "name": "Japan"
  }
]

DataWeave ソース

この DataWeave スクリプトは、payload.name​ を使用して、入力ペイロード中でキー「name」を持つオブジェクトの値を選択します。

%dw 2.0
output application/json
---
payload.name

出力

次のスクリプトは、キー "name"​ を持つ入力オブジェクトの値 ("Arg"​ と "Japan"​) を含む配列を出力します。

["Arg", "Japan"]

名前空間セレクタ

DataWeave 名前空間セレクタは、名前空間またはローカル部分と一致する名前の使用をサポートします。セレクタが名前空間と一致するためには、名前が名前空間およびローカル部分と一致する必要があります。ローカル部分としか一致しない場合、名前空間とは関係なく、セレクタはそのローカル部分を持つすべての名前空間と一致します。

XML 名前空間とそれぞれのプレフィックスは、XML 要素の xmlns​ 属性に定義されています。たとえば、<h:table xmlns:h="http://www.w3.org/TR/html4/"/>​ は、プレフィックス h​ を名前空間 http://www.w3.org/TR/html4/​ に割り当てる名前空間を定義します。 その名前空間内のすべての要素は h​ プレフィックスを持ちます。たとえば、要素 <h:table/>​ では、h​ が名前空間のプレフィックスで、table​ がローカル部分になります。

例: 名前空間セレクタの使用

次の例では、名前空間とローカル部分を使用して、XML 要素から値を選択しています。

入力ペイロード

入力ペイロードには、ローカル名 (table​) が同じで異なる名前空間を持つ XML 要素 h:table​ と f:table​ が含まれます。

<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:tr>
      <f:name>African Coffee Table</f:name>
      <f:width>80</f:width>
      <f:length>120</f:length>
    </f:tr>
  </f:table>

</root>

DataWeave ソース

この DataWeave スクリプトは、指定された名前空間から XML コンテンツを選択します。スクリプトのヘッダは、名前空間 (ns​) の変数 html​ と furniture​ を作成し、入力ペイロードからの名前空間を格納します。要素 h:table​ の子を選択して要素 a​ に格納し、要素 f:table​ の子を選択して要素 b​ に格納するため、スクリプトは名前空間変数の html​ と furniture​ で名前空間セレクタ (#​) とローカル部分 (table​) を使用します。

%dw 2.0
output application/xml
ns html http://www.w3.org/TR/html4/
ns furniture https://www.w3schools.com/furniture
---
root: {
     a: payload.root.html#table,
     b: payload.root.furniture#table
 }

出力

次のスクリプトは、要素 a​ では要素 h:table​ の子を出力し、要素 b​ では要素 f:table​ の子を出力します。

<?xml version='1.0' encoding='UTF-8'?>
<root>
  <a>
    <h:tr xmlns:h="http://www.w3.org/TR/html4/">
      <h:td>Apples</h:td>
      <h:td>Bananas</h:td>
    </h:tr>
  </a>
  <b>
    <f:tr 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:tr>
  </b>
</root>

例: ローカル名を使用した XML 値の選択

次の例では、ローカル名 table​ を使用して h:table​ 要素から XML 値を選択しています。

入力ペイロード

入力ペイロードには、名前空間 "http://www.w3.org/TR/html4/"​ を含む table​ 要素を持つ 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>
</root>

DataWeave ソース

この DataWeave スクリプトは、名前区間ではなく XML 要素 table​ のローカル名を使用して、table​ 要素の子の値を選択します。

%dw 2.0
output application/xml
---
root: { a: payload.root.table }

出力

次のスクリプトは、table​ 要素の子の値を含む XML を出力します。

<?xml version='1.0' encoding='UTF-8'?>
<root>
  <a>
    <h:tr xmlns:h="http://www.w3.org/TR/html4/">
      <h:td>Apples</h:td>
      <h:td>Bananas</h:td>
    </h:tr>
  </a>
</root>

属性セレクタ

属性セレクタは、選択された名前式と一致する最初の属性値を返します。どのキーも位置しない場合は値 null​ を返します。

次の例では、XML 属性の値を選択しています。

入力ペイロード

入力ペイロードは、属性 name="Weave"​ を含む XML の user​ 要素です。

<user name="Weave"/>

DataWeave ソース

この DataWeave スクリプトは、入力ペイロード (<user name="Weave"/>​) から name​ 属性の値を選択します。@​ は属性の選択を示しています。

%dw 2.0
output application/json
---
payload.user.@name

出力

この DataWeave スクリプトは、name​ 属性の値を出力します。

"Weave"

複数値セレクタ

複数値セレクタ (*​) は、オブジェクトの配列で最初に一致したキーの値を返すのではなく、一致するキーに対する値を含む配列 (たとえば、user​ がキーである場合は *user​) を返します。このセレクタは、子孫の値は返さず、指定されたレベルの値のみを返します。どのキーも位置しない場合は値 null​ を返します。

入力ペイロード

入力ペイローには user​ 要素の XML 配列が含まれます。

<users>
  <user>Weave</user>
  <user>BAT</user>
  <user>TF</user>
</users>

DataWeave ソース

この DataWeave スクリプトは、入力ペイロードのすべての user​ 要素の値を選択するために *user​ を使用します。

%dw 2.0
output application/json
---
payload.users.*user

出力

このスクリプトは、user​ 値の配列を出力します。

[
  "Weave",
  "BAT",
  "TF"
]

子孫セレクタ

子孫セレクタは、すべての子とそれぞれの子孫のリストを返します。 このセレクタは、.​ を 1 つ使用することで他のどのセレクタとも連結できます。. たとえば、payload..​ は、すべての子の値、さらに_それぞれの_​子の値と、すべての子孫の値を再帰的に選択して、それらの値の配列を返します。セレクタは、他の要素と連結することもできます。たとえば、payload..user​ と指定すると、各 user​ キーの値と、それぞれの子孫の値がすべて選択されます。または payload..*name​ と指定すると、name​ のすべての子孫の値が選択されます。

例: 各子孫の選択

次の例では、入力ペイロードの各子孫を選択しています。

入力ペイロード

入力ペイロードには、異なるレベルでネストされている要素のセットが含まれます。

<users>
  <user>
    <name>Weave</name>
    <user>
      <name>BAT</name>
      <user>
        <name>BDD</name>
      </user>
    </user>
  </user>
</users>

DataWeave ソース

この DataWeave スクリプトは、..​ を使用して、入力ペイロードのすべての要素を再帰的に選択して、JSON 配列として返します。

%dw 2.0
output application/json
---
payload..

出力

[
  {
    "user": {
      "name": "Weave",
      "user": {
        "name": "BAT",
        "user": {
          "name": "BDD"
        }
      }
    }
  },
  {
    "name": "Weave",
    "user": {
      "name": "BAT",
      "user": {
        "name": "BDD"
      }
    }
  },
  "Weave",
  {
    "name": "BAT",
    "user": {
      "name": "BDD"
    }
  },
  "BAT",
  {
    "name": "BDD"
  },
  "BDD"
]

例: 降順での値の選択

次の例では、name​ の値を降順に選択しています。

入力ペイロード

入力ペイロードには、異なるレベルでネストされている name​ 要素のセットが含まれます。

<users>
  <user>
    <name>Weave</name>
    <user>
      <name>BAT</name>
      <name>Munit</name>
      <user>
        <name>BDD</name>
      </user>
    </user>
  </user>
</users>

DataWeave ソース

この DataWeave スクリプトは、..​ を使用して、入力ペイロードからすべての name​ (名) 要素を選択し、それらの値を JSON 配列として出力します。

%dw 2.0
output application/json
---
payload..name

出力

このスクリプトは、すべての name​ 値の JSON 配列を出力します。

[
  "Weave",
  "BAT",
  "BDD"
]

次の例では、name​ の値を降順に選択しています。

入力ペイロード

入力ペイロードには、異なるレベルでネストされている name​ 要素のセットが含まれます。

<users>
  <user>
    <name>Weave</name>
    <user>
      <name>BAT</name>
      <name>Munit</name>
      <user>
        <name>BDD</name>
      </user>
    </user>
  </user>
</users>

DataWeave ソース

この DataWeave スクリプトは、..*​ を使用して、XML 階層の同じレベルにある反復 name​ キーの BAT​ および Munit​ 値を含め、入力ペイロードからすべての name​ 要素の値を選択し、それらの値を JSON 配列に出力します。

%dw 2.0
output application/json
---
payload..*name

出力

このスクリプトは、すべての name​ 値の JSON 配列を出力します。

[
  "Weave",
  "BAT",
  "Munit",
  "BDD"
]

動的セレクタ

動的セレクタの構文は、選択する対象によって異なります。

  • 単一値: ​payload[(nameExpression)]

  • 複数値: ​payload[*(nameExpression)]

  • 属性: ​payload[@(nameExpression)]

  • キー値: ​payload[&(nameExpression)]

  • 名前空間を持つ単一値: ​payload.ns0#"$(nameExpression)"

例: 単一値の動的選択

次の例は、単一値を動的に選択する方法を示しています。

入力ペイロード

入力ペイロードはオブジェクトの配列になります。最初のオブジェクトは、キー "ref"​ と値 "name"​ を持ちます。. 2 番目のオブジェクトは、キー "name"​ と値 "Data Weave"​ を持ちます。:

{ "ref": "name", "name": "Data Weave" }

DataWeave ソース

この DataWeave スクリプトは、"name"​ キーの値を動的に選択します。

%dw 2.0
output application/json
---
payload[(payload.ref)]

スクリプトでは、動的セレクタの括弧 [()]​ 内で payload.ref​ を渡しています。. ​"ref"​ の値は "name"​ であり、キー "name"​ と一致するため、このスクリプトは機能します。

出力

このスクリプトは、"name"​ キーを持つオブジェクトの値を出力します。

"Data Weave"

例: 名前空間を持つ単一値の動的選択

次の例は、名前空間を持つ単一値を動的に選択する方法を示しています。

入力ペイロード

入力ペイロードには、2 つの子要素を持ち、それらの片方が名前空間 http://www.w3.org/TR/html4/​ である <root/>​ 要素が 1 つ含まれます。. 両方の子要素 (<f:table/>​ と <h:table>​) はローカル名の table​ を持ちます。

<root ref="table">
    <f:table xmlns:f="https://www.w3schools.com/furniture">Manzana</f:table>
    <h:table xmlns:h="http://www.w3.org/TR/html4/">Banana</h:table>
</root>

DataWeave ソース

この DataWeave スクリプトは、名前空間 http://www.w3.org/TR/html4/​ を持つ要素の値を動的に選択します。

%dw 2.0
output application/json
ns h http://www.w3.org/TR/html4/
---
payload.root.h#"$(payload.root.@ref)"

payload.root.@ref​ では、root​ 要素の ref​ 属性に対して属性セレクタ (@​) を使用して、要素 <h:table xmlns:h="http://www.w3.org/TR/html4/">Banana</h:table>​ のローカル名 table​ と一致する値 table​ を選択しています。

出力

このスクリプトは、名前空間 http://www.w3.org/TR/html4/​ を持つ要素の値を出力します。

"Banana"

変数に保存されたコンテンツでのセレクタの使用

すべてのセレクタが、定義済みの Mule Runtime 変数​ (payload​、attributes​ など) および DataWeave 変数​で機能します。. たとえば、var myVar = { "id" : "1234", "name" : "somebody" }​ として定義された DataWeave 変数があるとします。DataWeave 式 myVar.name​ は "name"​ の値を返し、その値は "somebody"​ です。

Mule Runtime 変数を使用することで、Mule イベント​データを選択できます。

抽出された値は、サポートされる DataWeave 値の型のいずれかのリテラル値 (たとえば、変数とは対照的) として処理されます。

抽出するデータ 構文

ペイロード

payload​ (例: ​payload.name​)

payload​ が {"name" : "somebody"}​ の場合、payload.name​ は "somebody"​ を返します。

Mule ペイロードについての詳細は、「メッセージペイロード」​を参照してください。

属性

attributes.<myAttributeName>

例については、「属性」​を参照してください。

変数

<myVariableName>

名前の競合を回避するには、variables​ を先頭に追加することができます。

variables.<myVariableName>

Muke 変数についての詳細は、「Mule アプリケーションの変数」​を参照してください。

エラーオブジェクト

error

フローでのエラーに関する情報については、#[error.cause]​ を使用できます。

フロー

flow

Logger でのフロー名: ​#[flow.name]

flow.name​ は一部の Core コンポーネント (Set Payload、Transform Message など) では機能しません。

フローについての詳細は、「フローおよびサブフロー」​を参照してください。

Was this article helpful?

💙 Thanks for your feedback!