---
schema_version: "1"
id: c7a04e0b72ba2a9f0c41d81859f264d4421ac283a2a3bdc02cb6985d08ba117b
title: データの抽出
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/dataweave/2.3/dataweave-cookbook-extract-data.md
canonical_url: https://docs.mulesoft.com/jp/dataweave/2.3/dataweave-cookbook-extract-data
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 8a369ec8c508016500fb72adc6dd86c79817a04150da8470523316d5512bd7f0
description: MuleSoft Documentation Site
release: "2.3"
latest: false
---
# データの抽出

DataWeave は、データを DataWeave オブジェクトや配列、そのデータを保存する変数、および DataWeave 関数の出力 (その出力が配列またはオブジェクトの場合) から選択できます。 開始する前に、DataWeave バージョン 2 (​`%dw 2.0`​) は Mule 4 アプリケーションを対象とすることに注意してください。Mule 3 アプリケーションの場合、Mule 3.9 ドキュメントセットの DataWeave バージョン 1 (​[`%dw 1.0`](#3.9@mule-runtime::dataweave-examples.adoc)​) の例を参照してください。他の Mule バージョンの場合は、目次の Mule Runtime バージョンセレクターを使用できます。

より正確に言えば、DataWeave セレクターは、データを保存する変数、オブジェクトリテラル、配列リテラル、DataWeave 関数の呼び出しへの参照になるコンテキスト内で動作します。DataWeave 式を使用できる Mule モジュール、コネクタ、コンポーネントのセレクターを使用できます。

DataWeave は、セレクターを処理するときに後続のセレクターの新しいコンテキスト (スコープ) を設定するため、セレクターのチェーンを使用して配列やオブジェクトの複雑な構造を移動できます。選択の深さは、現在のコンテキストの深さに制限されます。

サポートされている変数参照は、​`payload`​ や ​`attributes`​ などの ​[Mule Runtime 変数](https://docs.mulesoft.com/jp/dataweave/2.3/dataweave-variables-context)​と、配列またはオブジェクトを保存する ​[DataWeave 変数](https://docs.mulesoft.com/jp/dataweave/2.3/dataweave-variables)​です。簡単な例として ​`payload.myKey`​ が挙げられます。payload はオブジェクト ​`{"myKey" : 1234 }`​ であるため、結果は ​`1234`​ になります。

セレクターは、DataWeave ​`read`​ などの関数の呼び出しで動作します。たとえば、​`read('{"A":"B"}','application/json')."A"`​ は ​`"B"`​ を返します。

## [](#dataweave-配列やオブジェクトでのセレクターの使用)DataWeave 配列やオブジェクトでのセレクターの使用

DataWeave のセレクターは、DataWeave オブジェクト (​`{ myKey : "myValue" }`​ など) または配列 (​`[1,2,3,4]`​ や ​`[ { "myKey" : "1234" }, { "name" : "somebody" } ]`​ など) 内から値を抽出します。

次の DataWeave スクリプトでは、単一値セレクター (​`.`​) を使用して、変数 ​`myObject`​ と ​`myArray`​ で定義されたオブジェクトと配列から値を取得します。

DataWeave スクリプト:

```dataweave
%dw 2.0
var myObject = { "myKey" : "1234", "name" : "somebody" }
var myArray = [ { "myKey" : "1234" }, { "name" : "somebody" } ]
output application/json
---
{
    selectingValueUsingKeyInObject : myObject.name,
    selectingValueUsingKeyOfObjectInArray : myArray.name,
}
```

出力 JSON:

```json
{
    "selectingValueUsingKeyInObject": "somebody",
    "selectingValueUsingKeyOfObjectInArray": [ "somebody" ]
 }
```

出力は次のようになります。

- `myObject.name`​ は、値 ​`"somebody"`​ を返します。
- `myArray.name`​ は、配列 ​`[ "somebody" ]`​ を返します。

## [](#セレクタークイックリファレンス)セレクタークイックリファレンス

単一値 (​`.`​)

配列やオブジェクトで動作し、一致するキーの値を返します。構文は ​`.myKey`​ です。DataWeave ​_オブジェクト_​の重複キーの値を取得するには、代わりに ​`*`​ を使用します。例については、「​[単一値セレクター (.myKey)](#single_value)​」を参照してください。

複数値 (​`*`​)

配列やオブジェクトで動作し、データ構造の階層の単一レベルで一致するすべてのキーの値を取得します。構文は ​`*myKey`​ です。階層の下位レベルのすべての重複キーの値を取得する場合は、代わりに子孫セレクター (​`..`​) を使用します。例については、「​[複数値セレクター (​`.*`​)](#multi_value)​」を参照してください。

キー - 値ペア (​`&`​)

配列やオブジェクトで動作します。このセレクターは、DataWeave オブジェクトの値を返す代わりに DataWeave オブジェクト全体 (キーと値) を返します。 構文は ​`.&myKey`​ です。例については、「​[キー - 値ペアセレクター (​`.&myKey`​)](#key_value)​」を参照してください。

子孫 (​`..`​)

配列やオブジェクトで動作し、階層の場所に関係なく、特定のキーの下にある配列やオブジェクトから一致するすべてのキーを取得します。 構文は ​`..myKey`​ です。例については、「​[子孫セレクター (​`..myKey`​)](#descendants)​」を参照してください。

インデックス (​`[]`​)

配列の指定したインデックスの値を返します。たとえば、​`["a","b","c"][0]`​ の最後の ​`[0]`​ は ​`"a"`​ を返します。例については、「​[インデックスセレクター (​`[anIndex]`​)](#index)​」を参照してください。

範囲 ​`[index1 to index2]`​

選択したインデックスの値が含まれる配列を返します。たとえば、​`["a","b","c","d"][2 to 3]`​ の最後の ​`[2 to 3]`​ は ​`["c","d"]`​ を返します。例については、「​[範囲セレクター (​`anIndex to anotherIndex`​)](#range)​」を参照してください。

XML 属性 (​`.@myKey`​)

XML 属性の選択したキーの値を返します。例については、「​[XML 属性セレクター (​`.@myKey`​)](#xml_attribute)​」を参照してください。

名前空間セレクター (​`myKey.#`​)

選択したキーも含まれる要素の ​`xmlns`​ 名前空間を返します。例については、「​[名前空間セレクター (​`#`​)](#namespace)​」を参照してください。

セレクター修飾子 (​`?`​ および ​`!`​)

`?`​および ​`!`​ は、指定したキーをチェックします。​`?`​ は、​`true`​ または ​`false`​ を返します。 `!`​ は、キーが存在しない場合にエラーを返します。例については、「​[セレクター修飾子 (​`!`​、​`?`​)](#selector_modifiers)​」を参照してください。

絞り込みセレクター (​`myKey[?(booleanExpression)]`​)

ブール式で ​`true`​ が返されて、指定した ​`key`​ が存在する場合に、選択した項目を返します。式が false か、キーが存在しない場合、​`null`​ を返します。例については、「​[絞り込みセレクター (​`myKey[?($ == "aValue")]`​)](#filter_selectors)​」を参照してください。

メタデータセレクター ​`.^someMetadata`​

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

## [](#キーおよびセレクターの構文)キーおよびセレクターの構文

DataWeave では、一部の状況ではオブジェクトのキーの名前を囲む引用符が必須ですが、それ以外は引用符は省略可能です。キーは識別子ではありませんが、キー名が、​[有効な識別子名](https://docs.mulesoft.com/jp/dataweave/2.3/dataweave-language-introduction#valid-identifiers)​の条件を満たす場合、キーを囲む引用符は省略可能です。キーがこの条件を満たさない場合、キーを引用符で囲む​_必要_​があります。たとえば、​`{ some-name : "somebody" }`​ のキー構文を修正するには、​`{ "some-name" : "somebody" }`​ または ​`{ 'some-name' : "somebody" }`​ を使用できます。引用符がない場合、​`{ some-name : "somebody" }`​ のキーでは ​`Invalid input '-', expected Namespace`​ というエラーが発生します。

引用符を必要とするキーでセレクターを使用している場合は、セレクターも引用符で囲む必要があります。たとえば、​`{ "some-name" : "somebody" }."some-name"`​ のセレクター ​`"some-name"`​ は正常に機能しますが、​`{ "some-name" : "somebody" }.some-name`​ のセレクター ​`some-name`​ では、セレクターが引用符で囲まれていないために ​`Unable to resolve reference of: name`​ というエラーが発生します。

引用符を必要としないキーでセレクターを使用している場合、セレクターを囲む引用符は省略可能です。たとえば、次の例はすべて正常に機能します。

- `{"name" : "somebody"}.name`​
- `{"name" : "somebody"}."name"`​
- `{name : "somebody"}.name`​
- `{name : "somebody"}."name"`

## [](#single_value)単一値セレクター (.myKey)

`.myKey`​ セレクターは、オブジェクトや配列で動作し、一致するキーの値を返します。

### [](#オブジェクトに対する単一値セレクター)オブジェクトに対する単一値セレクター

オブジェクトの場合、単一値セレクターは一致するキーの値を返します。たとえば、次のスクリプトの ​`myObject.user`​ は ​`"a"`​ を返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
var myObject = { user : "a" }
output application/json
---
{ myObjectExample : myObject.user }
```

出力 JSON:

```json
{
  "myObjectExample": "a"
}
```

DataWeave ​_オブジェクト_​ (配列ではない) を操作する場合、​`.`​ セレクターは、オブジェクトに複数の一致するキーがある場合でも、​_最初_​に一致したキーの値のみを返します。次に例を示します。

DataWeave スクリプト:

```dataweave
%dw 2.0
var myObject = { user : "a", "user" : "b" }
output application/json
---
{ myObjectExample : myObject.user }
```

出力 JSON:

```json
{
  "myObjectExample": "a"
}
```

このような場合に複数の一致するキーの値を返す方法については、「​[複数値セレクター (​`.*`​)](#multi_value)​」を参照してください。

次の例の ​`payload.people.person.address`​ は ​`address`​ 要素の値を返します。また、​`output`​ ディレクティブを使用して、JSON 入力を XML に変換します。

DataWeave スクリプト:

```dataweave
%dw 2.0
var myData = {
  "people": {
    "size" : 1,
    "person": {
      "name": "Nial",
      "address": {
        "street": {
          "name": "Italia",
          "number": 2164
        },
        "area": {
          "zone": "San Isidro",
          "name": "Martinez"
        }
      }
    }
  }
}
output application/xml
---
{ myaddresses: myData.people.person.address }
```

出力 XML:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<myaddresses>
  <street>
    <name>Italia</name>
    <number>2164</number>
  </street>
  <area>
    <zone>San Isidro</zone>
    <name>Martinez</name>
  </area>
</myaddresses>
```

## [](#single_value_array)配列に対する単一値セレクター

配列で動作する場合、一致する値が 1 つのみの場合でも、​`.`​ セレクターは配列を返します。たとえば、​`["a":"b"]."a"`​ は ​`["b"]`​ を返します。

`.`​ セレクターの動作は、オブジェクトと配列で異なります。 `.*`​ と同様に、​`.`​ セレクターは、入力配列の指定したレベルで​_一致するすべてのキー_​の値が含まれる配列を返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
var myArrayOfKeyValuePairs = [ "aString": "hello", "aNum": 2, "aString" : "world" ]
var myArrayOfObjects = [ { "aString": "hello" }, { "aNum": 2 }, { "aString" : "world" } ]
output application/json
---
{
    myKeyValueExample : myArrayOfKeyValuePairs.aString,
    myObjectExample :  myArrayOfObjects.aString
}
```

出力 JSON:

```json
{
  "myKeyValueExample": [ "hello", "world" ],
  "myObjectExample": [ "hello", "world" ]
}
```

次の例では、入力変数 ​`myData`​ の値が、2 つのオブジェクトが含まれる配列になっています。セレクターは、両方のオブジェクトを移動し、両方の ​`street`​ キーの値を返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
var myData = {
  "people": [
    {
      "person": {
        "name": "Nial",
        "address": {
          "street": {
            "name": "Italia",
            "number": 2164
          },
          "area": {
            "zone": "San Isidro",
            "name": "Martinez"
          }
        }
      }
    },
    {
      "person": {
        "name": "Coty",
        "address": {
          "street": {
            "name": "Monroe",
            "number": 323
          },
          "area": {
            "zone": "BA",
            "name": "Belgrano"
          }
        }
      }
    }
  ]
}
output application/json
---
myData.people.person.address.street
```

出力 JSON:

```json
[
  {
    "name": "Italia",
    "number": 2164
  },
  {
    "name": "Monroe",
    "number": 323
  }
]
```

## [](#multi_value)複数値セレクター (​`.*`​)

`.*`​ は、オブジェクトや配列をトラバースして、一致するすべてのキーの値を選択し、一致する結果を配列で返します。

### [](#オブジェクトに対する複数値セレクター)オブジェクトに対する複数値セレクター

`.*`​ は、キーが式に一致するすべての値が含まれる配列を返します。

次の例では、入力ペイロードのすべての ​`user`​ 要素の値を返します。

DataWeave スクリプト:

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

入力 XML ペイロード:

```xml
<users>
  <user>Mariano</user>
  <user>Martin</user>
  <user>Leandro</user>
</users>
```

出力 JSON:

```json
[ "Mariano", "Martin", "Leandro" ]
```

### [](#配列に対する複数値セレクター)配列に対する複数値セレクター

配列では、​`.*`​ は単一値セレクター (​`.`​) と同じように動作します。たとえば、​`payload.people.person.address.*street`​ と ​`payload.people.person.address.street`​ (「​[配列に対する単一値セレクター](#single_value_array)​」の例) は同じ結果を返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
var myArrayOfKeyValuePairs = [ "aString": "hello", "aNum": 2, "aString" : "world" ]
var myArrayOfObjects = [ { "aString": "hello" }, { "aNum": 2 }, { "aString" : "world" } ]
output application/json
---
{
    myKeyValueExample : myArrayOfKeyValuePairs.*aString,
    myObjectExample :  myArrayOfObjects.*aString
}
```

出力 JSON:

```json
{
  "myKeyValueExample": [ "hello", "world" ],
  "myObjectExample": [ "hello", "world" ]
}
```

## [](#descendants)子孫セレクター (​`..myKey`​)

`..`​ セレクターは、配列やオブジェクトで動作します。

このセレクターは、​`..myKey`​ という形式を使用してコンテキストに適用され、選択したコンテキストのサブツリーの一致するすべてのキー - 値ペアの値を取得します。項目の階層構造に関係なく、出力は同じレベルで返されます。

この例では、入力データのツリーのカーディナリティに関係なく、キー ​`name`​ に一致するすべての項目が ​`names`​ というリストに配置されます。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
{ names: payload.people..name }
```

入力 JSON ペイロード:

```json
{
  "people": {
    "person": {
      "name": "Nial",
      "address": {
        "street": {
          "name": "Italia",
          "number": 2164
        },
        "area": {
          "zone": "San Isidro",
          "name": "Martinez"
        }
      }
    }
  }
}
```

出力 JSON:

```json
{
  "names": [
    "Nial",
    "Italia",
    "Martinez"
  ]
}
```

## [](#key_value)キー - 値ペアセレクター (​`.&myKey`​)

`&`​ セレクターは、配列やオブジェクトで動作します。​`&`​ は、現在のコンテキスト内で一致するすべてのキーペアのキーと値の両方を取得します。これらは、取得されたキーと値が含まれるオブジェクトとして返されます。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/xml
---
{
  users: payload.users.&user
}
```

入力 XML ペイロード:

```xml
<?xml version='1.0' encoding='US-ASCII'?>
<users>
  <user>Mariano</user>
  <user>Martin</user>
  <user>Leandro</user>
  <admin>Admin</admin>
  <admin>org_owner</admin>
</users>
```

出力 XML:

```xml
<?xml version='1.0' encoding='US-ASCII'?>
<users>
  <user>Mariano</user>
  <user>Martin</user>
  <user>Leandro</user>
</users>
```

複数値セレクターとは異なり、このセレクターの出力はオブジェクトになっており、各値の元のキーも抽出されています。

### [](#すべての子孫のキー-値ペアの選択)すべての子孫のキー - 値ペアの選択

この例では、​`myVar.people..&name`​ の ​`..`​ および ​`&`​ セレクターを使用して、キー ​`name`​ が含まれる ​`myData`​ 入力のすべての子孫オブジェクトの配列を選択して返します。また、JSON 入力を XML 出力に変換します。

DataWeave スクリプト:

```dataweave
%dw 2.0
var myData = {
  "people": {
    "person": {
      "name": "Nial",
      "address": {
        "street": {
          "name": "Italia",
          "number": 2164
        },
        "area": {
          "zone": "San Isidro",
          "name": "Martinez"
        }
      }
    }
  }
}
output application/xml
---
names: {(myData.people..&name)}
```

出力 XML:

```xml
<?xml version='1.0' encoding='UTF-8'?>
<names>
  <name>Nial</name>
  <name>Italia</name>
  <name>Martinez</name>
</names>
```

## [](#index)インデックスセレクター (​`[anIndex]`​)

このインデックスセレクターは、指定した位置にある要素を返します。これは、配列、オブジェクト、文字列に対して適用できます。

### [](#配列に対するインデックスセレクター)配列に対するインデックスセレクター

このセレクターは、文字列リテラル、配列、オブジェクトに適用できます。オブジェクトの場合、インデックスの位置にあるキー - 値ペアの値が返されます。 配列の場合、要素の値が返されます。インデックスは、ゼロベースです。

1. インデックスが 0 以上の場合、計数は最初から開始されます。
2. インデックスが負の場合、計数は最後から開始されます (-1 は最後の要素)。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
payload.people[1]
```

入力 JSON ペイロード:

```json
{
  "people": [
        {
          "nameFirst": "Nial",
          "nameLast": "Martinez"
        },
        {
          "nameFirst": "Coty",
          "nameLast": "Belgrano"
        }
    ]
}
```

出力 JSON:

```json
{
  "nameFirst": "Coty",
  "nameLast": "Belgrano"
}
```

### [](#オブジェクトに対するインデックスセレクター)オブジェクトに対するインデックスセレクター

セレクターは、指定した位置にあるキー - 値ペアを返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
payload[1]
```

入力 JSON ペイロード:

```json
{
  "nameFirst": "Mark",
  "nameLast": "Nguyen"
}
```

出力 JSON:

```json
"Nguyen"
```

### [](#文字列に対するインデックスセレクター)文字列に対するインデックスセレクター

文字列でインデックスセレクターを使用する場合、文字列は配列に分解され、各文字がインデックスになります。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
{ name: "MuleSoft"[0] }
```

出力 JSON:

```json
{ "name": "M" }
```

セレクターは、文字列を文字の配列として処理し、特定の位置にある文字を選択します。

1. インデックスが 0 以上の場合、計数は最初から開始されます。
2. インデックスが負の場合、計数は最後から開始されます。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
{ name: "Emiliano"[0] }
```

出力 JSON:

```json
{ "name": "E" }
```

## [](#range)範囲セレクター (​`anIndex to anotherIndex`​)

`to`​ セレクターは、配列または文字列の一致するインデックスの値を返します。このセレクターを使用して、範囲内のインデックスの順序を反転させることもできます。セレクターは、文字列の文字をインデックスとして処理します。

- 配列のインデックスを選択:
    
    - `[1,2,3,4][0]`​ は ​`1`​ を返します。
        
        配列の最初の要素のインデックスは常に ​`0`​ です。
    - `[1,2,3,4][3]`​ は ​`4`​ を返します。

### [](#配列に対する範囲セレクター)配列に対する範囲セレクター

範囲セレクターは、範囲で指定した要素のみをその特定の順序で出力します。このセレクターでは、配列のスライスや反転を行うことができます。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
{
  slice: [0,1,2][0 to 1],
  last: [0,1,2][-1 to 0]
}
```

出力 JSON:

```json
{
  "slice": [
    0,
    1
  ],
  "last": [
    2,
    1,
    0
  ]
}
```

### [](#文字列に対する範囲セレクター)文字列に対する範囲セレクター

範囲セレクターは、文字列を文字の配列として処理し、範囲で指定した要素のみをその特定の順序で出力します。このセレクターでは、文字列のスライスや反転を行うことができます。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
{
  slice: "DataWeave"[0 to 1],
  middle : "superfragilisticexpialadocious"[10 to 13],
  last: "DataWeave"[-1 to 0]
}
```

出力 JSON:

```json
{
  "slice": "Da",
  "middle": "list",
  "last": "evaeWataD"
}
```

## [](#xml_attribute)XML 属性セレクター (​`.@myKey`​)

`.@myKey`​ セレクターは、XML 要素の属性を選択します。

キー名なしで ​`.@`​ を使用すると、キー - 値ペアとして属性が含まれるオブジェクトが返されます。

この DataWeave の例では、XML サンプルを変数に読み取り、​`@`​ を使用して XML の属性を選択します。

DataWeave スクリプト:

```dataweave
%dw 2.0
var myVar = read('<product id="1" type="electronic">
  <brand>SomeBrand</brand>
</product>', 'application/xml')
output application/json
---
{
  item: [
  	{
      "type" : myVar.product.@."type",
      "name" : myVar.product.brand,
      "attributes": myVar.product.@
    }
  ]
}
```

出力 JSON:

```json
{
  "item": [
    {
      "type": "electronic",
      "name": "SomeBrand",
      "attributes": {
        "id": "1",
        "type": "electronic"
      }
    }
  ]
}
```

## [](#namespace)名前空間セレクター (​`#`​)

`#`​ は、選択したキーの XML 名前空間をプレーンテキストとして返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
output text/plain
---
payload.order.#
```

入力 XML ペイロード:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<ns0:order xmlns:ns0="http://orders.company.com">
  <name>Mark</name>
  <items>42</items>
  <orderdate>2017-01-04</orderdate>
</ns0:order>
```

出力テキスト:

```json
"http://orders.company.com"
```

## [](#selector_modifiers)セレクター修飾子 (​`!`​、​`?`​)

特定のキーの存在を確認できます。

- `!`​ は、選択したキーを評価し、キーが存在しない場合に例外メッセージを表示して失敗します。
- `?`​ は、選択したキーが存在する場合に ​`true`​ を返し、存在しない場合に ​`false`​ を返します。​`?`​ は、​[絞り込みセレクター (​`myKey[?($ == "aValue")]`​)](#filter_selectors)​ でも使用されます。

### [](#assert_present)アサートの存在検証機能

`!`​ は、指定したいずれかのキーがない場合にエラーを返します。

- `{ "name": "Annie" }.lastName!`​ は、​`There is no key named 'lastName'`​ というメッセージと共にエラーを返します。
- `!`​ を使用しない場合、​`{ "name": "Annie" }.lastName`​ は ​`null`​ を返します。
- キーが存在する場合 (​`{ "name": "Annie" }.name!`​)、結果は ​`"Annie"`​ になります。

### [](#key_present)キーの存在検証機能

指定したキーがオブジェクトに存在する場合や、XML 要素の属性として存在する場合、​`true`​ を返します。

この例では、​`name`​ キーが存在するため ​`true`​ を返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/xml
---
present: payload.name?
```

入力 JSON ペイロード:

```json
{ "name": "Annie" }
```

出力 XML:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<present>true</present>
```

`?`​ は、XML 属性でも動作します。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
{
  item: {
    typePresent : payload.product.@."type"?
  }
}
```

入力 XML ペイロード:

```xml
<product id="1" type="tv">
  <brand>Samsung</brand>
</product>
```

出力 JSON:

```json
{
  "item": { "typePresent": true }
}
```

## [](#filter_selectors)絞り込みセレクター (​`myKey[?($ == "aValue")]`​)

`myKey[?($ == "aValue")]`​ は、配列またはオブジェクト内の一致するキーの値のみを返します。 ​`?`​ は、​[キーの存在検証機能](#key_present)​でも使用されます。 一致するキー - 値ペアがない場合、結果は ​`null`​ になります。

次の例では、​`*.name`​ で返される ​`name`​ キーの配列を入力し、値 ​`"Mariano"`​ を使用して ​`name`​ キーをチェックします。また、一致しない値は除外します。​`$`​ は、選択したキーの値を参照します。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
{ users: payload.users.*name[?($ == "Mariano")] }
```

入力 XML ペイロード:

```xml
<users>
  <name>Mariano</name>
  <name>Luis</name>
  <name>Mariano</name>
</users>
```

出力 JSON:

```json
{
  "users": [
    "Mariano",
    "Mariano"
  ]
}
```

次の例では、同じ​[入力](#input_filter_selectors)​を想定しています。式 ​`( 1 == 1 )`​ が true であるため、入力のすべてのキー-値ペアを返します。 `( 1 == 2 )`​ などの false 式は、​`null`​ を返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
{ users: payload.users.*name[?( 1 == 1)] }
```

入力 XML ペイロード:

```xml
<users>
  <name>Mariano</name>
  <name>Luis</name>
  <name>Mariano</name>
</users>
```

出力 JSON:

```json
{
  "users": [
    "Mariano",
    "Luis",
    "Mariano"
  ]
}
```

次の例では、同じ​[入力](#input_filter_selectors)​を想定しています。​`mapObject`​ を使用して、入力オブジェクト全体を反復処理し、一致しないキー - 値ペアを除外して、一致するペアを返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
---
payload mapObject { ($$) : $[?($=="Mariano")] }
```

入力 XML ペイロード:

```xml
<users>
  <name>Mariano</name>
  <name>Luis</name>
  <name>Mariano</name>
</users>
```

出力 JSON:

```json
{
  "users": {
    "name": "Mariano",
    "name": "Mariano"
  }
}
```

## [](#metadata_selector)メタデータセレクター (.^someMetadata)

Mule ペイロード、変数、属性の指定したメタデータの値を返します。このセレクターは、次のメタデータを返すことができます。

- コンテンツ長メタデータ: `.^contentLength`​ は、値が存在する場合に値のコンテンツの長さを返します。例については、「​[コンテンツ長メタデータセレクター (.^contentLength)](#caret_contentlength)​」を参照してください。
- クラスメタデータ: `.^class`​ は、Plain Old Java Object (POJO) のクラスを返します。たとえば、​`{ "string" : payload.string.^class }`​ は、入力ペイロードで単純な POJO の Java 文字列 (​`simplePojo.string = "myString"`​ など) が定義されている場合に ​`{ "string": "java.lang.String" }`​ を返します。​`{ "date" : payload.date.^class }`​ は ​`{ "date": "java.util.Date" }`​ を返します。例については、「​[クラスメタデータセレクター (.^class)](#caret_class)​」を参照してください。
- エンコードメタデータ: `.^encoding`​ は値のエンコードを返します。たとえば、​`{ "myEncoding" : payload.^encoding }`​ は入力 POJO の ​`{"myEncoding": "UTF-8"}`​ を返します。例については、「​[エンコードメタデータセレクター (.^encoding)](#caret_encoding)​」を参照してください。
- メディア種別セレクター: `.^mediaType`​ はパラメーターが含まれる値の MIME タイプ (​`application/json;charset=UTF-16`​ など) を返します。値の式 ​`{ "myMediaType" : payload.^mediaType }`​ は入力 POJO の ​`"myMediaType": "**/**; charset=UTF-8"`​ を返します。 例については、「​[メディア種別メタデータセレクター (.^mediaType)](#caret_mediatype)​」を参照してください。
- MIME タイプメタデータ: `.^mimeType`​ はパラメーターが含まれない値の MIME タイプ (​`application/json`​ など) を返します。​`{ "myMimeType" : payload.^mimeType }`​ は入力 POJO の ​`{ "myMediaType": "**/**" }`​ を返します。例については、「​[MIME タイプメタデータセレクター (.^mimeType)](#caret_mimetype)​」を参照してください。
- 未加工メタデータ: `.^raw`​ は、Plain Old Java Object (POJO) の基盤となるデータ (通常はバイナリ値) を返します。このセレクターは、中間者攻撃をチェックするときの MD5 ハッシュの計算で使用されることがあります。 例については、「​[未加工メタデータセレクター (.^raw)](#caret_raw)​」を参照してください。
- カスタムメタデータ: `.^myCustomMetadata`​ はカスタムメタデータの値を返します。 例については、「​[カスタムメタデータセレクター (.^myCustomMetadata)](#caret_custom_metadata)​」を参照してください。

### [](#caret_contentlength)コンテンツ長メタデータセレクター (.^contentLength)

値が存在する場合に値のコンテンツの長さを返します。

次の Mule アプリケーションフローでは、ロガーが ​`payload.^contentLength`​ を使用して、Set Payload (​`set-payload`​) コンポーネントで設定された文字列 ​`my string`​ の長さを選択します。

Anypoint Studio の Mule アプリケーション XML

```XML
<flow name="setpayloadobjectFlow" >
  <scheduler doc:name="Scheduler" >
    <scheduling-strategy >
      <fixed-frequency frequency="15" timeUnit="SECONDS"/>
    </scheduling-strategy>
  </scheduler>
  <!-- Set the payload to "my string". -->
  <set-payload value='"my string"' doc:name="Set Payload" />
  <!-- Select the class to which "my string" belongs. -->
  <logger level="INFO" doc:name="Logger" message="#[payload.^contentLength]"/>
</flow>
```

Studio コンソールの出力には、入力文字列 (​`my string`​) の長さが 11 (​`9`​) 文字であることが示されます。この長さには、文字列の空白スペースが含まれています。

Anypoint Studio のコンソール出力

```txt
INFO  2019-05-07 16:59:33,690 [[MuleRuntime].cpuLight.07:
 [carets].caretsFlow.CPU_LITE @39f1dbde]
 [event: 28ce97a0-7124-11e9-acfe-8c8590a99d48]
 org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 11
```

### [](#caret_class)クラスメタデータセレクター (.^class)

Plain Old Java Object (POJO) のクラスを返します。値は Java クラスのメソッドのコールの結果として生成されます。また、DataWeave で Java 値として処理されるデータ型 (​`String`​ や ​`DateTime`​ など) が含まれることもあります。次に例を示します。

- `{ "string" : payload.mystring.^class }`​ は、入力ペイロードで単純な POJO の Java 文字列 (​`simplePojo.string = "myString"`​ など) が定義されている場合に ​`{ "mystring": "java.lang.String" }`​ を返します。
- `{ "mydate" : payload.mydate.^class }`​ は ​`{ "mydate": "java.util.Date" }`​ を返します。

次の Mule アプリケーションフローでは、ロガーが ​`payload.^class`​ を使用して、Set Payload (​`set-payload`​) コンポーネントで設定された Java クラス ​`"my string"`​ を選択します。

Anypoint Studio の Mule アプリケーション XML

```XML
<flow name="setpayloadobjectFlow" >
  <scheduler doc:name="Scheduler" >
    <scheduling-strategy >
      <fixed-frequency frequency="15" timeUnit="SECONDS"/>
    </scheduling-strategy>
  </scheduler>
  <!-- Set the payload to "my string". -->
  <set-payload value='"my string"' doc:name="Set Payload" />
  <!-- Select the class to which "my string" belongs. -->
  <logger level="INFO" doc:name="Logger" message="#[payload.^class]"/>
</flow>
```

Studio コンソールの出力には、ペイロード文字列がクラス ​`java.lang.String`​ に属していることが示されます。

Anypoint Studio のコンソール出力

```txt
INFO  2019-04-20 16:10:03,075 [[MuleRuntime].cpuLight.08:
 [setpayloadobject].setpayloadobjectFlow.CPU_LITE @6447187e]
 [event: 6da29400-63c1-11e9-98e0-8c8590a99d48]
 org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 java.lang.String
```

### [](#caret_encoding)エンコードメタデータセレクター (.^encoding)

値のエンコードを返します。たとえば、​`{ "myEncoding" : payload.^encoding }`​ は入力 POJO の ​`{"myEncoding": "UTF-8"}`​ を返します。

次の Mule アプリケーションフローでは、ロガーが ​`payload.^encoding`​ を使用して、Set Payload (​`set-payload`​) コンポーネントで設定されたエンコード ​`"my string"`​ を選択します。 Scheduler (​`scheduler`​) コンポーネントは、定期的に新しい Mule イベントを生成して、Set Payload で設定されたペイロードを保持するイベントソースです。

Anypoint Studio の Mule アプリケーション XML

```XML
<flow name="setpayloadobjectFlow" >
  <scheduler doc:name="Scheduler" >
    <scheduling-strategy >
      <fixed-frequency frequency="15" timeUnit="SECONDS"/>
    </scheduling-strategy>
  </scheduler>
  <!-- Set the payload to "my string". -->
  <set-payload value='"my string"' doc:name="Set Payload" />
  <!-- Select the encoding of "my string". -->
  <logger level="INFO" doc:name="Logger" message="#[payload.^encoding]"/>
</flow>
```

Studio コンソールの出力には、ペイロード文字列に ​`UTF-8`​ エンコードが含まれていることが示されます。

Anypoint Studio のコンソール出力

```txt
INFO  2019-04-20 16:14:24,222 [[MuleRuntime].cpuLight.03:
 [setpayloadobject].setpayloadobjectFlow.CPU_LITE @62bea6a6]
 [event: 0938bf70-63c2-11e9-98e0-8c8590a99d48]
 org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 UTF-8
```

### [](#caret_mediatype)メディア種別メタデータセレクター (.^mediaType)

パラメーターが含まれる値の MIME タイプ (​`application/json;charset=UTF-16`​ など) を返します。値の式 ​`{ "myMediaType" : payload.^mediaType }`​ は入力 POJO の ​`"myMediaType": "**/**; charset=UTF-8"`​ を返します。

次の Mule アプリケーションフローでは、ロガーが ​`payload.^mediaType`​ を使用して、Set Payload (​`set-payload`​) コンポーネントで設定されたメディア種別 ​`2014-10-12T11:11:19-00:03`​ を選択します。

Anypoint Studio の Mule アプリケーション XML

```XML
<flow name="setpayloadobjectFlow" >
  <scheduler doc:name="Scheduler" >
    <scheduling-strategy >
      <fixed-frequency frequency="15" timeUnit="SECONDS"/>
    </scheduling-strategy>
  </scheduler>
  <set-payload value='#[|2014-10-12T11:11:19-00:03| as DateTime]' doc:name="Set Payload" />
  <logger level="INFO" doc:name="Logger" message="#[payload.^mediaType]"/>
</flow>
```

Studio コンソールの出力には、​`DateTime`​ ペイロードに ​`application/java; charset=UTF-8`​ メディア種別が含まれていることが示されます。

Anypoint Studio のコンソール出力

INFO  2019-04-20 16:41:01,276 \[\[MuleRuntime\].cpuLight.04:
 \[setpayloadobject\].setpayloadobjectFlow.CPU\_LITE @7e991c71\]
 \[event: c0e96860-63c5-11e9-bcff-8c8590a99d48\]
 rg.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 application/java; charset=UTF-8

次の Mule アプリケーションフローでは、ロガーが ​`payload.^mediaType`​ を使用して文字列 ​`"my string"`​ を選択し、Set Payload (​`set-payload`​) コンポーネントの ​**fx**​ 式内で設定された文字列 (​`#["my string as String type" as String]`​) を選択します。

Anypoint Studio の Mule アプリケーション XML

```XML
<flow name="setpayloadobjectFlow" >
  <scheduler doc:name="Scheduler" >
    <scheduling-strategy >
      <fixed-frequency frequency="15" timeUnit="SECONDS"/>
    </scheduling-strategy>
  </scheduler>
  <!-- Set the payload to "my string". -->
  <set-payload value='"my string"' doc:name="Set Payload" />
  <!-- Select the media type of "my string". -->
  <logger level="INFO" doc:name="Logger" message='#[payload.^mediaType]'/>
  <!-- Set the payload using the fx expression "my string" as String. -->
  <set-payload value='#["my string as String type" as String]' doc:name="Set Payload" />
  <!-- Select the media type of a Java string. -->
  <logger level="INFO" doc:name="Logger" message='#[payload.^mediaType]'/>
</flow>
```

Studio コンソールの出力には、単純な文字列にメディア種別 ​`**/**`​ が含まれていて、​**fx**​ 式で設定された文字列にメディア種別 ​`application/java; charset=UTF-8`​ が含まれていることが示されます。

Anypoint Studio のコンソール出力

```txt
INFO  2019-04-20 16:52:50,801 [[MuleRuntime].cpuLight.01:
 [setpayloadobject].setpayloadobjectFlow.CPU_LITE @5d914abe]
 [event: 68121cd0-63c7-11e9-bcff-8c8590a99d48]
 org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 */*

INFO  2019-04-20 16:52:51,085 [[MuleRuntime].cpuLight.01:
 [setpayloadobject].setpayloadobjectFlow.CPU_LITE @5d914abe]
 [event: 68121cd0-63c7-11e9-bcff-8c8590a99d48]
 org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 application/java; charset=UTF-8
```

### [](#caret_mimetype)MIME タイプメタデータセレクター (.^mimeType)

パラメーターが含まれない値の MIME タイプ (​`application/json`​ など) を返します。​`{ "myMimeType" : payload.^mimeType }`​ は入力 POJO の ​`{ "myMediaType": "**/**" }`​ を返します。

次の Mule アプリケーションフローでは、ロガーが ​`payload.^mimeType`​ を使用して文字列 ​`"my string"`​ を選択し、Set Payload (​`set-payload`​) コンポーネントの ​**fx**​ 式内で設定された文字列 (​`#["my string as String type" as String]`​) を選択します。

Anypoint Studio の Mule アプリケーション XML

```XML
<flow name="setpayloadobjectFlow" >
  <scheduler doc:name="Scheduler" >
    <scheduling-strategy >
      <fixed-frequency frequency="15" timeUnit="SECONDS"/>
    </scheduling-strategy>
  </scheduler>
  <!-- Set the payload to "my string". -->
  <set-payload value='"my string"' doc:name="Set Payload" />
  <!-- Select the MIME type of "my string". -->
  <logger level="INFO" doc:name="Logger" message='#[payload.^mimeType]'/>
  <!-- Set the payload using the fx expression "my string" as String. -->
  <set-payload value='#["my string as String type" as String]' doc:name="Set Payload" />
  <!-- Select the MIME type of a Java string. -->
  <logger level="INFO" doc:name="Logger" message='#[payload.^mimeType]'/>
</flow>
```

Studio コンソールの出力には、単純な文字列に MIME タイプ ​`**/**`​ が含まれていて、​**fx**​ 式で設定された文字列に MIME タイプ ​`application/java`​ が含まれていることが示されます。

Anypoint Studio のコンソール出力

```txt
INFO  2019-04-20 17:02:07,762 [[MuleRuntime].cpuLight.06:
 [setpayloadobject].setpayloadobjectFlow.CPU_LITE @2d6f64b9]
 [event: b4097b00-63c8-11e9-bcff-8c8590a99d48]
 org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 */*

INFO  2019-04-20 17:02:08,029 [[MuleRuntime].cpuLight.06:
 [setpayloadobject].setpayloadobjectFlow.CPU_LITE @2d6f64b9]
 [event: b4097b00-63c8-11e9-bcff-8c8590a99d48]
 org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 application/java
```

### [](#caret_raw)未加工メタデータセレクター (.^raw)

POJO の基盤となるバイナリ値を返します。このセレクターは、中間者 (MITM) 攻撃をチェックするための MD5 やその他の暗号化ハッシュ関数の計算で使用されることがあります。

次の例では、Set Payload コンポーネント (​`set-payload`​) を使用してバイナリ値を生成し、Transform Message コンポーネント (​`ee:transform`​) を使用してバイナリ値の MD5 の未加工データ (​`MD5(payload.^raw)`​) を返します。また、Logger コンポーネント (​`logger`​) は、未加工データを Studio コンソールに書き込むように設定されます。比較のために、2 番目のロガーは標準 JSON 形式の一般的な ​`payload`​ を返します。

Anypoint Studio の Mule アプリケーション XML

```XML
<flow name="rawcaret2Flow" >
  <scheduler doc:name="Scheduler" >
    <scheduling-strategy >
      <fixed-frequency frequency="30" timeUnit="SECONDS"/>
    </scheduling-strategy>
  </scheduler>
  <set-payload value='#["1234-5678-9123" as Binary]' doc:name="Set Payload" />
  <ee:transform doc:name="Transform Message" >
    <ee:message >
      <ee:set-payload ><![CDATA[%dw 2.0
import * from dw::Crypto
output application/json
---
{ "myRawData" : MD5(payload.^raw) }]]></ee:set-payload>
    </ee:message>
  </ee:transform>
  <logger level="INFO" doc:name="Logger" message="#[payload.^raw]"/>
  <logger level="INFO" doc:name="Logger" message="#[payload]"/>
</flow>
```

ロガーメッセージの未加工出力では、標準 JSON 出力が生成されずに、ペイロード全体が二重引用符で囲まれ、新しい行ごとに改行文字 (​`\n`​) が挿入されます。

Anypoint Studio のコンソール出力

```txt
INFO  2019-04-22 14:10:14,537 [[MuleRuntime].cpuLight.08:
 [rawcaret2].rawcaret2Flow.CPU_LITE @764a5a61]
 [event: 058f6a90-6543-11e9-9d99-8c8590a99d48]
 org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 "{\n  "myRawData": "5403e5a202c594871d59898b13054be5"\n}"

INFO  2019-04-22 14:10:14,540 [[MuleRuntime].cpuLight.08:
 [rawcaret2].rawcaret2Flow.CPU_LITE @764a5a61]
 [event: 058f6a90-6543-11e9-9d99-8c8590a99d48]
 org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
 { "myRawData": "5403e5a202c594871d59898b13054be5" }
```

次の例では、HTTP Listener ソース (​`listener`​) を使用して、POST 要求を介して受け取った XML ペイロードを取得した後、Transform Message コンポーネント (​`ee:transform`​) を使用して、未加工データ (​`(payload.^raw as String) scan /encoding='([A-z0-9-]+)'/)`​) を返すことで XML ペイロードのエンコード値を取得します。Logger コンポーネント (​`logger`​) では、​`payload`​ が JAVA 形式で返されます。

Anypoint Studio の Mule アプリケーション XML

```XML
<http:listener-config name="HTTP_Listener_config" >
    <http:listener-connection host="0.0.0.0" port="8081" />
</http:listener-config>
<flow name="test-flow">
	<http:listener path="/test" config-ref="HTTP_Listener_config"/>
	<ee:transform>
		<ee:message>
		<ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
((payload.^raw as String) scan /encoding='([A-z0-9-]+)'/)[0][1]]]></ee:set-payload>
		</ee:message>
	</ee:transform>
	<logger level="INFO" message="#[payload]"/>
</flow>
```

お気に入りの REST クライアントまたは API テストツールを使用して、次の XML 本文を含む POST 要求を送信します。

```XML
<?xml version='1.0' encoding='ISO-8859-1'?>
<test>
</test>
```

ロガーメッセージでは、抽出されたエンコード値 ​`ISO-8859-1`​ が返されます。

Anypoint Studio のコンソール出力

```txt
INFO  2021-05-12 12:25:41,618 [[MuleRuntime].uber.03: [xmlmodule].Flow.CPU_INTENSIVE @de48fc8] [processor: Flow/processors/2; event: 4fe7f6a0-b336-11eb-909c-f01898ad2638] org.mule.runtime.core.internal.processor.LoggerMessageProcessor: ISO-8859-1
```

### [](#caret_custom_metadata)カスタムメタデータセレクター (.^myCustomMetadata)

カスタムメタデータの値を返します。メタデータは、​`as`​ 演算子を使用して任意の値に関連付けることができます。

次の例では、​`userName.^myCustomMetadata`​ を使用して、スクリプトのヘッダーで変数 ​`userName`​ として定義されているカスタムメタデータの値を DataWeave スクリプトとして返します。比較のために、この例では ​`userName`​ の値も返します。

DataWeave スクリプト:

```dataweave
%dw 2.0
output application/json
var userName = "DataWeave" as String {myCustomMetadata: "customMetadataValue"}
---

{
  "valueOfVariableMetaData" :  userName.^myCustomMetadata,
  "valueOfVariable" :  userName,
}
```

スクリプトの出力は、​`"customMetadataValue"`​ (カスタムメタデータの値) と ​`"DataWeave"`​ (​`userName`​ 変数の値) です。

出力 JSON:

```json
{
  "valueOfVariableMetaData": "customMetadataValue",
  "valueOfVariable": "DataWeave"
}
```

## [](#関連情報)関連情報

- [DataWeave セレクター](https://docs.mulesoft.com/jp/dataweave/2.3/dataweave-selectors)
- [DataWeave クイックスタート](https://docs.mulesoft.com/jp/dataweave/2.3/dataweave-quickstart)
- [DataWeave の型](https://docs.mulesoft.com/jp/dataweave/2.3/dataweave-types)
- [DataWeave の解説書](https://docs.mulesoft.com/jp/dataweave/2.3/dataweave-cookbook)