В данной статье мы рассмотрим каким образом можно встроенными средствами МS XML в TestComplete создать XML-файл. Зачем это нужно? Например, некоторая программа умеет загружать список продуктов в XML формате. Необходимо проверить правильность загрузки данного списка в этой программе. Допустим список у нас хранится в ODT. Как это сделать я уже писал в своей статье Основы работы с ODT в TestComplete, поэтому я не буду на этом останавливаться.
Структура класса Item в ODT:
- Name (Название продукта);
- Number (Количество);
- Volume (Объем);
- Type (Тип).
Элемент типа Array со значениями в ODT:
- item0: Name: Молоко; Number: 1; Volume: 0.5;
- item1: Name: Хлеб; Number: 1;
- item2: Name: Мясо; Volume: 1; Type: Говядина;
- item3: Name: Рис; Volume: 1;
- item4: Name: Греча; Volume: 1;
- item5: Name: Яблоки; Volume: 1.
Для создания XML-файла необходимо прописать следующие строки:
Obj := Sys.OleObject('Msxml2.DOMDocument'); // Инициализируем DOM-объект
Obj.async := false; // Отключаем асинхронный режим
Obj.Save('D:/filename.xml'); // Сохраняем файл
Мы научились создавать XML-файл. Это просто. Теперь добавим в него наши данные.
Для начала нужно добавить инструкции XML, которая содержит информацию о версии XML и кодировке данного XML-файла:
Instruction := Obj.CreateProcessingInstruction('xml', 'version="1.0" encoding="utf-8"');
Obj.AppendChild(Instruction);
Метод AppendChild предназначен для добавления узла. В дальнейшем мы будем активно использовать данный метод.
Теперь добавим корневой элемент list, для этого воспользуемся методом CreateElement, который создает элемент.
List := Оbj.CreateElement('list');
Obj.AppendChild(List);
Следующим шагом добавим список продуктов из ODT:
for i := 0 to Self.Count - 1 do begin
Node := Оbj.CreateElement(Self.Items(i).Value.Name);
List.AppendChild(Node);
end;
А также добавим параметры для каждого элемента списка, для этого будем использовать метод SetAttribute:
if Length(Self.Items(i).Value.Number) > 0 then
Node.SetAttribute(Self.Items(i).Value.Number);
if Length(Self.Items(i).Value.Volume) > 0 then
Node.SetAttribute(Self.Items(i).Value.Volume);
if Length(Self.Items(i).Value.Type) > 0 then
Node.SetAttribute(Self.Items(i).Value.Type);
В завершении объединим все куски кода:
Obj := Sys.OleObject('Msxml2.DOMDocument');
Obj.async := false;
Instruction := Obj.CreateProcessingInstruction('xml', 'version="1.0" encoding="utf-8"');
Obj.AppendChild(Instruction);
List := Оbj.CreateElement('list');
Obj.AppendChild(List);
for i := 0 to Self.Count - 1 do begin
Node := Оbj.CreateElement(Self.Items(i).Value.Name);
if Length(Self.Items(i).Value.Number) > 0 then
Node.SetAttribute(Self.Items(i).Value.Number);
if Length(Self.Items(i).Value.Volume) > 0 then
Node.SetAttribute(Self.Items(i).Value.Volume);
if Length(Self.Items(i).Value.Type) > 0 then
Node.SetAttribute(Self.Items(i).Value.Type);
List.AppendChild(Node);
end;
Obj.Save('D:/filename.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>