Разбор и анализ xml-файла в TestComplete

№2-1,

технические науки

В данной статье мы рассмотрим принцип работы XML в TestComplete. Как я уже писал в своем блоге, технология XML стала популярной за счет своей универсальности и используется во многих областях применения информационных технологий. Одной из таких областей является банковская сфера. В частности, передача данных в XML-формате. Для проверки правильности таких файлов необходим разбор их структуры и сравнение с эталонным значением.

Похожие материалы

В данной статье мы рассмотрим принцип работы 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>
состоит из трех узлов:

  1. Элемент item, который содержит в себе:
    1. Параметр volume;
    2. Текст;

Каждый из узлов имеет свой тип, который можно узнать используя свойство nodeType. Полезными для нас являются следующие значения:

  1. Элемент;
  2. Параметр;
  3. Текст;

Исходя из вышеизложенного перебор списка покупок необходимо переписать следующим способом:

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');