Вернемся к задаче обмена данными об элементах справочника Сотрудники. Рассмотрим пример использования объекта ЗаписьXML (листинг 6.43).
Листинг 6.43. Пример записи XML-документа
&НаКлиенте
Процедура ЗаписьДанных(Команда)
СтрокаРазделителя = "*";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("c:\temp\document.xml");
// Записать директиву.
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Записать начало корневого элемента.
ЗаписьXML.ЗаписатьНачалоЭлемента("Корневой");
// Записать атрибут корневого элемента.
ЗаписьXML.ЗаписатьАтрибут("ИмяСправочника", "Сотрудники");
ЗаписьXML.ЗаписатьКомментарий("Выгрузка элементов справочника");
// Получить данные сотрудников в виде одной большой строки.
СтрокаСотрудников = ПолучитьСтрокиСотрудников(СтрокаРазделителя);
// Получить массив строк дла каждого сотрудника.
СтрокиСотрудников = СтрРазделить(СтрокаСотрудников, Символы.ПС);
Для ТекущаяСтрока = 0 По СтрокиСотрудников.Количество() - 1 Цикл
// Получить данные каждого сотрудника.
Данные = СтрРазделить(СтрокиСотрудников[ТекущаяСтрока], СтрокаРазделителя);
ЗаписьXML.ЗаписатьНачалоЭлемента("ЭлементСправочника");
ЗаписьXML.ЗаписатьНачалоЭлемента("Код");
ЗаписьXML.ЗаписатьТекст(Данные[0]);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование");
ЗаписьXML.ЗаписатьТекст(Данные[1]);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("ДатаРождения");
ЗаписьXML.ЗаписатьТекст(Данные[2]);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("КоличествоДетей");
ЗаписьXML.ЗаписатьТекст(Данные[3]);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
КонецПроцедуры
Здесь, так же как и при записи текстового файла, вызывается серверная функция ПолучитьСтрокиСотрудников(), в которой в цикле обхода выборки элементов справочника Сотрудники формируются строки с данными сотрудников и в виде одной большой строки возвращаются на клиент (см. листинг 6.30). Затем мы производим обратную операцию, получаем массив строк с данными для каждого сотрудника и разбираем строки с данными с помощью функции глобального контекста СтрРазделить(). Полученные элементы массива с данными каждого сотрудника мы записываем в виде элементов XML-файла.
В результате выполнения представленного кода будет получен следующий XML-документ (листинг 6.44).
Листинг 6.44. Полученный XML-документ
<?xml version="1.0" encoding="UTF-8"?>
<Корневой ИмяСправочника="Сотрудники">
<!--Выгрузка элементов справочника-->
<ЭлементСправочника>
<Код>000000001</Код>
<Наименование>Алексеев Сергей Иванович</Наименование>
<ДатаРождения>10.12.1980</ДатаРождения>
<КоличествоДетей>1</КоличествоДетей>
</ЭлементСправочника>
<ЭлементСправочника>
<Код>REST-0003</Код>
<Наименование>Артемов Игорь Владимирович</Наименование>
<ДатаРождения>17.05.2019</ДатаРождения>
<КоличествоДетей>2</КоличествоДетей>
</ЭлементСправочника>
<ЭлементСправочника>
<Код>000000002</Код>
<Наименование>Смирнова Светлана Ивановна</Наименование>
<ДатаРождения>22.02.1990</ДатаРождения>
<КоличествоДетей>0</КоличествоДетей>
</ЭлементСправочника>
</Корневой>
Сначала создается объект ЗаписьXML. Через созданный объект в модели последовательного доступа будет производиться запись данных в XML-документ. С помощью метода ОткрытьФайл() указывается имя файла, куда будет производиться запись данных. Метод ЗаписатьОбъявлениеXML() определяет директиву, что создаваемый документ будет являться XML-документом (директива размещается в первой строке созданного документа).
Для записи элемента XML-документа используются методы ЗаписатьНачалоЭлемента(), ЗаписатьАтрибут(), ЗаписатьТекст(), ЗаписатьКонецЭлемента(), которые производят запись соответствующего узла элемента XML в файл. При этом важно соблюдать порядок (иерархию) вызова этих методов.
В заключение методом Закрыть() объекта ЗаписьXML завершается запись, и файл с данными закрывается.
Напомним, что элемент можно представить в виде следующих узлов (листинг 6.45).
Листинг 6.45. Узлы элемента XML
<ИМЯ АТРИБУТ=Значение>
Содержимое (Текст или описание другого элемента)
</ИМЯ>
Для записи вышеприведенного элемента можно использовать следующую последовательность методов (листинг 6.46).
Листинг 6.46. Пример записи элемента XML
ЗаписьXML.ЗаписатьНачалоЭлемента("ИМЯ");
ЗаписьXML.ЗаписатьАтрибут("АТРИБУТ", "Значение");
ЗаписьXML.ЗаписатьТекст("Содержимое (Текст или описание другого элемента)");
ЗаписьXML.ЗаписатьКонецЭлемента();
Следует обратить внимание на тот факт, что если при определении начала элемента в соответствующем методе указывается его имя, то при закрытии имя не указывается. Закрывается элемент, открытый последним. В связи с этим следует внимательно относиться к последовательности исполняемых методов, чтобы не запутаться в иерархии (в ряде случаев для упрощения алгоритмов создания документов сложной структуры могут использоваться рекурсивные вызовы процедур, ответственных за создание элементов).
Последовательность методов объекта ЗаписьXML, вызываемых при создании элементов, можно проиллюстрировать следующей схемой (рис. 6.6).
Рис. 6.6. Последовательность использования методов при записи XML-документа
Правильный XML-документ содержит единственный корневой элемент, запись всего документа начинается с записи этого элемента.
Запись любого элемента XML начинается с записи открывающего тега (начала элемента, выполняемого с помощью метода ЗаписатьНачалоЭлемента()). Только в контексте начала элемента можно записывать атрибуты XML-документа (используется метод ЗаписатьАтрибут(), вызываемый последовательно для каждого атрибута). Записать атрибут после записи текста или конца элемента нельзя.
После записи начала элемента и всех его атрибутов можно провести запись текста (это означает, что у формируемого элемента XML нет вложенных элементов) или рекурсивно перейти к записи другого вложенного элемента.
После того как либо текст, либо другой вложенный элемент (элементы) закрыт, производится запись конца элемента (метод ЗаписатьКонецЭлемента()).