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 показывает, что поле codes исключено из разбиения.

Разбить массивы

Параметр Разбить массивы определяет, следует ли разбивать массивы на отдельные поля. Имена новых полей образуются путем добавления слияния имени элемента массива с подчеркиванием и имени элемента объектов массива. При разбиении массива элементов 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 МБ каждый.