XML 是一种常见的基于文本的标记语言。 ArcGIS Velocity 可以从多种来源获取表示为 XML 的 IoT 观测数据。
以下源和数据源类型支持将 XML 作为数据格式:
- 源 - AWS IoT、Azure Event Hub、Azure Service Bus、HTTP 轮询器、HTTP 接收器、Kafka、MQTT、RabbitMQ、WebSocket。
- 数据源 - Amazon S3、Azure Blob 存储和 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。 如果展平,location 元素将分为两个字段,即 location_latitude 和 location_longitude。
展平时,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 元素名称,这些名称应保留为单个字符串元素,而不应分解为单独的字段。
考虑以下 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 可以嵌套多个深度级别。 新的展平字段名称追加了带下划线的数组元素数量,直到到达最深的元素。
例如,以下示例 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 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 数组名称,这些名称将返回数组中的最后一项,而不划分为单独的字段。 考虑以下 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 文件大小保持在每个文件 100 MB 以下。 如果每个文件大于 100 MB,建议您创建每个文件小于 100 MB 的单独文件。