В данной статье мы рассмотрим принцип работы 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-файл, который содержит в себе список продуктов для покупки:
<?xml version="1.0" encoding="utf-8"?>
<list>
<item number="1" volume="0.5">Молоко</item>
<item number="1">Хлеб</item>
<item volume="1" type="Говядина">Мясо</item>
<item volume="1">Рис</item>
<item volume="1">Греча</item>
<item volume="1">Яблоки</item>
</list>
Получаем корневой элемент list:
list := Obj.documentElement;
Перебираем все элементы списка, используя метод childNodes, который содержит в себе все дочерние узлы данного узла (в нашем случае это корневой узел):
for i := 0 to list.childNodes.length - 1 do
node := list.childNodes.item(i);
Для того, чтобы получить наименование элемента списка нужно получить значение узла. Для этого используем метод firstChild. C помощью его получаем текстовый узел. И далее воспользуемся свойством nodeValue, чтобы получить содержимое текстового узла:
name := node.firstChild.nodeValue;
Это немного сложно для понимания. Необходимо запомнить, что каждый участок XML-файла является отдельным узлом, т.е. <item volume="1">Греча</item>
состоит из трех узлов:
- Элемент item, который содержит в себе:
- Параметр volume;
- Текст;
Каждый из узлов имеет свой тип, который можно узнать используя свойство nodeType. Полезными для нас являются следующие значения:
- Элемент;
- Параметр;
- Текст.
Исходя из вышеизложенного перебор списка покупок необходимо переписать следующим способом:
for i := 0 to list.childNodes.length - 1 do
if list.childNodes.item(i).nodeType = 1 then
node := list.childNodes.item(i);
Таким образом мы сможем избежать ошибок связанных с обработкой лишних узлов, которыми являются пробелы между элементами списка.
Существует другой способ перебора всех элементов узла с одинаковым именем. Он основан на использовании метода getElementsByTagName:
nodes := list.getElementsByTagName('item');
for i := 0 to nodes.length - 1 do
node := nodes.item(i);
В завершении статьи рассмотрим методы работы с параметрами элементов.
Для получения значения параметра узла можно воспользоваться методом getAttribute:
number := node.getAttribute('number');
В случае, если данного параметра может и не быть, то сначала необходимо проверить его существование:
if node.getAttributeNode('number') <> nil then
number := node.getAttribute('number');