В данной статье мы рассмотрим принцип работы XML в TestComplete. Как я уже писал в своем блоге, технология XML стала популярной за счет своей универсальности и используется во многих областях применения информационных технологий. Одной из таких областей является банковская сфера. В частности, передача данных в XML-формате. Для проверки правильности таких файлов необходим разбор их структуры и сравнение с эталонным значением. Для разбора будем использовать MS XML. Подробнее можно узнать на сайте Microsoft.
Для начала разбора XML файла необходимо загрузить его структуру в переменную:
var Obj: OleVariant;Obj := Sys.OleObject('Msxml2.DOMDocument');Obj.async := false;Obj.load('C:/filename.xml');
Далее можем проводить разбор структуры файла.
Допустим мы имеем следующий XML-файл, который содержит в себе список продуктов для покупки:
- Молоко
- Хлеб
- Мясо
- Рис
- Греча
- Яблоки
Получаем корневой элемент list:
list := Obj.documentElement;Перебираем все элементы списка, используя метод childNodes, который содержит в себе все дочерние узлы данного узла (в нашем случае это корневой узел):
for i := 0 to list.childNodes.length - 1 donode := list.childNodes.item(i);
Для того, чтобы получить наименование элемента списка нужно получить значение узла. Для этого используем метод firstChild. C помощью его получаем текстовый узел. И далее воспользуемся свойством nodeValue, чтобы получить содержимое текстового узла:
name := node.firstChild.nodeValue;Это немного сложно для понимания. Необходимо запомнить, что каждый участок XML-файла является отдельным узлом, т.е.
состоит из трех узлов:
- Элемент item, который содержит в себе:
- Параметр volume;
- Текст;
Каждый из узлов имеет свой тип, который можно узнать используя свойство nodeType. Полезными для нас являются следующие значения:
- Элемент;
- Параметр;
- Текст.
Исходя из вышеизложенного перебор списка покупок необходимо переписать следующим способом:
for i := 0 to list.childNodes.length - 1 doif list.childNodes.item(i).nodeType = 1 thennode := list.childNodes.item(i);
Таким образом мы сможем избежать ошибок связанных с обработкой лишних узлов, которыми являются пробелы между элементами списка.
Существует другой способ перебора всех элементов узла с одинаковым именем. Он основан на использовании метода getElementsByTagName:
nodes := list.getElementsByTagName('item');for i := 0 to nodes.length - 1 donode := nodes.item(i);
В завершении статьи рассмотрим методы работы с параметрами элементов.
Для получения значения параметра узла можно воспользоваться методом getAttribute:
number := node.getAttribute('number');В случае, если данного параметра может и не быть, то сначала необходимо проверить его существование:
if node.getAttributeNode('number') nil thennumber := node.getAttribute('number');