На примере, обьяснен общий принцип работы с XML в TestComplete (DelphiScript).
Для понимания XML советую предварительно просмотреть:
ru.wikipedia.org/wiki/XML - короткая и понятная статья по XML
www.w3schools.com/xml/ - руководство по XML
К примеру есть XML файл (сохранен по адресу ‘C:\Test.xml’):
Из него необходимо получить значение атрибутов Login, Password, Role.
Для этого необходимо выгрузить XML-файл в объект, понятный для среды разработки, который можно обрабатывать в скрипте.
TestComplete позволяет работать с любыми XML, используя DOM XML (msdn.microsoft.com/ru-ru/library/2bcctyt8.aspx - XML документы и данные).
Пример: Функция загружает указанный XML файл, если структура XML нарушена - выдает сообщение об ошибке XML-парсера, в результате работы функция возвращает объект.
function InitializeXML(APath: WideString): OleVariant;
var File: OleVariant;
Doc: OleVariant;
s: OleVariant;
begin
File := APath;
Doc := Sys.OleObject('Msxml2.DOMDocument.6.0');
Doc.async := false;
Doc.load(File);
if Doc.parseError.errorCode <> 0 then
begin
s := 'Reason:' + #9 + Doc.parseError.reason + #13#10 +
'Line:' + #9 + VarToStr(Doc.parseError.line) + #13#10 +
'Pos:' + #9 + VarToStr(Doc.parseError.linePos) + #13#10 +
'Source:' + #9 + Doc.parseError.srcText;
Log.Error('Cannot parse the document.', s);
Exit;
end;
Result := Doc;
end;
Для получения данных из XML используем средства DOM XML и XPath.
Для этого необходимо у объекта XML-документа (либо объекта XML-ноды), вызвать функцию selectNodes(), и передать в функцию XPath-запрос.
Пример:
XMLDoc.selectNodes('//User')
Функция selectNodes - возвращает коллекцию объектов, т.е. если даже результат запроса всего одна запись, возвращается коллекция с одним объектом. НЕЛЬЗЯ прямо обращаться к нодам атрибутам, полученным из selectNodes. т.е. выражение XMLDoc.selectNodes('//User').getAttribute('Login') - ошибочно. Правильно будет XMLDoc.selectNodes('//User').item(0).getAttribute('Login');
Чтобы узнать количество элементов (item) коллекции необходимо вызвать свойство length.
Пример: XMLDoc.selectNodes('//User').length - возвращает количество нод User в XML документе.
Для обработки всех элементов коллекции, необходимо пробежаться по каждому из них обращаясь по индексу элемента, причем обработку необходимо проводить в соответствии с возвращаемым типом данных (ноды, атрибуты, текст)
Пример: Получение данных
procedure TestDOMXML();
var XMLDoc: OleVariant;
i: Integer;
User: WideString;
Password: WideString;
Role: WideString;
begin
XMLDoc := InitializeXML('C:\Test.xml');
for i:=0 to XMLDoc.selectNodes('//User').length-1 do
begin
User:= XMLDoc.selectNodes('//User/@Login').item(i).text;
Password:= XMLDoc.selectNodes('//User/@Password').item(i).text;
Role:= XMLDoc.selectNodes('//User/@Role').item(i).text;
Log.Message('User: ' + User + ' Password: ' + Password + ' Role: ' + Role);
end;
end;
возможен другой вариант цикла обработки
for i:=0 to XMLDoc.selectNodes('//User').length-1 do
begin
User:= XMLDoc.selectNodes('//User').item(i).getAttribute('Login').text;
Password:= XMLDoc.selectNodes('//User').item(i).getAttribute('Login').text;
Role:= XMLDoc.selectNodes('//User').item(i).getAttribute('Login').text;
Log.Message('User: ' + User + ' Password: ' + Password + ' Role: ' + Role);
end;
XPath - выражение //User/@Login - выбирает из XML все ноды User, у каждой из них выбирает указанный атрибут (Login, Password, Role). Если запрошенного атрибута нет, то возвращается Null (или если привести к строке '0')
Если есть задача получить ноды, или получить значение атрибута ноды определенного типа, условия фильтрации удобно вмещать в выражение XPath:
Пример: Получить логины пользователей, которые являются администраторами:
//User[@Role='Administrator']/@Login
такое выражение вернет коллекцию логинов пользователей, которые являются администраторами.