DataWeave セレクター

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

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

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

単一値

.keyName

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

複数値

.*keyName

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

下位

..keyName

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

動的

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

 

キー-値ペア

.&keyName

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

Index (インデックス)

[<index>]

選択された配列インデックスの位置にある任意の型の値。配列の最後からインデックス付けするには負の数を使用します。たとえば、配列の最後の要素の場合は ​-1​ になります。配列のサイズを超える値を使用すると ​null​ が返されます。

範囲

[<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"
]

例: 降順での値の選択

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

入力ペイロード

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

<Example>
    <Brand>
        <Id>32345</Id>
        <logo>circle</logo>
        <Item>
            <Name>Perfume</Name>
            <Item>
                <Name>Bosque</Name>
            </Item>
        </Item>
        <Item>
            <Name>t-Shirt</Name>
        </Item>
    </Brand>
    <Brand>
        <Id>435678C</Id>
        <logo>circle</logo>
        <Item>
            <Name>t-Shirt2</Name>
            <Item>
                <Name>t-Shirt red</Name>
                <Item>
                    <Name>t-Shirt red with logo</Name>
                </Item>
            </Item>
        </Item>
    </Brand>
</Example>

DataWeave ソース

この DataWeave スクリプトは、​..*​ を使用して、入力ペイロードから ​Item​ 要素でネストされたすべての ​Name​ 要素の値を選択し、それらの値を XML 配列に出力します。

%dw 2.0
output application/xml
---
{
    Supermarket: {
        Item: {
            Value: payload..*Item.Name
        }
    }
}

出力

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

<?xml version='1.0' encoding='UTF-8'?>
<Supermarket>
  <Item>
    <Value>Perfume</Value>
    <Value>t-Shirt</Value>
    <Value>Bosque</Value>
    <Value>t-Shirt2</Value>
    <Value>t-Shirt red</Value>
    <Value>t-Shirt red with logo</Value>
  </Item>
</Supermarket>

動的セレクター

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

  • 単一値: payload[(nameExpression)]

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

  • 属性: payload[@(nameExpression)]

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

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

例: 単一値の動的選択

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

入力ペイロード

入力ペイロードはオブジェクトの配列になります。最初のオブジェクトは、キー ​"ref"​ と値 ​"name"​ を持ちます。2 番目のオブジェクトは、キー ​"name"​ と値 ​"Data Weave"​ を持ちます。​"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​ は一部のコアコンポーネント (Set Payload、Transform Message など) では機能しません。

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