XML は、一般的なテキストベースのマークアップ言語です。 ArcGIS Velocity は、さまざまなソースから XML 形式で表されている IoT 観測データを取り込むことができます。
XML は次のタイプのフィードとデータ ソースのデータ形式としてサポートされています。
- フィード - AWS IoT、Azure Event Hub、Azure Service Bus、HTTP ポーラー、HTTP 受信機、Kafka、MQTT、RabbitMQ、WebSocket
- データ ソース - Amazon S3、Azure Blob Storage、HTTP ポーラー
XML 構成のオプション
フィードまたはデータ ソースの構成時に、取り込むデータのタイプを判定するためにデータのサンプリングが行われます。 サンプリングによってデータが XML 形式であることが特定された場合、XML 構成に関する追加のプロパティを指定できます。
ルート エレメント
[ルート エレメント] パラメーターは、該当する場合、メッセージが検出される XML 構造のルート エレメントを指定します。 ルート エレメントは、サブエレメントが属性であるオブジェクトを識別します。 すべてのメッセージを XML ドキュメントのルートの下に格納する XML 構造の場合は、このパラメーターを空白のままにします。
たとえば、複数のエレメントから成る XML データの例を次に示します。
<?xml version="1.0" encoding="UTF-8"?>
<flight>
<aircraftData>
<aircraftID>N-X-211</aircraftID>
<pilot>Charles L.</pilot>
<speed>212.28</speed>
<altitude>20200</altitude>
<heading>44.02</heading>
<latitude>52.653726</latitude>
<longitude>-21.885421</longitude>
<status>In flight</status>
<datetime>1589962024</datetime>
</aircraftData>
<aircraftData>
<aircraftID>N02061</aircraftID>
<pilot>Jane D.</pilot>
<speed>132.00</speed>
<altitude>13008</altitude>
<heading>264.54</heading>
<latitude>19.510083</latitude>
<longitude>-153.950114</longitude>
<status>In flight</status>
<datetime>1589962042</datetime>
</aircraftData>
<airportData>
<name>John F. Kennedy Int. Airport</name>
<IATA>JFK</IATA>
<ICAO>KJFK</ICAO>
<date>1589932800</date>
<location>
<latitude>40.643585</latitude>
<longitude>-73.781927</longitude>
</location>
</airportData>
</flight>
aircraftData のルート エレメントが指定されている場合は、Velocity によって次のデータのみが取り込まれます。
<aircraftData>
<aircraftID>N-X-211</aircraftID>
<pilot>Charles L.</pilot>
<speed>212.28</speed>
<altitude>20200</altitude>
<heading>44.02</heading>
<latitude>52.653726</latitude>
<longitude>-21.885421</longitude>
<status>In flight</status>
<datetime>1589962024</datetime>
</aircraftData>
<aircraftData>
<aircraftID>N02061</aircraftID>
<pilot>Jane D.</pilot>
<speed>132.00</speed>
<altitude>13008</altitude>
<heading>264.54</heading>
<latitude>19.510083</latitude>
<longitude>-153.950114</longitude>
<status>In flight</status>
<datetime>1589962042</datetime>
</aircraftData>
以下の図は、Velocity のスキーマの作成を示したものです。
フラット化
[フラット化] パラメーターは、ネストされた XML を別々のフィールドに分割するかどうかを決定します。 これらの新しいフィールドには、上位レベル (親) のエレメントにアンダースコアとサブエレメントを付加した名前が付きます。 次の例では、location エレメントに、latitude と longitude の 2 つのサブエレメントがあります。 フラット化すると、location エレメントが、location_latitude と location_longitude の 2 つのフィールドに分割されます。
複数の深さレベルでネストされている XML をフラットにすることができます。 フラット化された新しいフィールドの名前には、最も深いレベルのサブエレメントに到達するまで、オブジェクト名とアンダースコアが付加されます。
たとえば、次の XML の例、具体的には codes エレメントと location エレメントについて考えてみましょう。
<?xml version="1.0" encoding="UTF-8"?>
<airportData>
<airport>
<name>John F. Kennedy Int. Airport</name>
<codes>
<IATA>JFK</IATA>
<ICAO>KJFK</ICAO>
</codes>
<status>Operational</status>
<date>1589932800</date>
<location>
<latitude>40.643585</latitude>
<longitude>-73.781927</longitude>
</location>
</airport>
<airport>
<name>Los Angeles Int. Airport</name>
<codes>
<IATA>LAX</IATA>
<ICAO>KLAX</ICAO>
</codes>
<status>Delayed</status>
<date>1589932800</date>
<location>
<latitude>33.942619</latitude>
<longitude>-118.420942</longitude>
</location>
</airport>
</airportData>
airport がルート エレメントとして指定され、[フラット化] チェックボックスがオンになっている場合、上に示した XML の例は次のように処理され、codes サブエレメントと location サブエレメントがそれぞれのフィールドに分割されます。
<airport>
<name>John F. Kennedy Int. Airport</name>
<codes_IATA>JFK</codes_IATA>
<codes_ICAO>KJFK</codes_ICAO>
<status>Operational</status>
<date>1589932800</date>
<location_latitude>40.643585</location_latitude>
<location_longitude>-73.781927</location_longitude>
</airport>
<airport>
<name>Los Angeles Int. Airport</name>
<codes_IATA>LAX</codes_IATA>
<codes_ICAO>KLAX</codes_ICAO>
<status>Delayed</status>
<date>1589932800</date>
<location_latitude>33.942619</location_latitude>
<location_longitude>-118.420942</location_longitude>
</airport>
スキーマは以下の図のように Velocity に取り込まれます。
フラット化の適用除外
[フラット化の適用解除] パラメーターでは、単一の文字列エレメントのままにし、別々のフィールドには分割しない XML エレメントの名前を 1 つ以上指定できます。
次に示す XML の例について考えてみましょう。
<?xml version="1.0" encoding="UTF-8"?>
<airportData>
<airport>
<name>John F. Kennedy Int. Airport</name>
<codes>
<IATA>JFK</IATA>
<ICAO>KJFK</ICAO>
</codes>
<status>Operational</status>
<date>1589932800</date>
<location>
<latitude>40.643585</latitude>
<longitude>-73.781927</longitude>
</location>
</airport>
<airport>
<name>Los Angeles Int. Airport</name>
<codes>
<IATA>LAX</IATA>
<ICAO>KLAX</ICAO>
</codes>
<status>Delayed</status>
<date>1589932800</date>
<location>
<latitude>33.942619</latitude>
<longitude>-118.420942</longitude>
</location>
</airport>
</airportData>
[ルート エレメント] パラメーターに airport が指定され、[フラット化] パラメーターがオンになっていて、codes の [フラット化の適用除外] パラメーターの値が指定されている場合、上に示した XML の例は以下の図のように処理されます。 codes エレメントはフラット化によって分割されていません。IATA および ICAO はサブエレメントとして維持されます。
<airport>
<name>John F. Kennedy Int. Airport</name>
<codes>
<IATA>JFK</IATA>
<ICAO>KJFK</ICAO>
</codes>
<status>Operational</status>
<date>1589932800</date>
<location_latitude>40.643585</location_latitude>
<location_longitude>-73.781927</location_longitude>
</airport>
<airport>
<name>Los Angeles Int. Airport</name>
<codes>
<IATA>LAX</IATA>
<ICAO>KLAX</ICAO>
</codes>
<status>Delayed</status>
<date>1589932800</date>
<location_latitude>33.942619</location_latitude>
<location_longitude>-118.420942</location_longitude>
</airport>
スキーマは以下の図のように Velocity に取り込まれます。
配列のフラット化
[配列のフラット化] パラメーターは、配列を別のフィールドにフラット化するかどうかを指定します。 新しいフィールドには、配列エレメントにアンダースコアと配列エレメントのアイテムの名前を付加した名前が付きます。 エレメントの配列をフラット化する際、XML を複数の深さレベルでネストすることができます。 フラット化された新しいフィールドの名前には、最も深いエレメントに到達するまで、配列エレメントの数とアンダースコアが付加されます。
たとえば、tags 配列エレメントを表示する XML の例を次に示します。<?xml version="1.0" encoding="UTF-8"?>
<flight>
<aircraftData>
<aircraftID>N-X-211</aircraftID>
<pilot>Charles L.</pilot>
<speed>212.28</speed>
<altitude>20200</altitude>
<heading>44.02</heading>
<latitude>52.653726</latitude>
<longitude>-21.885421</longitude>
<status>In flight</status>
<datetime>1589962024</datetime>
<tags>
<tag n="0">boeing</tag>
<tag n="1">vtol</tag>
<tag n="2">glider</tag>
</tags>
</aircraftData>
</flight>
[ルート エレメント] パラメーターに aircraftData が指定され、[配列のフラット化] パラメーターがオンになっている場合、上に示した XML の例は以下の図のように処理されます。 tags エレメントのアイテムがそれぞれのフィールドに分割されていることがわかります。<?xml version="1.0" encoding="UTF-8"?>
<flight>
<aircraftData>
<aircraftID>N-X-211</aircraftID>
<pilot>Charles L.</pilot>
<speed>212.28</speed>
<altitude>20200</altitude>
<heading>44.02</heading>
<latitude>52.653726</latitude>
<longitude>-21.885421</longitude>
<status>In flight</status>
<datetime>1589962024</datetime>
<tags_tag_0_n>0</tags_tag_0_n>
<tags_tag_0>boeing</tags_tag_0>
<tags_tag_1_n>1</tags_tag_1_n>
<tags_tag_1>vtol</tags_tag_1>
<tags_tag_2_n>2</tags_tag_2_n>
<tags_tag_2>glider</tags_tag_2>
</aircraftData>
</flight>
スキーマは以下の図のように Velocity に取り込まれます。
配列のフラット化の適用除外
[配列のフラット化の適用除外] パラメーターでは、アイテムを別々のフィールドに分割する代わりに、配列の最後のアイテムを返す XML 配列の名前を 1 つ以上指定できます。 次に示す XML の例について考えてみましょう。<?xml version="1.0" encoding="UTF-8"?>
<flight>
<aircraftData>
<aircraftID>N-X-211</aircraftID>
<pilot>Charles L.</pilot>
<speed>212.28</speed>
<altitude>20200</altitude>
<heading>44.02</heading>
<latitude>52.653726</latitude>
<longitude>-21.885421</longitude>
<status>In flight</status>
<datetime>1589962024</datetime>
<tags>
<tag n="0">boeing</tag>
<tag n="1">vtol</tag>
<tag n="2">glider</tag>
</tags>
<setting>
<value>3</value>
<value>2</value>
<value>1</value>
</setting>
</aircraftData>
</flight>
[配列のフラット化] パラメーターがオンになっていて、setting_value の [配列のフラット化の適用除外] パラメーターの値が指定されている場合、上に示した XML の例は以下の図のように処理されます。 setting 配列で、配列の最後のアイテムのみが返されます。 複数の配列をフラット化の適用から除外するには、[配列のフラット化の適用除外] パラメーターでカンマを使用して値を区切ります。<?xml version="1.0" encoding="UTF-8"?>
<flight>
<aircraftData>
<aircraftID>N-X-211</aircraftID>
<pilot>Charles L.</pilot>
<speed>212.28</speed>
<altitude>20200</altitude>
<heading>44.02</heading>
<latitude>52.653726</latitude>
<longitude>-21.885421</longitude>
<status>In flight</status>
<datetime>1589962024</datetime>
<tags_tag_0_n>0</tags_tag_0_n>
<tags_tag_0>boeing</tags_tag_0>
<tags_tag_1_n>1</tags_tag_1_n>
<tags_tag_1>vtol</tags_tag_1>
<tags_tag_2_n>2</tags_tag_2_n>
<tags_tag_2>glider</tags_tag_2>
<setting>
<value>1</value>
</setting>
</aircraftData>
</flight>
スキーマは、Velocity で以下の図のように表されます。
検討事項および制限事項
Velocity で XML 形式のデータを使って作業する場合、注意すべきいくつかの重要な考慮事項があります。
サブエレメントがネストされた XML データ
XML には、ルート エレメントで開始および終了するエレメントの階層が必要です。 不特定数のエレメントとサブエレメントを、ルート エレメントの下に追加できます。 現在、Velocity は、指定したルートの下にあるプライマリ エレメントからスキーマを取得します。 プライマリ エレメントの下にある追加のサブエレメントは、連結された文字列として処理されます。 以後の文字列の処理は、Velocity 解析ツールを使用して実行できます。 たとえば、XML ドキュメントに新しいルートを定義するには、[ルート エレメント] パラメーターを使用できます。
XML のサンプルとスキーマ全体の比較
XML ドキュメントでは、同じ名前を共有するエレメントは常に同じサブエレメントを持つわけではありません。 これは XML ベースのフィードまたはデータ ソースを初めて構成、編集、または最終的に使用する場合に意味があります。 Velocity は、データ形式とスキーマを決定するために、データ ストリームまたはファイルをサンプリングします。 サンプリング プロセスによって返されたすべてのサンプルが異なるスキーマを持つことが原因で XML 要素が欠落している場合、それらのフィールドはフィードまたはソース データのスキーマから漏れてしまいます。
XML ファイルのサイズ
ベスト プラクティスとして、Velocity にインポートする XML ファイルのサイズを、1 ファイルあたり 100 MB 以下に維持します。 1 ファイルあたり 100 MB を超えるファイルの場合は、100 MB 以下になるようファイルを分けて作成することをお勧めします。