XML

XML – это распространенный текстовый язык разметки. ArcGIS Velocity может получать данные наблюдений IoT, выраженные в виде XML, из различных источников.

XML поддерживается в качестве формата данных для следующих типов каналов и источников данных:

Опции конфигурации 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 показано ниже:

Итоговая страница подтверждения схемы с указанным корневым элементом aircraftData.

Разбить

Параметр Разбить определяет, следует ли разбивать какой-либо вложенный 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:

<?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 может содержать несколько уровней глубины. К новым именам полей будет добавляться число элементов массива с подчеркиванием, пока не будет достигнут элемент самого глубокого уровня.

Например, в следующем примере 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, как показано ниже:

Результирующая страница схемы подтверждения показывает, что поле setting_value возвращает последний элемент массива.

Советы и ограничения

При работе с данными в формате XML в Velocity необходимо учитывать несколько важных соображений и ограничений.

XML-данные с вложенными подэлементами?

XML требует иерархии элементов, которая начинается и заканчивается корневым элементом. Под корневым элементом может быть неопределенное количество дополнительных элементов и подэлементов. В настоящее время Velocity получает свою схему из первичных элементов, находящихся под указанным корневым элементом. Любые дополнительные подэлементы под первичными элементами обрабатываются как сцепленные строки. Дальнейшая обработка строк происходит с помощью инструментов анализа Velocity. Например, можно использовать параметр Корневой элемент для определения нового корня в XML-документе.

Образцы XML сравниваются со всей схемой

В документе XML элементы с одинаковым именем не всегда содержат одинаковые подэлементы. Это имеет значение при первой настройке, редактировании или, в конечном итоге, использовании канала или источника данных на основе XML. Velocity отбирает образцы потока данных или файлов, для определения наилучшего формата данных и схемы. Если во всех образцах, возвращенных в процессе, отсутствуют элементы XML, поскольку у этих образцов другая схема, то эти поля будут пропущены в схеме данных канала или источника.

Размер файла XML

Рекомендуется использовать импортируемые в Velocity XML-файлы размером менее 100 МБ. Если размер каждого файла превышает 100 МБ, рекомендуется создавать отдельные файлы размером менее 100 МБ каждый.