#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, а не перебирать каждый файл по отдельности.
Не стесняйтесь обращаться ко мне, если вам нужна более подробная информация об этом решении.