Расширяемый язык разметки
XML (eXtensible Markup Language)
представляет собой современное средство для хранения и конвертирования
данных. В документе XML данные образуют древовидную структуру, что для
большинства пользователей является наиболее понятным способом
организации данных. Для начала приведем краткое описание самых простых
правил языка XML.
Весь текст xml-документа можно грубо разделить на две категории - символьные данные и тэги.
Тэг
представляет собой команду, которая начинается с символа "<" и
заканчивается символом ">". В отличие от фиксированного набора тэгов
языка HTML имена и структуру тэгов XML разработчик xml-документа задает
сам.
Символьные данные - это те структурированные данные, которые хранятся в документе.
Xml-документ начинается со строки, самый простой вариант, которой имеет следующий вид:
Эта строка называется
определением xml.За ним следуют элементы,
которые представляют собой узлы древовидной структуры xml-документа. В
силу древовидности структуры xml-документ должен иметь единственный
корневой элемент, являющийся контейнером для всех остальных. Любой
элемент состоит из открывающего и закрывающего тэгов, например,
<book>...</book>.
Имя элемента называют его общим идентификатором или типом. Текст между
открывающим и закрывающим тэгами называется содержимым элемента.
Например, в следующем фрагменте:
<book> О.В.Бартеньев. 1С:Предприятие. Опыты программирования.</book>
book- это тип элемента, а строка "О.В.Бартеньев. 1С:Предприятие.
Опыты программирования." - его содержимое. Элемент, лишенный
содержимого, называется пустым элементом. Открывающий и закрывающий тэги
пустого элемента можно объединить в один тэг, поместив в его конец
косую черту
<EmptyElement/>. В принципе, допускается запись пустого элемента с помощью открывающего и закрывающего тэгов без содержимого (
<EmptyElement></EmptyElement>).
Фактически оба способа имеют свое применение, поскольку могут быть
элементы, которые случайно оказываются пустыми с точки зрения хранения
пустого содержимого, а могут существовать элементы, которые не имеют
содержимого по определению.
У элементов могут быть атрибуты.
Атрибут - это пара имя-значение,
расположенная в открывающем тэге элемента. Значения атрибутов должны
быть заключены в одинарные или двойные кавычки. Фактически в виде
атрибутов часто хранятся значения некоторых свойств. Например,
предыдущий пример с элементом, хранящим информацию о книге, можно
переформулировать так:
<book author=" О.В.Бартеньев">1С:Предприятие. Опыты программирования.</book>
Для работы с документами xml требуется наличие так называемого
парсера
- специальной программы-анализатора, которая отслеживает выполнение
синтаксических правил языка. Браузер MS Internet Explorer имеет
встроенный парсер языка XML. Для работы с xml-документами в среде
1С:Предприятие используется внешняя компонента
v7plus.dll. Таким образом, первый шаг при работе с xml-документами в системе
1С:Предприятие
состоит в том, что требуется загрузить эту внешнюю компоненту.
Следующий фрагмент кода позволяет осуществить эту загрузку внешней
компоненты, если она находится в каталоге информационной базы для
конфигурации
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"v7plus.dll") <> 1 Тогда
Предупреждение("Компонента v7plus.dll не найдена!");
Возврат; //прервать выполнение процедуры
КонецЕсли;
Далее можно заняться собственно работой с xml-документом. Создадим объект, который представляет собой анализатор xml-документа.
Анализатор = СоздатьОбъект("AddIn.XMLParser");
Разберем процесс работы по созданию нового xml-документа. С помощью объекта-анализатора создадим пустой xml-документ.
xml=Анализатор.СоздатьДокумент();
Далее создаются все элементы документа с помощью функции
СоздатьПодчиненныйЭлемент(ИмяПодчиненногоЭлемента),
примененной к объекту родительского элемента для вновь создаваемого. В
результате работы будет возвращена ссылка на созданный элемент данных.
Например, создаем корневой элемент и подчиненный к нему.
Корень=xml.СоздатьПодчиненныйЭлемент("КорневойЭлемент");
Подчинен=Корень.СоздатьПодчиненныйЭлемент("ПодчиненныйЭлемент");
В результате в xml-документ будут построены два элемента
КорневойЭлемент и
ПодчиненныйЭлемент, причем второй будет подчинен первому.
Если элемент имеет атрибут, то его значение можно установить с помощью процедуры
УстановитьАтрибут(НазваниеАтрибута, ЗначениеАтрибута).
Эту процедуру нужно вызвать для объекта, хранящего ссылку на конкретный
элемент xml-документа, указав в качестве первого параметра символьную
строку с названием атрибута и в качестве второго параметра - его
значение. Например, установим подчиненному элементу атрибут
имя со значением
Подчиненный.
Подчинен.УстановитьАтрибут("имя","Подчиненный");
Установить содержимое элемента можно напрямую с помощью атрибута
Значение объекта, соответствующего этому элементу.
Подчинен.Значение="Это текст внутри подчиненного элемента";
В результате будет создан xml-документ такого вида:
<КорневойЭлемент>
<ПодчиненныйЭлемент имя="Подчиненный">
Это текст внутри подчиненного элемента
</ПодчиненныйЭлемент>
</КорневойЭлемент>
Как и при работе с любыми другими форматами данных, сделанные изменения
требуется зафиксировать, т.е. записать в файл. Это делает процедура
Записать(ПутьКФайлу), которая вызывается для объекта
Анализатор, отвечающего за весь документ.
Теперь посмотрим, как производить чтение данных из xml-файла. Загрузка
внешней компоненты и создание объекта-парсера, естественно, обязательно
провести и здесь. Далее также создается ссылка на xml-документ с помощью
функции
СоздатьДокумент. Далее следует связать его с конкретным файлом с помощью метода
Загрузить(ИмяФайла). Доступ к отдельным узлам xml-документа осуществляется с помощью функции
ВыбратьУзел(НазваниеУзла). Функция вернет ссылку на требуемый узел xml-документа, если он один. Например,
ФайлДанных=Анализатор.СоздатьДокумент();
ФайлДанных.Загрузить(Файл);
Корень=ФайлДанных.ВыбратьУзел("КорневойУзел");
Эта же функция применяется и к любому другому элементу xml-документа для
получения доступа к его подчиненным элементам. Если подчиненных
элементов несколько, узнать их количество можно с помощью функции
КоличествоПодчиненных(), примененной к объекту родительского элемента. Далее каждый из подчиненных элементов можно получить с помощью функции
ПолучитьПодчиненныйПоНомеру(НомерЭлемента). Для каждого элемента можно получить его атрибуты с помощью функции
ПолучитьАтрибут(НазваниеАтрибута), а также содержимое элемента с помощью атрибута
Значение объекта, содержащего ссылку на элемент.