Запись XML

Запись простого XML-документа

Для записи XML-документа предназначен тип ЗаписьXml. В общем случае записывать XML-документ можно в экземпляр, производный от экземпляра типа ПотокЗаписи. Мы будем рассматривать запись документа в файл.

Самый простой случай XML-документа — это объявление документа и корневой тег. В нашем случае это тег <note>. Объявление документа — это обязательный элемент любого XML-документа. Поэтому использование пары методов ЗаписатьНачалоДокумента()/ЗаписатьКонецДокумента() является обязательным для записи любого XML-документа. Таким же обязательным элементом любого XML-документа является корневой тег.

При работе с XML-документом важно запомнить еще один момент: программист записывает не только открывающий тег, но и закрывающий! В противном случае структура XML-документа будет нарушена. Именно поэтому многие методы работы с XML используются парами. Например, для записи какого-либо элемента используется два метода:
  • ЗаписатьНачалоЭлемента() — для того чтобы записать открывающий тег: <note>.
  • ЗаписатьКонецЭлемента() — для того чтобы записать закрывающий тег: </note>.

Запись XML. Шаг 1

метод Скрипт()
    пер Файл = новый Файл("c:\\temp\\note.xml")
    пер Запись = новый ЗаписьXml(Файл.ОткрытьПотокЗаписи())
    Запись.ЗаписатьНачалоДокумента()
    Запись.ЗаписатьНачалоЭлемента("note")
    Запись.ЗаписатьКонецЭлемента()
    Запись.ЗаписатьКонецДокумента()
;

Запись элементов XML-документа

После того как мы сформировали простой XML-документ, наполним этот документ оставшимся содержимым. Так как XML-документ имеет иерархическую структуру, где иерархию образуют вложенные теги, записывать теги следует с учетом их вложенности. Для этого необходимо начинать подчиненный элемент после указания начала родительского элемента, но до окончания родительского элемента.

Каждый тег записывается своей парой методов ЗаписатьНачалоЭлемента()/ЗаписатьКонецЭлемента(). В результате работы нашего примера получится документ, очень похожий на оригинальный, только в нем отсутствуют значения элементов:

<?xml version='1.0' encoding='UTF-8'?>
<note>
  <to/>
  <from/>
  <heading/>
  <body/>
</note>

В исходном тексте, который формирует новый XML-документ, отступ элементов <to>, <from>, <heading> и <body> сделан исключительно из соображений более удобного восприятия примера. В реальных программах так делать не обязательно.

Запись XML. Шаг 2

метод Скрипт()
    пер ВременныйКаталог = СредаИсполнения.ПолучитьПеременную("temp")
    пер Файл = новый Файл(ВременныйКаталог + "\\note.xml")
    пер Запись = новый ЗаписьXml(Файл.ОткрытьПотокЗаписи())
    Запись.ЗаписатьНачалоДокумента()
    Запись.ЗаписатьНачалоЭлемента("note")
        Запись.ЗаписатьНачалоЭлемента("to")
        Запись.ЗаписатьКонецЭлемента()
        Запись.ЗаписатьНачалоЭлемента("from")
        Запись.ЗаписатьКонецЭлемента()
        Запись.ЗаписатьНачалоЭлемента("heading")
        Запись.ЗаписатьКонецЭлемента()
        Запись.ЗаписатьНачалоЭлемента("body")
        Запись.ЗаписатьКонецЭлемента()
    Запись.ЗаписатьКонецЭлемента()
    Запись.ЗаписатьКонецДокумента() 
;

Запись содержимого элементов XML-документа

Для записи текста, который будет расположен «внутри» тегов XML-документа, предназначен метод ЗаписатьТекст(Текст: Строка). Параметр этого метода будет записан в качестве содержимого того элемента, который в данный момент является открытым. Теперь наш документ стал полностью соответствовать примеру:

<?xml version='1.0' encoding='UTF-8'?><note>
  <to>Иван</to>
  <from>Петр</from>
  <heading>Напоминание</heading>
  <body>Не забудь о встрече в эти выходные</body>
</note>

Запись XML. Шаг 3

метод Скрипт()
    пер ВременныйКаталог = СредаИсполнения.ПолучитьПеременную("temp")
    пер Файл = новый Файл(ВременныйКаталог + "\\note.xml")
    пер Запись = новый ЗаписьXml(Файл.ОткрытьПотокЗаписи())
    Запись.ЗаписатьНачалоДокумента()
    Запись.ЗаписатьНачалоЭлемента("note")
        Запись.ЗаписатьНачалоЭлемента("to")
            Запись.ЗаписатьТекст("Иван")
        Запись.ЗаписатьКонецЭлемента()
        Запись.ЗаписатьНачалоЭлемента("from")
            Запись.ЗаписатьТекст("Петр")
        Запись.ЗаписатьКонецЭлемента()
        Запись.ЗаписатьНачалоЭлемента("heading")
            Запись.ЗаписатьТекст("Напоминание")
        Запись.ЗаписатьКонецЭлемента()
        Запись.ЗаписатьНачалоЭлемента("body")
            Запись.ЗаписатьТекст("Не забудь о встрече в эти выходные")
        Запись.ЗаписатьКонецЭлемента()
    Запись.ЗаписатьКонецЭлемента()
    Запись.ЗаписатьКонецДокумента() 
;

Запись атрибутов элемента XML

Последним действием, которое мы рассмотрим в части записи XML-документа, будет запись атрибута XML-элемента. Допустим, мы хотим добавить к отправителю и получателю нашей заметки псевдонимы отправителя и получателя. Для этого будем использовать атрибут @nickname.

Для записи атрибута используется метод ЗаписатьАтрибут(). Записывать атрибут необходимо сразу после метода ЗаписатьНачалоЭлемента(). В метод передаются сразу оба значения: имя атрибута и его (атрибута) значение. В результате наш XML-документ будет выглядеть следующим образом:

<?xml version='1.0' encoding='UTF-8'?>
<note>
  <to nickname="developer">Иван</to>
  <from nickname="boss">Петр</from>
  <heading>Напоминание</heading>
  <body>Не забудь о встрече в эти выходные</body>
</note>

Если требуется указать несколько атрибутов для одного элемента — следует использовать метод ЗаписатьАтрибут() столько раз, сколько атрибутов требуется указать.

Запись XML. Шаг 4

метод Скрипт()
    пер ВременныйКаталог = СредаИсполнения.ПолучитьПеременную("temp")
    пер Файл = новый Файл(ВременныйКаталог + "\\note.xml")
    пер Запись = новый ЗаписьXml(Файл.ОткрытьПотокЗаписи())
    Запись.ЗаписатьНачалоДокумента()
    Запись.ЗаписатьНачалоЭлемента("note")
        Запись.ЗаписатьНачалоЭлемента("to")
            Запись.ЗаписатьАтрибут("nickname", "developer")
            Запись.ЗаписатьТекст("Иван")
        Запись.ЗаписатьКонецЭлемента()
        Запись.ЗаписатьНачалоЭлемента("from")
            Запись.ЗаписатьАтрибут("nickname", "boss")
            Запись.ЗаписатьТекст("Петр")
        Запись.ЗаписатьКонецЭлемента()
        Запись.ЗаписатьНачалоЭлемента("heading")
            Запись.ЗаписатьТекст("Напоминание")
        Запись.ЗаписатьКонецЭлемента()
        Запись.ЗаписатьНачалоЭлемента("body")
            Запись.ЗаписатьТекст("Не забудь о встрече в эти выходные")
        Запись.ЗаписатьКонецЭлемента()
    Запись.ЗаписатьКонецЭлемента()
    Запись.ЗаписатьКонецДокумента() 
;

Запись содержимого элементов и значения атрибутов XML-документа в различных типах

Записывать содержимое элементов в XML-документ можно также в различных типах. Для того чтобы тип данных был записан в соответствии со стандартом XML, предназначены следующие методы:

ЗаписатьБайты(Значение: Байты)
Записывает текст элемента как Байты в шестнадцатеричной кодировке
ЗаписатьБайтыBase64(Значение: Байты)
Записывает текст элемента как Байты в кодировке Base64
ЗаписатьБулево(Значение: Булево)
Записывает текст элемента как Булево
ЗаписатьВремя(Значение: Время)
Записывает текст элемента как Время
ЗаписатьДату(Значение: Дата)
Записывает текст элемента как тип Дата
ЗаписатьДатаВремя(Значение: ДатаВремя)
Записывает текст элемента как ДатаВремя
ЗаписатьДлительность(Значение: Длительность)
Записывает текст элемента как Длительность
ЗаписатьМомент(Значение: Момент, ЧасовойПояс: ЧасовойПояс? = Неопределено)
Записывает текст элемента как Момент в указанном часовом поясе. Если параметр ЧасовойПояс не указан, Момент записывается в часовом поясе UTC
ЗаписатьУуид(Значение: Ууид)
Записывает текст элемента как Ууид
ЗаписатьЧисло(Значение: Число)
Записывает текст элемента как Число: приводит к десятичной записи, обрезает лишние нули. Если число было целым, в конце ставится .0
Примечание: Перед вызовом данных методов должен быть вызван метод ЗаписьXML.ЗаписатьНачалоЭлемента()
Также существует ряд подобных методов для записи атрибутов элементов XML-документа в соответствующих типах. С помощью данных методов можно записать атрибуты в следующих типах:
  • Ууид / Число / Булево
  • Байты / БайтыBase64
  • Время / ДатаВремя / Дата / Длительность / Момент

Данные методы начинаются с префикса ЗаписатьАтрибут. Например, для того чтобы записать атрибут элемента как Число, следует использовать метод:

ЗаписатьАтрибутЧисло(Имя: Строка, 
                     Значение: Число, 
                     ПространствоИмен: Строка? = Неопределено): ЗаписьXml