Можно ли использовать ssis для загрузки XML-файлов на сервер SQL

#xml #ssis #xsd #etl

#xml #ssis #xsd #etl

Вопрос:

Программное обеспечение, используемое моей компанией, генерирует тысячи XML-файлов. Мне нужно загрузить данные, содержащиеся внутри, на сервер SQL для создания отчетов.

Я намерен использовать SSIS для загрузки данных. Я создал цикл for each для чтения каждого из файлов и передачи имени файла в качестве переменной в задачу потока данных. DFT будет считывать каждый XML и загружать его в таблицу SQL. Однако у меня возникли проблемы с получением DFT для чтения XML.

Я сгенерировал файл XSD, но он не читает XML так, как мне нужно. К сожалению, программное обеспечение является сторонним и используется другими компаниями, поэтому мы не можем настроить XML-файлы. Единственное, что я могу изменить, это пакет XSD или SSIS.

Вот XML

 <SOFTWAREDATA>
  <version>4</version>
  <date>2018-04-26</date>
  <start_time>13:39:15</start_time>
  <end_time>13:40:14</end_time>
  <user>user</user>
  <group>stn</group>
  <sequence>stn</sequence>
  <line_path>company</line_path>
  <line_path>location</line_path>
  <line_path>productionline</line_path>
  <training_file>filename.txt</training_file>
  <model>model</model>
  <variant>model-RHD</variant>
  <difficulty_level>1</difficulty_level>
  <no_of_operations>1</no_of_operations>
  <no_of_overview_questions>0</no_of_overview_questions>
  <no_of_correct_operations>1</no_of_correct_operations>
  <no_of_wrong_operation>0</no_of_wrong_operation>
  <no_of_missed_operation>0</no_of_missed_operation>
  <no_of_wrong_tool>0</no_of_wrong_tool>
  <no_of_wrong_prop>0</no_of_wrong_prop>
  <no_of_wrong_answers>0</no_of_wrong_answers>  
  <no_of_wrong_overview_answers>0</no_of_wrong_overview_answers>
  <no_of_wrong_direction>0</no_of_wrong_direction>
  <no_of_tool_help>0</no_of_tool_help>
  <no_of_part_help>0</no_of_part_help>
  <no_of_show_operation_help>0</no_of_show_operation_help>
  <no_of_info_help>0</no_of_info_help>
  <no_of_navigation_help>0</no_of_navigation_help>
  <no_of_operation_list_help>0</no_of_operation_list_help>
  <was_sequence_completed_ok>true</was_sequence_completed_ok>
  <priority_mode>false</priority_mode>
  <version_info>info</version_info>
  <build>404</build>
  <revision>51</revision>
  <errors>0</errors>
</SOFTWAREDATA>
 

и вот XSD

 <?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="SOFTWAREDATA">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="version" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="date" type="xs:date" />
        <xs:element minOccurs="0" name="start_time" type="xs:time" />
        <xs:element minOccurs="0" name="end_time" type="xs:time" />
        <xs:element minOccurs="0" name="user" type="xs:string" />
        <xs:element minOccurs="0" name="group" type="xs:string" />
        <xs:element minOccurs="0" name="sequence" type="xs:string" />
        <xs:element minOccurs="0" maxOccurs="unbounded" name="line_path" type="xs:string" />
        <xs:element minOccurs="0" name="training_file" type="xs:string" />
        <xs:element minOccurs="0" name="model" type="xs:string" />
        <xs:element minOccurs="0" name="variant" type="xs:string" />
        <xs:element minOccurs="0" name="difficulty_level" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_operations" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_overview_questions" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_correct_operations" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_wrong_operation" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_missed_operation" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_wrong_tool" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_wrong_prop" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_wrong_answers" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_wrong_overview_answers" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_wrong_direction" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_tool_help" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_part_help" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_show_operation_help" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_info_help" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_navigation_help" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="no_of_operation_list_help" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="was_sequence_completed_ok" type="xs:boolean" />
        <xs:element minOccurs="0" name="priority_mode" type="xs:boolean" />
        <xs:element minOccurs="0" name="version_info" type="xs:string" />
        <xs:element minOccurs="0" name="build" type="xs:unsignedShort" />
        <xs:element minOccurs="0" name="revision" type="xs:unsignedByte" />
        <xs:element minOccurs="0" name="errors" type="xs:unsignedByte" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
 

Я новичок в работе с XML-файлами, за исключением power query, где файлы считываются без проблем (слишком много файлов для использования power query). Я ожидал увидеть таблицу с одной строкой и именем каждого элемента в качестве заголовка столбца и значений в строке.

Когда я пытаюсь прочитать файл в SSIS, он получает только столбец «line_path»:

введите описание изображения здесь

Можно ли сделать то, чего я пытаюсь достичь, изменив либо пакет, либо XSD?

Комментарии:

1. Я всегда использую компонент скрипта c # (load) для чтения XML-файлов. Вы хотите создать класс (либо использовать XSD.exe инструмент с помощью XSD или вставьте XML как специальный для класса), а затем используйте XML desierializer.

2. Я думаю, я обычно делаю это таким образом, потому что я использую другие инструменты (например, WebClient для получения XML из API) для получения данных, и мой XML обычно имеет вложенные списки для обработки.

3. к сожалению, я не знаю c #, поэтому то, что вы описали, в настоящее время не является вариантом. Однако я нашел альтернативный подход

Ответ №1:

Для всех, кто может наткнуться на этот пост, я нашел решение…

Вместо использования источника XML я создал некоторый код M в Power Query Excel и использовал его внутри источника power query. Я смог получить доступ ко всем XML-файлам сразу в таблице и загрузить их в SQL, а не перебирать каждый файл по отдельности.

Не стесняйтесь обращаться ко мне, если вам нужна более подробная информация об этом решении.