Парсинг XML файлов в LabVIEW (XML-Parse)
Я не претендую на написание пособия по XML парсингу в LabVIEW, по этому и не стремлюсь описать все методы и функции присутствующие в данном языке программирования и предназначенные для работы с XML форматом.
Поступим наоборот, попытаемся получить информацию из XML файла минимальной «кровью».
Если Вы обратились к этой странице, скорее всего в этом возникла необходимость и что такое XML и как он организован вы уже знаете, или по крайней мере имеете хоть малейшее представление. Именно по этому опустим прелюдии и описания XML, тем более информации можно найти бесконечное множество, так как формат и все спецификации открыты.
На рис .1 и рис. 2 изображены структуры вариантов XML файлов, это соответственно данные о погоде для конкретного города взятого с http://informer.gismeteo.ru/xml/27906_1.xml, и данные о котировка металлов за определенный период времени (взято, на сколько помню с Лондонской биржи драг. металлов). Но в данном случае нас не интересует смысловая нагрузка информации, которую несут эти файлы.
вложение XML файлы
Рис. 1 – Файл XML — данные о погоде
Рис. 2 – Файл XML — котировки металлов
И так, получим информацию, содержащуюся в файле (рис. 2). Это более сложный вариант, в нем Root-element содержит атрибуты, и Node-element содержит как атрибуты, так и значения, чего нельзя сказать о первом варианте.
Существуют тулики упрощающие задачу парсинга, например MSXML, но мы как люди упертые и любознательные сделаем все средствами стандартного набора LabVIEW (в данном случае Linux версии 8.6). Палитра достаточно скудная (рис. 3), но это нам не помешает.

Рис. 3 – Стандартная палитра LabVIEW 8.6 (Linux)
Первое, что нам необходимо сделать, это получить содержимое XML документа. Сделать это можно либо загрузив его из файла (рис. 4), либо передать как текстовую переменную – String (рис. 5).

Рис. 4 – Загрузка содержимого XML документа из файла

Рис. 5 – Получение содержимого XML документа из переменной String
И в первом и во втором варианте осуществляется парсинг документа встроенным «процессором» LabVIEW, т. е. его синтаксический анализ и представление его в виде модели DOM (Document Object Model — «объектная модель документа»). На первый взгляд непонятно парсинг, после парсинга, но так оно и есть. Встроенный «парсинг-процессор» позволяет нам опустить много рутинной работы и работать уже не с текстом, а именно с моделью документа, но от этого особо легче не становится. Встроенный «парсер» анализирует документ на ошибки и в случае их обнаружения сигнализирует о них.
Еще на рис. 4 производится отображение содержимого XML документа, так как желательно видеть, то с чем нам придется работать, хотя бы на этапе отладки.
Далее можно поступить следующим образом. Либо сразу получить содержимое документа минуя Root-element (рис. 6), как это реализовано в примере XMLParse_METALL.vi.

Рис. 6 – Получение элементов XML документа
Либо получить список Node-element верхнего уровня (Root-element) и начать разбор документа с него. Такой подход реализован в примере XMLParse_WEATHER.vi (рис. 7).

Рис. 7 – Получение списка Node-element в виде массива
Оба варианта правильные, так как Root-element может быть всего один, и в тоже время каждый имеет свои достоинства и недостатки. Например первый вариант позволяет сократить количество проверок, соответственно и программный код. Но в тоже время, если каким-то образом у нас будет загружен на тот документ для которого написана программа, а другой это обнаружиться позже и программе все равно придется анализировать все Node-element первого уровня, что увеличит время затраченное на обработку данных. На мой взгляд, второй вариант более правильный, но реализовано оба варианта для наглядности и понимания.
Следующий шаг, это получение атрибутов Root-element, представляющего из себя:
Для этого необходимо вернуть атрибуты «Attributes» Node-element (рис. 8) и разобрать их. Ранее уже говорилось, что в правильном документе XML может быть только один Root-element, но не смотря на это делаем проверку соответствия его имени «Node Name» требуемому «Metall» и только в случае их совпадения начинаем разборку. Это мое личное мнение, но так как это алгоритм, а одно из свойств — универсальность, я эту проверку не опускаю. К тому же это позволит исключить ряд ошибок.
Затем возвращаем список (массив) атрибут используя «Array Of Nodes» и приступаем к их анализу. Последовательно возвращаем имя «Node Name» и его значение «Node Value» и записываем в необходимую переменную либо не извлекаем вообще, если нас данное значение не интересует. В данном случае никаких преобразований формата мы не производим, но при необходимости можно преобразовать поля хранящие дату к требуемому виду.
Я намерено не описываю «куда» мы передаем те или иные значения параметров, так как это определяется условиями их дальнейшего использования. Мною в обоих примерах был создан кластер, который полностью повторяет структуру-дерево данных XML файла.
Рис. 8 – Получение атрибутов Root-element
вложение XMLParse_METALL_Attributes_Root.vi
На следующем шаге необходимо получить информацию находящуюся во всех элементах Node-element «Record», в нашем XML файле их 128, хотя это не имеет принципиального значения, так как мы не делаем привязок к количеству «Node» или «Attributes».
В первую очередь необходимо извлечь массив ссылок на эти самые «Node» (рис. 9) используя свойство «Child Nodes Array». После этого начинаем в цикле их обработку, для каждого извлекаем информацию «Node Name», «Attributes» и конечно «Child Nodes Array», так как каждый из них имеет вложенные «Node» со своими атрибутами и значениями.
Рис. 9 – Получение информации Node-Record
вложение XMLParse_METALL_Node_Record.vi
По аналогии с рис. 8 проверяем, что «Node» является «Record» и извлекаем значения атрибутов «Code» и «Date», только в данном случае мы делаем преобразование данных «Code» из текстового формата в числовой (U16) и передаем «куда нам необходимо».
После этого извлекаем информацию из «Node» второго уровня, которыми являются «Buy» и «Sell», с одним лишь различием, данные элементы не имеют атрибутов. Из них мы получаем значения «Node Value».
Таким образом, для получения данных из приведенного XML документа организовывается «как-бы» рекурсия (псевдо-рекурсия) с глубиной 3. Но так как рекурсия в неумелых руках подобна «ядерной бомбе», лично я рекомендую ее использовать в только в крайнем случае и полной неопределенности структуры XML документа, и то для небольшого круга задач, например анализа структуры.
Наряду с универсальностью XML имеется и такой недостаток, как избыточность, что видимо и влечет за собой и избыточность программного кода.
Чего бы хотелось.... это использовать функции, что значительно бы упростило чтение кода и его понимание. Но либо в связи с недостаточным знанием LabVIEW, либо в связи с отсутствием такой возможности, мне не удалось создать переменные описывающие «Child Node Array», «Array Of Nodes» и «Attributes», а соответственно передать информацию в функции SubVI.
Описанный подход к парсингу XML документов не является каноном, так как при необходимости можно получить информацию напрямую, используя например «Get Node Text Content VI». Так же не претендую на «но-хау», так как описанный подход используется в большинстве языков программирования.
вложения:
XMLParse_METALL.vi
metall_1.xml
XMLParse_WEATHER.vi
27906_1.xml







Комментарии
ifolder.ru/23324537
zalil.ru/30975381
depositfiles.com/files/582nfaske
равнозначные ссылки
RSS лента комментариев этой записи