Глобальный объект "
XMLParser"
компоненты V7plus предназначен для расширения функциональности системы «1С:Предприятие 7.7» в части работы с XML-файлами. Данный интерфейс опосредует связь между системой «1С:Предприятие» и базовым анализатором Microsoft XML Parser, входящим в состав ОС Windows.
Чтобы начать работать с интерфейсом, необходимо загрузить компоненту V77plus:
// Выполняем инициализацию компоненты V77plus, // учитываем то, что её местонахождение нам заранее неизвестно Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "ExtForms\" + "v7plus.dll") <> 1 Тогда Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "v7plus.dll") <> 1 Тогда Предупреждение("Компонента v7plus.dll не найдена!"); Возврат; КонецЕсли; КонецЕсли; КонецЕсли;
Далее можно заняться собственно работой с XML-документом. Для этого следует создать объект, который представляет собой анализатор XML-документа:
Анализатор = СоздатьОбъект("AddIn.XMLParser");
Объектная модель анализатора
В состав объектной модели анализатора входят объекты следующих типов:
- Анализатор — базовый объект, позволяющий создавать новые объекты типа
"
ПоследовательноЗаписываемыйДокумент"
,"
ПоследовательноСчитываемыйДокумент"
,"
Документ"
,"
КоллекцияСхем"
; - КоллекцияСхем — специальное средство, позволяющее при загрузке документа применить набор схем (пространств имён), или подменить определённый в документе набор;
- ВыборкаУзлов — коллекция элементов и атрибутов, отобранных по совокупности признаков, заданных при создании.
Режим последовательной обработки файла реализуется с помощью объектов ПоследовательноСчитываемыйДокумент или ПоследовательноЗаписываемыйДокумент, в зависимости от того, что происходит — чтение или запись файла.
В режиме же, использующем DOM, анализатор предоставляет доступ к таким объектам, как:
- Документ — объект, представляющий документ — корневой узел DOM;
- Элемент — объект, представляющий элементы разметки документа;
- Атрибут — объект, представляющий атрибуты элементов разметки документа.
Эти три объекты являются разновидностями абстрактного объекта типа "
Узел"
, а потому имеют целый набор одинаковых атрибутов и методов, свойственных для любых узлов DOM.
Все входящие в данную модель объекты (кроме объекта Анализатор) расширяют или переопределяют состав свойств и методов объектов, входящих в состав DOM модели, реализованной в анализаторе XML-документов от фирмы Microsoft.
Атрибуты объекта "
Анализатор"
Узнать версию интерфейса XMLParser компоненты V7plus позволяет атрибут ВерсияАнализатора
(англоязычный синоним — ParserVersion
) объекта "
Анализатор"
. Возвращаемым значением атрибута является строковое значение.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); Сообщить("Версия интерфейса XMLParser - " + Анализатор.ВерсияАнализатора);
Примечание: В компоненте V7plus версии 7.70.0.11 реализован интерфейс XMLParser версии 2.0.
Узнать версию установленного в системе анализатора Microsoft XML Parser позволяет атрибут ВерсияБазовогоАнализатора
(англоязычный синоним — BaseParserVersion
) объекта "
Анализатор"
. Возвращаемым значением атрибута является строковое значение.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); Сообщить("Версия установленного Microsoftв XML Parser - " + Анализатор.ВерсияБазовогоАнализатора);
Методы объекта "
Анализатор"
Создать объект "
Документ"
, представляющий корневой узел DOM, позволяет метод СоздатьДокумент()
(англоязычный синоним — CreateDocument()
). Возвращаемым значением метода является ссылка на объект. Параметры у метода отсутствуют.
Пример использования метода при обработке имеющегося XML-файла:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); // Создаём объект "Документ" XMLДокумент = Анализатор.СоздатьДокумент(); // Связываем созданный объект с конкретным XML-файлом XMLДокумент.Загрузить(КаталогПрограммы() + "plan.xml"); // Начинаем обработку файла . . .
Пример использования метода при создании нового XML-файла:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); // Создаём корневой узел DOM XMLДокумент = Анализатор.СоздатьДокумент(); // Создаем новый узел для документа ЭлСписок = XMLДокумент.СоздатьУзел(1, "Список"); // Добавляем созданный узел в документ XMLДокумент.ДобавитьПодчиненный(ЭлСписок); . . .
Создать объект "
КоллекцияСхем"
, дающий возможность при загрузке документа использовать набор схем (пространств имён), позволяет метод СоздатьКоллециюСхем()
(англоязычный синоним — CreateSchemasCollection()
). Возвращаемым значением метода является ссылка на объект. Параметры у метода отсутствуют.
Пример использования метода:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); . . . // Создаём коллекцию схем КоллекцияСхемДляПроверки = Анализатор.СоздатьКоллециюСхем(); . . .
Создать специальный объект, дающий возможность обрабатывать входящий XML-документ, не прибегая к построению DOM, позволяет метод СоздатьПоследовательноСчитываемыйДокумент()
. Параметры у метода отсутствуют. Возвращаемым значением метода является ссылка на OLE-объект, представляющий собой узел документа.
Для дальнейшей работы с объектом "
ПоследовательноСчитываемыйДокумент"
необходимо применить один из следующих методов объекта: СвязатьСФайлом()
, СвязатьСоСтрокой()
или СвязатьСОбъектом()
. Подробнее об этих методах поговорим далее.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент(); XMLДокумент.СвязатьСФайлом(КаталогПользователя() + "temp.xml"); . . .
Создать специальный объект, дающий возможность обрабатывать выходящий XML-документ, не прибегая к построению DOM, позволяет метод СоздатьПоследовательноЗаписываемыйДокумент()
. Параметры у метода отсутствуют. Возвращаемым значением метода является ссылка на OLE-объект, представляющий собой узел документа.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); XMLДокумент = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент(); XMLДокумент.ИмяФайла = КаталогПользователя() + "output.xml"; // Вставляем открывающий тег нового элемента XMLДокумент.ОткрытьЭлемент("ФайлОбмена"); . . . // Вставляем закрывающий тег XMLДокумент.ЗакрытьЭлемент(); // Сбрасываем построенную структуру тегов на диск и закрываем файл XMLДокумент.Сбросить(); XMLДокумент.Завершить();
Атрибуты абстрактного объекта типа "
Узел"
Примечание: Атрибуты, описываемые в данном разделе, являются общими для объектов "
Документ"
, "
Элемент"
, "
Атрибут"
и используются только при работе с DOM.
Узнать тип узла позволяет атрибут Тип
(англоязычный синоним — NodeType
), содержащий число, соответствующее типу узла в объектной модели документа (DOM). Возможные значения атрибута:
- 1 — узел элемента;
- 2 — узел атрибута;
- 3 — текстовый узел;
- 4 — узел секции CDATA;
- 5 — узел ссылки на сущность (Entity Reference);
- 6 — узел сущности (Entity);
- 7 — узел инструкции обработки;
- 8 — узел комментария;
- 9 — узел документа;
- 10 — узел описания типа документа (DTD);
- 11 — узел фрагмента документа;
- 12 — узел объявления XML (XML Declaration).
Получить строковое значение, соответствующее типу узла в объектной модели документа (DOM) позволяет атрибут ТипСтрока
(англоязычный синоним — NodeTypeString
). Возможные значения, возвращаемые атрибутом:
"element"
— узел элемента;"attribute"
— узел атрибута;"text"
— текстовый узел;"cdatasection"
— узел секции CDATA;"entityreference"
— узел ссылки на сущность;"entity"
— узел сущности"processinginstruction"
— узел инструкции обработки;"comment"
— узел комментария;"document"
— узел документа;"documenttype"
— узел описания типа документа (DTD);"documentfragment"
— узел фрагмента документа;"notation"
— узел объявления XML (XML Declaration).
Получить наименование узла позволяет атрибут Наименование
(англоязычный синоним — BaseName
), значение которого зависит от типа узла. Чаще всего это значение приходится получать для узлов типа "
Элемент"
или "
Атрибут"
, для которых возвращается имя узла без префикса.
Получить префикс имени узла позволяет атрибут Префикс
(англоязычный синоним — Prefix
), значение которого зависит от типа узла. Чаще всего это значение приходится получать для узлов типа "
Элемент"
или "
Атрибут"
, для которых возвращается только префикс (без имени).
Получить наименование узла полностью позволяет атрибут ПолноеНаименование
(англоязычный синоним — NodeName
). Содержащееся в атрибуте значение зависит от типа узла. Чаще всего это значение приходится получать для узлов типа "
Элемент"
или "
Атрибут"
, для которых возвращается префикс и имя узла, разделённые двоеточием.
Получить ссылку на родительский узел (то есть на объект типа "
Документ"
или "
Элемент"
) позволяет атрибут Родитель
(англоязычный синоним — ParentNode
). Замечу, что узлы типа "
Документ"
и "
Атрибут"
родителя не имеют, и значение данного свойства для них всегда является пустым значением.
Пример использования:
ЭлПодразделение = ЭлСотрудник.Родитель;
Получить ссылку на узел типа "
Документ"
, которому принадлежит данный узел, позволяет атрибут ДокументВладелец
(англоязычный синоним — OwnerDocument
).
Получить или установить тип данных узла позволяет атрибут ТипДанных
(англоязычный синоним — DataType
). Его содержимым является строка, соответствующая типу данных, который имеет значение узла. Значение данного атрибута влияет на допустимые значения, которые могут быть присвоены данному узлу, и позволяет определить тип возвращаемого значения при запросе свойства Значение
.
Пример использования:
Если АтрЭлемента.Наименование = "Дата" Тогда АтрЭлемента.ТипДанных = "date"; АтрЭлемента.Значение = ТекущаяДата(); КонецЕсли;
Получить или установить значение (содержимое) узла позволяет атрибут Значение
(англоязычный синоним — NodeValue
).
Пример использования:
Сообщить("Значение узла - " + Узел.Значение);
Другой пример:
ЭлВторогоУровня = ЭлПервогоУровня.СоздатьПодчиненныйЭлемент("Сотрудник"); ЭлВторогоУровня.Значение = СокрЛП(ТЗ.ПолучитьЗначение(НомПП, "ФИО"));
Получить или установить текстовое содержимое узла позволяет атрибут Текст
(англоязычный синоним — Text
).
Важно! Возвращаемая данным атрибутом строка, соответствует совокупному содержимому текущего узла и всех принадлежащих ему подчинённых узлов, если таковые имеются. При присвоении же этому атрибуту какого-то текстового значения полностью реорганизуется вся структура подчинённых узлов (если таковые имеются) — они заменяются одним узлом типа «text».
Получить или установить содержимое узла, являющееся представлением данного узла со всеми подчинёнными узлами в формате XML, позволяет атрибут ПредставлениеXML
(англоязычный синоним – Xml
).
Пример использования:
XMLДокумент = Анализатор.СоздатьДокумент(); XMLДокумент.ЗагрузитьИзСтроки(Узел.ПредставлениеXML); . . .
Другой пример:
XMLДокумент2 = Анализатор.СоздатьДокумент(); // создаем копию документа XMLДокумент2.ЗагрузитьИзСтроки(XMLДокумент1.ПредставлениеXML); . . .
Методы абстрактного объекта типа "
Узел"
Примечание: Методы, описываемые в данном разделе, являются общими для объектов "
Документ"
, "
Элемент"
, "
Атрибут"
и используются только при работе с DOM.
Получить количество узлов, подчинённых данному, позволяет метод КоличествоПодчиненных()
(англоязычный синоним — NumberChilds()
). Согласно последним требованиям спецификации DOM, в это количество не включаются узлы типа "
Атрибут"
. Параметры у метода отсутствуют.
Пример использования:
Для Ном=0 По Узел.КоличествоПодчиненных() - 1 Цикл ПодчиненныйУзел = Узел.ПолучитьПодчиненныйПоНомеру(Ном); . . . КонецЦикла;
Примечание: Нумерация узлов в списке подчинённых начинается с нуля.
Получить объект типа "
Узел"
по указанному порядковому номеру позволяет метод ПолучитьПодчиненныйПоНомеру()
(англоязычный синоним — GetChildByNum()
). Данный метод в совокупности с методом КоличествоПодчиненных()
используется для обхода узлов, подчинённых данному узлу (см. пример выше).
Синтаксис метода:
ПолучитьПодчиненныйПоНомеру(<Номер>)
где <Номер> — порядковый номер узла в списке подчинённых. Нумерация узлов начинается с нуля.
Получить ссылку на коллекцию узлов, содержащую узлы элементов или атрибутов, которые удовлетворяют заданному критерию отбора, позволяет метод ВыбратьУзлы()
(англоязычный синоним — SelectNodes()
). Для дальнейшей работы с этой коллекцией используются атрибуты и методы объекта "
ВыборкаУзлов"
(см. раздел «Объект "
ВыборкаУзлов"
»).
Синтаксис метода:
ВыбратьУзлы(<КритерийОтбора>)
где <КритерийОтбора> — строковое выражение, содержащее критерии отбора узлов в создаваемую коллекцию. Запрос формулируется на языке запросов XSL.
Пример использования:
ВыборкаУзлов = УзелРСВ.ВыбратьУзлы("РасчетСтраховыхВзносов"); Если ПустоеЗначение(ВыборкаУзлов) = 0 Тогда Для СчУзлов = 0 По ВыборкаУзлов.КоличествоУзлов - 1 Цикл . . . КонецЦикла; КонецЕсли;
Получить первый из узлов (объект "
Элемент"
или "
Атрибут"
), который удовлетворяет заданному критерию отбора, позволяет метод ВыбратьУзел()
(англоязычный синоним — SelectSingleNode()
).
Синтаксис метода:
ВыбратьУзел(<КритерийОтбора>)
где <КритерийОтбора> — строковое выражение, содержащее критерии выбора узла. Запрос формулируется на языке запросов XSL.
Пример использования:
УзелРегистрационныйНомер = УзелРСВ.ВыбратьУзел("РегистрационныйНомерПФР");
Добавить новый узел, созданный с помощью соответствующих методов объекта "
Документ"
, в список подчинённых данному узлу позволяет метод ДобавитьПодчиненный()
(англоязычный синоним — AppendChild()
). Возвращаемого значения у метода нет.
Синтаксис метода:
ДобавитьПодчиненный(<НовыйУзел>, <ВставитьПеред>)
где
- <НовыйУзел> — ранее созданный объект типа
"
Узел"
; - <ВставитьПеред> — имеющийся объект типа
"
Узел"
, перед которым необходимо вставить новый узел. Параметр является необязательным. Если параметр не указан, новый узел будет вставлен последним.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); // создаём корневой узел DOM XMLДокумент = Анализатор.СоздатьДокумент(); // создаем новый узел документа ЭлСписок = XMLДокумент.СоздатьУзел(1, "Список"); // добавляем созданный узел в документ XMLДокумент.ДобавитьПодчиненный(ЭлСписок); . . .
Создать подчинённый элемент позволяет метод СоздатьПодчиненныйЭлемент()
(англоязычный синоним — CreateChildElement()
). Метод предназначен для облегчения часто встречающейся операции — процесса создания подчинённого элемента. Он заменяет сразу два метода: СоздатьУзел()
и ДобавитьПодчиненный()
.
Синтаксис метода:
СоздатьПодчиненныйЭлемент(<Имя>, <ВставитьПеред>, <ПространствоИмен>)
где
- <Имя> — строковое выражение, задающее наименование создаваемому элементу;
- <ВставитьПеред> — объект типа
"
Узел"
, перед которым следует вставить создаваемый узел элемента. Параметр является необязательным. Если параметр не используется, элемент будет вставлен в конец списка; - <ПространствоИмен> — строковое выражение, указывающее пространство имён, в контексте которого создаётся новый элемент. Параметр является необязательным. Если не указан, анализатор предпринимает попытку создать элемент в контексте пространства имён, определённого у стоящих выше по иерархии узлов документа с учётом префикса, указанного в параметре <Имя>.
Пример использования:
XMLДокумент = Анализатор.СоздатьДокумент(); ЭлЭОКС = XMLДокумент.СоздатьПодчиненныйЭлемент("ЭОКС");
Удалить указанный узел из списка узлов, подчинённых данному, позволяет метод УдалитьПодчиненный()
(англоязычный синоним — RemoveChild()
). Возвращаемого значения у метода нет.
Синтаксис метода:
УдалитьПодчиненный(<УдаляемыйУзел>)
где <УдаляемыйУзел> — объект типа "
Узел"
, который следует удалить из списка подчинённых узлов.
Пример использования:
ПервыйПодчиненный = XMLДокумент.ЭлементДокумента.ПолучитьПоНомеру(0); XMLДокумент.ЭлементДокумента.УдалитьПодчиненный(ПервыйПодчиненный);
Примечание: Нумерация узлов в списке подчинённых начинается с нуля.
Привести переданную строку к виду, который допустим для присвоения атрибуту id
, позволяет метод ПреобразоватьВ_ИД()
(англоязычный синоним — ConvertToID()
). Возвращаемым значением метода является преобразованная строка, допустимая с точки зрения допустимых значений атрибута, имеющего тип id
.
Синтаксис метода:
ПреобразоватьВ_ИД(<СтрИД>)
где <СтрИД> — строковое выражение — строка, которую надо преобразовать.
Пример использования:
СтрИД = ЗначениеВСтрокуВнутр(СпрТовары); ЭлТовар.УстановитьАтрибут("ИДТовара", ЭлТовар.ПреобразоватьВ_ИД(СтрИД));
Чтобы лучше усвоить, как и где используются описанные выше атрибуты и методы, рассмотрим исходный код процедуры, формирующей XML-файл, который передаётся в Сбербанк для зачисления сумм зарплаты на пластиковые карты сотрудников:
// Пытаемся создать объект типа "XMLParser" Попытка Анализатор = СоздатьОбъект("AddIn.XMLParser"); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; // Начинаем формирование выходного XML-файла XMLДокумент = Анализатор.СоздатьДокумент(); // Создаем корневой элемент "СчетаПК" и заполняем его атрибуты ЭлСчетаПК = XMLДокумент.СоздатьПодчиненныйЭлемент("СчетаПК"); ЭлСчетаПК.УстановитьАтрибут("РасчетныйСчетОрганизации", СокрЛП(РасчСчет.Номер)); ЭлСчетаПК.УстановитьАтрибут("ИНН", СокрЛП(Константа.ИННОрганизации)); // Предварительно в названии организации заменяем двойные кавычки на одинарные НаименованиеОрганизации = СтрЗаменить(СокрЛП(Константа.НаименованиеОрганизации), """", "'"); ЭлСчетаПК.УстановитьАтрибут("НаименованиеОрганизации", НаименованиеОрганизации); ЭлСчетаПК.УстановитьАтрибут("НомерДоговора", СокрЛП(НомерДоговора)); // Предварительно приводим дату документа к формату ГГГГ-ММ-ДД ДатаФормирования = ""+ДатаГод(ДатаДок)+"-"+Прав("0"+ДатаМесяц(ДатаДок),2)+"-"+Прав("0"+ДатаЧисло(ДатаДок),2); ЭлСчетаПК.УстановитьАтрибут("ДатаФормирования", ДатаФормирования); // Вставляем элемент комментария, отделяющий "заголовочную часть" документа от элементов с данными ЭлКомментария = XMLДокумент.СоздатьУзел(8); ЭлКомментария.Значение = "СчетаПК"; XMLДокумент.ДобавитьПодчиненный(ЭлКомментария); // Создаем подчиненный элемент "ЗачислениеЗарплаты" ЭлЗачислениеЗарплаты = ЭлСчетаПК.СоздатьПодчиненныйЭлемент("ЗачислениеЗарплаты"); КоличествоЗаписей = 0; СуммаИтого = 0; // Создаем подчиненные элементы "Сотрудник" для каждого сотрудника из списка. // Здесь ТЗ – элемент формы "Таблица значений" Для ПорНом=1 По ТЗ.КоличествоСтрок() Цикл ЭлСотрудник = ЭлЗачислениеЗарплаты.СоздатьПодчиненныйЭлемент("Сотрудник"); ЭлСотрудник.УстановитьАтрибут("Нпп", ПорНом); // Для каждого сотруднка в элементе "Сотрудник" создаем подчиненные элементы "Фамилия", "Имя", // "Отчество", "ОтделениеБанка", "ФилиалОтделенияБанка", "ЛицевойСчет", "Сумма" // и устанавливаем их значения ЭлФамилия = ЭлСотрудник.СоздатьПодчиненныйЭлемент("Фамилия"); ФИОПолностью = СокрЛП(ТЗ.ПолучитьЗначение(ПорНом,"ФИО")); ПозицияПервогоПробела = Найти(ФИОПолностью, " "); ЭлФамилия.Значение = Лев(ФИОПолностью, ПозицияПервогоПробела - 1); ЭлИмя = ЭлСотрудник.СоздатьПодчиненныйЭлемент("Имя"); ИмяОтчество = СокрЛ(Сред(ФИОПолностью, ПозицияПервогоПробела + 1)); ПозицияВторогоПробела = Найти(ИмяОтчество, " "); ЭлИмя.Значение = Лев(ИмяОтчество, ПозицияВторогоПробела - 1); ЭлОтчество = ЭлСотрудник.СоздатьПодчиненныйЭлемент("Отчество"); ЭлОтчество.Значение = СокрЛП(Сред(ИмяОтчество, ПозицияВторогоПробела + 1)); ЭлОтделениеБанка = ЭлСотрудник.СоздатьПодчиненныйЭлемент("ОтделениеБанка"); ЭлОтделениеБанка.Значение = СокрЛП(ОтделениеБанка); ЭлФилиалОтделенияБанка = ЭлСотрудник.СоздатьПодчиненныйЭлемент("ФилиалОтделенияБанка"); ЭлФилиалОтделенияБанка.Значение = СокрЛП(ФилиалОтделенияБанка); ЭлЛицевойСчет = ЭлСотрудник.СоздатьПодчиненныйЭлемент("ЛицевойСчет"); ЭлЛицевойСчет.Значение = СокрЛП(ТЗ.ПолучитьЗначение(ПорНом,"ЛС")); ЭлСумма = ЭлСотрудник.СоздатьПодчиненныйЭлемент("Сумма"); СуммаКЗачислению = ТЗ.ПолучитьЗначение(ПорНом,"Сумма"); ЭлСумма.Значение = СуммаКЗачислению; // Суммируем итоги КоличествоЗаписей = КоличествоЗаписей + 1; СуммаИтого = СуммаИтого + СуммаКЗачислению; КонецЦикла; // Создаем в узле "СчетаПК" подчиненный узел "КонтрольныеСуммы" ЭлКонтрольныеСуммы = ЭлСчетаПК.СоздатьПодчиненныйЭлемент("КонтрольныеСуммы"); // в котором, в свою очередь, создаем подчиненные узлы "КоличествоЗаписей" и "СуммаИтого" // и устанавливаем их значения ЭлКоличествоЗаписей = ЭлКонтрольныеСуммы.СоздатьПодчиненныйЭлемент("КоличествоЗаписей"); ЭлКоличествоЗаписей.Значение = КоличествоЗаписей; ЭлСуммаИтого = ЭлКонтрольныеСуммы.СоздатьПодчиненныйЭлемент("СуммаИтого"); ЭлСуммаИтого.Значение = СуммаИтого; // Записываем файл на диск ИмяФайлаВыгрузки = Прав("0000"+ВРег(СокрЛП(ОтделениеБанка)), 4) + Прав("000"+СокрЛП(НомЗаявки), 3) + "z.xml"; XMLДокумент.Записать(КаталогПользователя() + ИмяФайлаВыгрузки); Анализатор = 0;
В результате выполнения вышеприведённого кода формируется XML-файл со следующим содержимым:
Атрибуты объекта "
Документ"
Примечание: Атрибуты, описываемые в данном разделе, являются специфичными для объекта "
Документ"
и используются при работе с объектной моделью документа (DOM).
Установить/считать кодировку, в которой сохраняется документ позволяет атрибут Кодировка
(англоязычный синоним — Encode
). Значение задаётся строкой в соответствии стандартными наименованиями наборов символов для использования в Интернете. По умолчанию установлена кодировка «windows-1251». Для России обычно используются следующие кодировки:
- windows-1251
- KOI8-R
- Cp866
- ISO-8859-5
Пример записи атрибута:
XMLДокумент.Кодировка = "KOI8-R";
Получить доступ к коллекции схем, установленных документу для проверки состоятельности во время загрузки или проверки состоятельности с помощью метода Проверить()
, позволяет атрибут Схемы
(англоязычный синоним — Schemas
).
Пример использования:
XMLДокумент.Схемы = СхемыДляПроверки; XMLДокумент.Проверить();
Получить доступ к использованным в документе пространствам имён позволяет атрибут ПространстваИмен
(англоязычный синоним — NameSpaces
). Значение атрибута имеет тип "
коллекция схем"
.
Пример использования:
Стр = "Количество использованных в документе пространств имен - "; Стр = Стр + XMLДокумент.ПространстваИмен.КоличествоСхем; Сообщить(Стр);
Получить/установить режим разрешения внешних ссылок при загрузке или проверке состоятельности позволяет атрибут РазрешатьВнешниеСсылки
(англоязычный синоним — ResolveExternals
).
Получить корневой элемент (root) документа позволяет атрибут ЭлементДокумента
(англоязычный синоним — DocumentElement
).
Пример использования:
Сообщить(XMLДокумент.ЭлементДокумента.Наименование);
Методы объекта "
Документ"
Примечание: Методы, описываемые в данном разделе, являются специфичными для объекта "
Документ"
и используются при работе с объектной моделью документа (DOM).
Связать новый документ, созданный методом СоздатьДокумент()
, с указанным файлом или OLE-объектом позволяет метод Загрузить()
(англоязычный синоним — Load()
). При возникновении ошибочной ситуации во время загрузки или разбора источника генерируется ошибка исполнения.
Синтаксис метода:
Загрузить(<Откуда>)
где <Откуда> — аргумент, являющийся строкой или объектом OLE Automation, созданным с помощью системной функции СоздатьОбъект()
и имплементирующим интерфейс IStream или IPersistStream. В случае, если аргумент является строкой, её содержимое интерпретируется, как путь к файлу, содержащему XML-документ. В случае, если аргумент является объектом OLE Automation, документ загружается из потока, представленного интерфейсом IStream или IPersistStream.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); // создаём корневой узел DOM XMLДокумент = Анализатор.СоздатьДокумент(); // связываем созданный объект с конкретным XML-файлом XMLДокумент.Загрузить(КаталогПрограммы() + "plan.xml"); // начинаем обработку файла . . .
Связать новый документ, созданный методом СоздатьДокумент()
, со строкой в XML-формате позволяет метод ЗагрузитьИзСтроки()
(англоязычный синоним — LoadXML()
). При возникновении ошибочной ситуации во время разбора строки генерируется ошибка исполнения.
Синтаксис метода:
ЗагрузитьИзСтроки(<СтрокаИсточник>)
где <СтрокаИсточник> — строка, содержащая XML-документ.
Пример использования:
XMLДокумент = Анализатор.СоздатьДокумент(); XMLДокумент.ЗагрузитьИзСтроки(Узел.ПредставлениеXML); . . .
Другой пример:
XMLДокумент2 = Анализатор.СоздатьДокумент(); // создаем копию документа XMLДокумент2.ЗагрузитьИзСтроки(XMLДокумент1.ПредставлениеXML); . . .
Получить элемент, атрибут с типом id
которого имеет значение, совпадающее с заданным, позволяет метод НайтиПоИД()
(англоязычный синоним — NodeFromID()
). Возвращаемым значением метода является узел найденного элемента.
Синтаксис метода:
НайтиПоИД(<ИД>)
где <ИД> — строковое выражение, содержащее искомое поле идентификатора.
Пример записи метода:
ИскомыйЭлемент = XMLДокумент.НайтиПоИД("А0001");
Создать новый узел указанного типа позволяет метод СоздатьУзел()
(англоязычный синоним — CreateNode()
). Возвращаемым значением метода является ссылка на созданный узел.
Примечание: Новый узел после создания ещё не включён в документ, так как не имеет родительского узла, то есть не является частью иерархической структуры документа (DOM). Чтобы узел был включён в документ, нужно воспользоваться методом ДобавитьПодчиненный()
объекта типа "
Узел"
.
Синтаксис метода:
СоздатьУзел(<ТипУзла>, <Наименование>, <ПространствоИмен>)
где
- <ТипУзла> — числовое или строковое выражение, определяющее тип создаваемого узла. Возможные значения:
- 1 (или
"
element"
) — узел элемента; - 2 (или
"
attribute"
) — узел атрибута; - 3 (или
"
text"
) — текстовый узел; - 4 (или
"
cdatasection"
) — узел секции CDATA; - 5 (или
"
entityreference"
) — узел ссылки на сущность; - 6 (или
"
entity"
) — узел сущности; - 7 (или
"
processinginstruction"
) — узел инструкции обработки; - 8 (или
"
comment"
) — узел комментария; - 9 (или
"
document"
) — узел документа; - 10 (или
"
documenttype"
) — узел описания типа документа DTD; - 11 (или
"
documentfragment"
) — узел фрагмента документа; - 12 (или
"
notation"
) — узел объявления XML.
- 1 (или
- <Наименование> — строковое выражение. Для элемента или атрибута — это полное наименование, включающее префикс; для инструкции обработки — это имя приложения. Для узлов, у которых наименование не имеет смысла, параметр опускается или задаётся равным пустой строке (
""
); - <ПространствоИмен> — строковое выражение. Параметр является необязательным. Если этот параметр задан, узел создаётся в контексте указанного пространства имён с учётом префикса, указанного в наименовании. Если в наименовании префикс отсутствует, данное пространство имён интерпретируется как пространство имён по умолчанию.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); // создаём корневой узел DOM Корень = Анализатор.СоздатьДокумент(); // Создаем новый узел документа ЭлПервогоУровня = Корень.СоздатьУзел(1, "Список"); // Добавляем созданный узел в документ Корень.ДобавитьПодчиненный(ЭлПервогоУровня); . . .
Метод СоздатьУзел()
следует использовать, например, для вставки в XML-документ узла комментария (метод СоздатьПодчиненныйЭлемент()
объекта типа "
Узел"
для этого не подойдёт). Следующий код добавит в XML-документ тег <!--Тело документа-->
.
ЭлКомментария = XMLДокумент.СоздатьУзел(8); ЭлКомментария.Значение = "Тело документа"; <ЭлементРодитель>.ДобавитьПодчиненный(ЭлКомментария);
Примечание: При работе со старыми версиями компоненты V77plus, создание структуры нового файла XML начиналось с создания объявления XML (XML Declaration), то есть инструкции обработки <?xml version ="1.0"?>
:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); // Создаём корневой узел DOM XMLДокумент = Анализатор.СоздатьДокумент(); // Создаем объявление XML ИнструкцияОбработки = XMLДокумент.СоздатьУзел(7, "xml"); ИнструкцияОбработки.Данные = "version='1.0'"; // Добавляем созданное объявление XML в документ XMLДокумент.ДобавитьПодчиненный(ИнструкцияОбработки); . . .
В настоящее время создавать объявление XML «вручную» не требуется, так как оно создаётся автоматически. В связи с этим атрибут Данные
объекта "
Узел"
(см. пример выше), предназначенный для узлов типа "
XMLDeclaration"
, потерял свою актуальность (потому и был изъят из документации и синтаксис-помощника).
Осуществить проверку состоятельности документа позволяет метод Проверить()
(англоязычный синоним — Validate()
). Если документ не состоятелен, генерируется ошибка исполнения. Параметры у метода отсутствуют.
Пример использования:
XMLДокумент.Схемы = СхемыДляПроверки; XMLДокумент.Проверить();
Сохранить XML-документ в файл или выгрузить в поток, представленный интерфейсом IStream или IPersistStream, позволяет метод Записать()
(англоязычный синоним — Save()
). Возвращаемого значения у метода нет. При возникновении ошибочной ситуации во время загрузки или разбора источника генерируется ошибка исполнения.
Синтаксис метода:
Записать(<Куда>)
где <Куда> — если аргумент является строкой, её содержимое интерпретируется, как путь к файлу, в котором следует сохранить XML-документ. В случае, если аргумент является COM-объектом, документ выгружается в поток, представленный интерфейсом IStream или IPersistStream.
Пример использования:
XMLДокумент.Записать("C:\XMLDocuments\SrcDocument.xml");
Атрибуты объекта "
Элемент"
Объект "
Элемент"
имеет лишь один специфичный атрибут — ИмяТега
(англ. синоним — TagName
). Атрибут используется при работе с объектной моделью документа (DOM). Значением атрибута является наименование тега элемента.
Сообщить("Тег элемента - " + Элемент.ИмяТега);
Методы объекта "
Элемент"
Примечание: Методы, описываемые в данном разделе, являются специфичными для объекта "
Элемент"
и используются при работе с объектной моделью документа (DOM).
Узнать количество атрибутов у данного элемента позволяет метод КоличествоАтрибутов()
(англоязычный синоним — AttributesNumber()
). Параметры у метода отсутствуют.
Пример использования:
Для Ном = 0 По Элемент.КоличествоАтрибутов() - 1 Цикл УзелАтрибута = Элемент.ПолучитьУзелАтрибута(Ном); . . . КонецЦикла;
Примечание: Нумерация атрибутов в списке атрибутов элемента начинается с нуля.
Получить объект узла атрибута по номеру или по наименованию позволяет метод ПолучитьУзелАтрибута()
(англоязычный синоним — GetAttributeNode()
). Возвращаемым значением метода является ссылка на узел атрибута.
Синтаксис метода:
ПолучитьУзелАтрибута(<НомерИлиНаименование>)
где <НомерИлиНаименование> — строковое или числовое выражение — наименование узла атрибута или номер требуемого узла атрибута (см. пример выше) из списка принадлежащих элементу атрибутов. Нумерация атрибутов в списке атрибутов элемента начинается с нуля.
Пример использования:
АтрДатаПриема = ЭлСотрудник.ПолучитьУзелАтрибута("ДатаПриема");
Получить значение указанного атрибута позволяет метод ПолучитьАтрибут()
(англоязычный синоним — GetAttribute()
). Если атрибуту установлен тип данных, то возвращаемое значение приводится к соответствующему типу, в противном случае возвращается строка.
Синтаксис метода:
ПолучитьАтрибут(>НаименованиеАтрибута>)
где <НаименованиеАтрибута> — строковое выражение – наименование атрибута, значение которого требуется получить.
Пример использования:
ДатаПриемаНаРаботу = ЭлСотрудник.ПолучитьАтрибут("ДатаПриема");
Добавить элементу новый атрибут позволяет метод ДобавитьАтрибут()
(англоязычный синоним — AddAttribute()
). Возвращаемым значением метода является ссылка на добавленный атрибут.
Синтаксис метода:
ДобавитьАтрибут(<НаименованиеАтрибута>)
где <НаименованиеАтрибута> — строковое выражение — наименование добавляемого атрибута.
Пример использования:
АтрДатаСоздания = Документ.ЭлементДокумента.ДобавитьАтрибут("ДатаСоздания"); АтрДатаСоздания.Значение = ТекущаяДата();
Установить значение для указанного атрибута позволяет метод УстановитьАтрибут()
(англоязычный синоним — SetAttribute()
). Если указанный атрибут отсутствует, метод добавляет его. Возвращаемого значения у метода нет.
Синтаксис метода:
УстановитьАтрибут(<НаименованиеАтрибута>, <Значение>)
где
- <НаименованиеАтрибута> — строковое выражение — наименование атрибута, значение которого устанавливается;
- <Значение> — значение, которое следует присвоить атрибуту. Если атрибуту присвоен определённый тип, выполняется попытка преобразования.
Пример использования:
ЭлСотрудник.УстановитьАтрибут("Нпп", СчетчикВыгруженныхОбъектов);
Удалить указанный атрибут из списка принадлежащих данному элементу позволяет метод УдалитьАтрибут()
(англоязычный синоним — RemoveAttribute()
). Возвращаемого значения у метода нет.
Синтаксис метода:
УдалитьАтрибут(<УзелАтрибута>)
где <УзелАтрибута> — объект узла атрибута, который требуется удалить.
Пример использования:
ЭлСотрудник.УдалитьАтрибут(ЭлСотрудник.ПолучитьУзелАтрибута("ДатаПриема");
Установить соответствие префикса в полных наименованиях элементов и атрибутов некоторому пространству имён для элементов, починённых данному, позволяет метод УстановитьПространствоИмен()
(англоязычный синоним — SetNamespace()
). Если в вызове отсутствует параметр <Префикс>, то устанавливается пространство имён для элементов и атрибутов без префикса, то есть пространство имён «по умолчанию».
Данный метод не может применяться для установки контекста пространства имён для данного элемента, то есть префикс в имени данного элемента и параметр <Префикс> не должны совпадать или не должны быть оба пустыми. Контекст пространства имён может быть присвоен элементу только при его создании.
Синтаксис метода:
УстановитьПространствоИмен(<ПространствоИмен>, <Префикс>)
где
- <ПространствоИмен> — строковое выражение — наименование пространства имён;
- <Префикс> — строковое выражение — префикс, ставящийся в соответствие пространству имён.
Пример использования:
Док.Элем.УстановитьПространствоИмен(''urn:schemas-msoft-com:datatypes'', ''dt'');
Атрибуты и методы объекта "
Атрибут"
Собственных (специфичных) свойств и методов у объекта "
Атрибут"
нет. Все свойства и методы наследуются от базового объекта "
Узел"
. А ещё для узлов этого типа имеется одна особенность — значение свойства Родитель
у них всегда пустое.
Атрибуты специального объекта "
КоллекцияСхем"
Объект "
КоллекцияСхем"
имеет всего лишь один атрибут — КоличествоСхем
(англоязычный синоним — Length
), значением которого является число — количество схем в коллекции.
Пример использования:
Для Ном = 0 По XMLДокумент.Схемы.КоличествоСхем - 1 Цикл ЭлСхемы = XMLДокумент.Схемы.ПолучитьСхему(Ном); . . . КонецЦикла;
Примечание: Нумерация схем в коллекции начинается с нуля.
Методы специального объекта "
КоллекцияСхем"
Добавить новую схему в коллекцию схем и связать уникальный идентификатор ресурса пространства имён с указанной схемой позволяет метод ДобавитьСхему()
(англоязычный синоним — Add()
). Возвращаемого значения у метода нет.
Синтаксис метода:
ДобавитьСхему(<УникальныйИДРесурсаПространстваИмен>, <СпецификаторСхемы>)
где
- <УникальныйИДРесурсаПространстваИмен> — строковое выражение — пространство имен;
- <СпецификаторСхемы> — строковое выражение или объект документа с загруженной схемой (схема также является XML документом, отвечающим определённым требованиям). Если этот параметр является строкой, то она интерпретируется как путь к файлу, содержащему схему, и схема загружается из указанного файла.
Пример использования:
КоллекцияСхем.ДобавитьСхему(''http://server/schemas/Sc1.xml'', ''C:/Schemas/Sc1.xml'');
Получить корневой элемент схемы, затребованной по номеру или пространству имён, позволяет метод ПолучитьСхему()
(англоязычный синоним — Get()
). Возвращаемым значением метода является узел элемента Schema из документа схемы, связанной с затребованным пространством имён или номером схемы в коллекции (см. описание атрибута КоличествоСхем
).
Синтаксис метода:
ПолучитьСхему(<УникальныйИДРесурсаПространстваИменИлиНомер>)
где <УникальныйИДРесурсаПространстваИменИлиНомер> — строковое или числовое выражение, содержащее пространство имён или номер схемы в коллекции. Нумерация схем в коллекции начинается с нуля.
Пример использования:
ЭлСхемы = XMLДокумент.Схемы.ПолучитьСхему("http://server/schemas/Sc1.xml");
Удалить из коллекции схему, связанную с указанным пространством имён, позволяет метод УдалитьСхему()
(англоязычный синоним — Remove()
). Возвращаемого значения у метода нет.
Синтаксис метода:
УдалитьСхему(<УникальныйИДРесурсаПространстваИмен>)
где <УникальныйИДРесурсаПространстваИмен> — строковое выражение, содержащее пространство имён.
Пример использования:
КоллекцияСхем.УдалитьСхему("http://server/schemas/Sc1.xml");
Получить по номеру схемы уникальные идентификаторы ресурсов пространств имён, входящие в коллекцию, позволяет метод УникальныйИДРесурсаПространстваИмен()
(англоязычный синоним — NamespaceURI()
).
Синтаксис метода:
УникальныйИДРесурсаПространстваИмен(<НомерВКоллекции>)
где <НомерВКоллекции> — числовое выражение — номер схемы в коллекции. Нумерация схем в коллекции начинается с нуля.
Пример использования:
Сообщить(XMLДокумент.ПространстваИмен.УникальныйИДРесурсаПространстваИмен(0));
Атрибуты и методы объекта "
ВыборкаУзлов"
Специальный объект "
ВыборкаУзлов"
представляет собой коллекцию элементов и атрибутов, отобранных по совокупности признаков, заданных при создании. Получить количество элементов или атрибутов в коллекции позволяет атрибут КоличествоУзлов
(англоязычный синоним — Length
) объекта "
ВыборкаУзлов"
, а получить доступ к узлу по номеру — метод ПолучитьУзел()
(англоязычный синоним — Item()
):
ВыборкаУзлов = УзелРСВ.ВыбратьУзлы("РасчетСтраховыхВзносов"); Если ПустоеЗначение(ВыборкаУзлов) = 0 Тогда Для Ном = 0 По ВыборкаУзлов.КоличествоУзлов - 1 Цикл ЭлРасчет = ВыборкаУзлов.ПолучитьУзел(Ном); . . . КонецЦикла; КонецЕсли;
Примечание: Нумерация узлов в выборке начинается с нуля.
Объект "
ПоследовательноСчитываемыйДокумент"
Объект "
ПоследовательноСчитываемыйДокумент"
предназначен для последовательной обработки существующего XML-документа без создания объектной модели документа (DOM).
Атрибуты объекта "
ПоследовательноСчитываемыйДокумент"
Атрибут СвойстваТекущегоУзла
объекта "
ПоследовательноСчитываемыйДокумент"
возвращает одноимённый OLE-объект, атрибуты и методы которого позволяют получить доступ к различным свойствам узлов обрабатываемого документа (см. далее «Атрибуты объекта «СвойстваТекущегоУзла»», «Методы объекта «СвойстваТекущегоУзла»»).
Методы объекта "
ПоследовательноСчитываемыйДокумент"
Установить связь последовательно считываемого документа с указанным XML-файлом (то есть ассоциировать объект "
ПоследовательноСчитываемыйДокумент"
с указанным именем файла) позволяет метод СвязатьСФайлом()
.
Синтаксис метода:
СвязатьСФайлом(<ПолноеИмяФайла>)
где <ПолноеИмяФайла> — строка, содержащая имя XML-файла и путь к нему.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент(); XMLДокумент.СвязатьСФайлом(КаталогПрограммы() + "otchet.xml"); . . .
Установить связь последовательно считываемого документа с указанной строкой XML-данных (то есть ассоциировать объект "
ПоследовательноСчитываемыйДокумент"
с указанным источником XML-данных)позволяет метод СвязатьСоСтрокой()
.
Синтаксис метода:
СвязатьСоСтрокой(<CтрокаXML>)
где <CтрокаXML> — строка XML-данных.
Установить связь последовательно считываемого документа с XML-объектом (то есть ассоциировать объект "
ПоследовательноСчитываемыйДокумент"
с указанным источником XML-данных) позволяет метод СвязатьСОбъектом()
.
Синтаксис метода:
СвязатьСОбъектом(<Объект>)
где <Объект> — XML-узел.
Перейти на следующий уровень вниз в структуре документа позволяет метод Спуститься()
. Параметры у метода отсутствуют. Возвращаемым значением метода будет число, характеризующее достигнутый уровень:
- 1 — начало нового элемента;
- 2 — инструкция обработки;
- 3 — конец уровня;
- 4 — конец документа.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент(); XMLДокумент.СвязатьСФайлом(КаталогПрограммы() + "temp.xml"); ДостигнутыйУровень = XMLДокумент.Спуститься(); Пока ДостигнутыйУровень <> 4 Цикл // пока не достигнут конец файла Если ДостигнутыйУровень <> 1 Тогда // пропускаем концы уровней и инструкции // Переходим к следующему узлу того же уровня ДостигнутыйУровень = XMLДокумент.Следующий(); Продолжить; КонецЕсли; ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; Если ИмяТега = "ОбъектСправочника" Тогда ЗагрузитьОбъектСправочника(); ИначеЕсли ИмяТега = "Документ" Тогда ЗагрузитьДокумент(); Иначе // Переходим на уровень ниже ДостигнутыйУровень = XMLДокумент.Спуститься(); Продолжить; КонецЕсли; // Переходим к следующему узлу того же уровня ДостигнутыйУровень = XMLДокумент.Следующий(); КонецЦикла; . . .
Перейти на следующий уровень вверх в структуре документа позволяет метод Подняться()
. Параметры у метода отсутствуют. Возвращаемым значением метода будет число, характеризующее достигнутый уровень:
- 1 — начало нового элемента;
- 2 — инструкция обработки;
- 3 — конец уровня;
- 4 — конец документа.
Пример использования:
. . . Пока ДостигнутыйУровень < 3 Цикл ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; КолАтрибутов = КолАтрибутов + 1; Если ИмяТега = "НомерПачки" Тогда ДостигнутыйУровень = XMLДокумент.Спуститься(); ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; Если ИмяТега = "Основной" Тогда НомерПачки = ПолучитьЗначениеУзлаИзXML(); НазваниеОтчета = "Анкеты, пачка №" + НомерПачки; XMLДокумент.Подняться(); КонецЕсли; КонецЕсли; ДостигнутыйУровень = XMLДокумент.Следующий(); КонецЦикла; . . .
Перейти к следующему объекту на текущем уровне в структуре документа (вложения при этом пропускаются) позволяет метод Следующий()
. Параметры у метода отсутствуют. Возвращаемым значением метода будет число, характеризующее достигнутый уровень:
- 1 — начало нового элемента;
- 2 — инструкция обработки;
- 3 — конец уровня;
- 4 — конец документа.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент(); XMLДокумент.СвязатьСФайлом(КаталогПрограммы() + "temp.xml"); ДостигнутыйУровень = XMLДокумент.Спуститься(); Пока ДостигнутыйУровень <> 4 Цикл // пока не достигнут конец файла Если ДостигнутыйУровень <> 1 Тогда // пропускаем концы уровней и инструкции // Переходим к следующему узлу того же уровня ДостигнутыйУровень = XMLДокумент.Следующий(); Продолжить; КонецЕсли; ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; Если ИмяТега = "ОбъектСправочника" Тогда ЗагрузитьОбъектСправочника(); ИначеЕсли ИмяТега = "Документ" Тогда ЗагрузитьДокумент(); Иначе // Переходим на уровень ниже ДостигнутыйУровень = XMLДокумент.Спуститься(); Продолжить; КонецЕсли; // Переходим к следующему узлу того же уровня ДостигнутыйУровень = XMLДокумент.Следующий(); КонецЦикла; . . .
Получить доступ к текущему элементу в обходе, как к объекту DOM-модели, позволяет метод ТекущийЭлементВВидеОбъекта()
. Возвращаемым значением метода является XML-узел как объект DOM-модели, к которому можно применить методы объекта "
Узел"
и др. Параметры у описываемого метода отсутствуют.
Пример использования:
Узел = ХМЛФайлДанных.ТекущийЭлементВВидеОбъекта(); ПачкаВходящихДокументов = Узел.ВыбратьУзел("ПачкаВходящихДокументов");
Получить текущий элемент в обходе в виде строки позволяет метод ТекущийЭлементВВидеСтроки()
. Возвращаемым значением метода является представление XML-объекта в виде строки. Параметры у описываемого метода отсутствуют.
Пример использования:
XMLСтрока = ХМЛФайлДанных.ТекущийЭлементВВидеСтроки();
Атрибуты объекта "
СвойстваТекущегоУзла"
Получить информацию о типе объекта "
СвойстваТекущегоУзла"
позволяет атрибут Тип
. Он возвращает число 1, если это узел является элементом, или 7, если узел является инструкцией обработки.
Получить имя элемента без префикса позволяет атрибут Имя
. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "
Элемент"
.
Пример использования:
. . . Пока ДостигнутыйУровень < 3 Цикл ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; КолАтрибутов = КолАтрибутов + 1; Если ИмяТега = "НомерПачки" Тогда ДостигнутыйУровень = XMLДокумент.Спуститься(); ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; Если ИмяТега = "Основной" Тогда НомерПачки = ПолучитьЗначениеУзлаИзXML(); НазваниеОтчета = "Анкеты, пачка №" + НомерПачки; XMLДокумент.Подняться(); КонецЕсли; КонецЕсли; ДостигнутыйУровень = XMLДокумент.Следующий(); КонецЦикла; . . .
Получить имя элемента с префиксом позволяет атрибут ПолноеИмя
. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "
Элемент"
.
Получить префикс без имени позволяет атрибут Префикс
. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "
Элемент"
.
Получить идентификатор пространства имён узла позволяет атрибут ПространствоИмен
. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "
Элемент"
.
Получить наименование приложения позволяет атрибут Приложение
. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "
Инструкция обработки"
.
Получить текст инструкции обработки позволяет атрибут Данные
. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "
Инструкция обработки"
.
Получить текущий уровень вложенности узла позволяет атрибут Уровень
. Возвращаемым значением атрибута является число.
Узнать количество атрибутов элемента позволяет атрибут КоличествоАтрибутов
объекта "
СвойстваТекущегоУзла"
. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "
Элемент"
. Возвращаемым значением атрибута в этом случае будет число.
Пример использования:
ТаблицаФайловКомплекта = СоздатьОбъект("ТаблицаЗначений"); ТаблицаФайловКомплекта.НоваяКолонка("ИмяФайла"); ТаблицаФайловКомплекта.НоваяКолонка("ПутьКФайлу"); ТаблицаФайловКомплекта.НоваяКолонка("ТипФайла"); //для НДС всегда =1 ДостигнутыйУровень = XMLДокумент.Спуститься(); ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; . . . Если ИмяТега = "КнигаПрод" Тогда Для Ном=0 По XMLДокумент.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл ИмяАтриб = XMLДокумент.СвойстваТекущегоУзла.НаименованиеАтрибута(Ном); Если ИмяАтриб = "НаимКнПрод" Тогда ИмяФайлаКомп = XMLДокумент.СвойстваТекущегоУзла.ЗначениеАтрибута(Ном); ТаблицаФайловКомплекта.НоваяСтрока(); ТаблицаФайловКомплекта.ИмяФайла = ИмяФайлаКомп; // в основном файле выгрузки декларации НДС имена файлов указаны // без каталога, поскольку выгружаются не в отдельный каталог, // а туда же, куда и основной файл ТаблицаФайловКомплекта.ПутьКФайлу = КаталогФайла + ИмяФайлаКомп; ТаблицаФайловКомплекта.ТипФайла = 1; КонецЕсли; КонецЦикла; КонецЕсли;
Примечание: Нумерация атрибутов в списке атрибутов элемента начинается с нуля.
Методы объекта "
СвойстваТекущегоУзла"
Получить наименование атрибута текущего узла по его номеру в списке атрибутов позволяет метод НаименованиеАтрибута()
объекта "
СвойстваТекущегоУзла"
. Метод имеет смысл только в том случае, если текущий узел принадлежит к типу "
Элемент"
.
Синтаксис метода:
НаименованиеАтрибута(<Номер>)
где <Номер> — порядковый номер атрибута в списке атрибутов элемента. Нумерация атрибутов начинается с нуля.
Пример использования:
ТаблицаФайловКомплекта = СоздатьОбъект("ТаблицаЗначений"); ТаблицаФайловКомплекта.НоваяКолонка("ИмяФайла"); ТаблицаФайловКомплекта.НоваяКолонка("ПутьКФайлу"); ТаблицаФайловКомплекта.НоваяКолонка("ТипФайла"); //для НДС всегда =1 ДостигнутыйУровень = XMLДокумент.Спуститься(); ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; . . . Если ИмяТега = "КнигаПрод" Тогда Для Ном=0 По XMLДокумент.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл ИмяАтриб = XMLДокумент.СвойстваТекущегоУзла.НаименованиеАтрибута(Ном); Если ИмяАтриб = "НаимКнПрод" Тогда ИмяФайлаКомп = XMLДокумент.СвойстваТекущегоУзла.ЗначениеАтрибута(Ном); ТаблицаФайловКомплекта.НоваяСтрока(); ТаблицаФайловКомплекта.ИмяФайла = ИмяФайлаКомп; // в основном файле выгрузки декларации НДС имена файлов указаны // без каталога, поскольку выгружаются не в отдельный каталог, // а туда же, куда и основной файл ТаблицаФайловКомплекта.ПутьКФайлу = КаталогФайла + ИмяФайлаКомп; ТаблицаФайловКомплекта.ТипФайла = 1; КонецЕсли; КонецЦикла; КонецЕсли;
Получить полное наименование (включая префикс) атрибута текущего узла по его номеру в списке атрибутов позволяет метод ПолноеНаименованиеАтрибута()
объекта "
СвойстваТекущегоУзла"
. Метод имеет смысл только в том случае, если текущий узел принадлежит к типу "
Элемент"
.
Синтаксис метода:
ПолноеНаименованиеАтрибута(<Номер>)
где <Номер> — порядковый номер атрибута в списке атрибутов элемента. Нумерация атрибутов начинается с нуля.
Получить идентификатор пространства имён атрибута текущего узла по номеру атрибута в списке позволяет метод ПространствоИменАтрибута()
объекта "
СвойстваТекущегоУзла"
. Метод имеет смысл только в том случае, если текущий узел принадлежит к типу "
Элемент"
.
Синтаксис метода:
ПространствоИменАтрибута(<Номер>)
где <Номер> — порядковый номер атрибута в списке атрибутов элемента. Нумерация атрибутов начинается с нуля.
Получить значение атрибута текущего узла по номеру атрибута в списке позволяет метод ЗначениеАтрибута()
объекта "
СвойстваТекущегоУзла"
. Возвращаемым значением метода является строковое значение. Метод имеет смысл только в том случае, если текущий узел принадлежит к типу "
Элемент"
.
Синтаксис метода:
ЗначениеАтрибута(<Номер>)
где <Номер> — порядковый номер атрибута в списке атрибутов элемента. Нумерация атрибутов начинается с нуля.
Пример использования:
ТаблицаФайловКомплекта = СоздатьОбъект("ТаблицаЗначений"); ТаблицаФайловКомплекта.НоваяКолонка("ИмяФайла"); ТаблицаФайловКомплекта.НоваяКолонка("ПутьКФайлу"); ТаблицаФайловКомплекта.НоваяКолонка("ТипФайла"); //для НДС всегда =1 ДостигнутыйУровень = XMLДокумент.Спуститься(); ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; . . . Если ИмяТега = "КнигаПрод" Тогда Для Ном=0 По XMLДокумент.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл ИмяАтриб = XMLДокумент.СвойстваТекущегоУзла.НаименованиеАтрибута(Ном); Если ИмяАтриб = "НаимКнПрод" Тогда ИмяФайлаКомп = XMLДокумент.СвойстваТекущегоУзла.ЗначениеАтрибута(Ном); ТаблицаФайловКомплекта.НоваяСтрока(); ТаблицаФайловКомплекта.ИмяФайла = ИмяФайлаКомп; // в основном файле выгрузки декларации НДС имена файлов указаны // без каталога, поскольку выгружаются не в отдельный каталог, // а туда же, куда и основной файл ТаблицаФайловКомплекта.ПутьКФайлу = КаталогФайла + ИмяФайлаКомп; ТаблицаФайловКомплекта.ТипФайла = 1; КонецЕсли; КонецЦикла; КонецЕсли;
Чтобы лучше усвоить, как и где используются описанные выше атрибуты и методы, рассмотрим исходный код процедуры. Данная процедура формирует отчёт следующего вида:
считывая информацию из уже знакомого нам файла:
Исходный код процедуры:
Процедура ПечатьФайла() Если ФС.СуществуетФайл(СокрЛП(ПутьКФайлуВыгрузки) + ИмяФайлаВыгрузки)=0 Тогда Предупреждение("Выходной файл не найден!"); Возврат; КонецЕсли; Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("ПечатьЛС"); Анализатор = СоздатьОбъект("AddIn.XMLParser"); XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент(); XMLДокумент.СвязатьСФайлом(СокрЛП(ПутьКФайлуВыгрузки) + ИмяФайлаВыгрузки); // Начинаем чтение XML-документа ДостигнутыйУровень = XMLДокумент.Спуститься(); СвойстваТекущегоУзла = XMLДокумент.СвойстваТекущегоУзла; ИмяТега = СвойстваТекущегоУзла.Имя; Если ИмяТега = "СчетаПК" Тогда // Перебираем атрибуты узла "СчетаПК" (нумерация атрибутов начинается с 0) Для ИндексАтрибута=0 По СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл ИмяАтрибута = СвойстваТекущегоУзла.НаименованиеАтрибута(ИндексАтрибута); Если ИмяАтрибута = "ДатаФормирования" Тогда ДатаФормирования = СвойстваТекущегоУзла.ЗначениеАтрибута(ИндексАтрибута); ИначеЕсли ИмяАтрибута = "НомерДоговора" Тогда НомерДоговора = СвойстваТекущегоУзла.ЗначениеАтрибута(ИндексАтрибута); ИначеЕсли ИмяАтрибута = "НаименованиеОрганизации" Тогда НаименованиеОрганизации = СвойстваТекущегоУзла.ЗначениеАтрибута(ИндексАтрибута); ИначеЕсли ИмяАтрибута = "РасчетныйСчетОрганизации" Тогда РасчетныйСчетОрганизации = СвойстваТекущегоУзла.ЗначениеАтрибута(ИндексАтрибута); КонецЕсли; КонецЦикла; // Выводим шапку документа Таб.ВывестиСекцию("Шапка"); ПродолжитьОбработку = 0; Пока ДостигнутыйУровень<>4 Цикл // пока не достигнут конец файла Если ДостигнутыйУровень<>1 Тогда // Пропускаем концы уровней и инструкции ДостигнутыйУровень = XMLДокумент.Следующий(); Продолжить; КонецЕсли; ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя; Если ПродолжитьОбработку=0 Тогда Если ИмяТега = "ЗачислениеЗарплаты" Тогда ПродолжитьОбработку = 1; Иначе ДостигнутыйУровень = XMLДокумент.Спуститься(); Продолжить; КонецЕсли; КонецЕсли; Если ПродолжитьОбработку = 1 Тогда Если ИмяТега = "Сотрудник" Тогда ОбъектDOM = XMLДокумент.ТекущийЭлементВВидеОбъекта(); // Выбираем из подчиненных узлов сведения о сотруднике ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("Фамилия"); ФИОСотрудника = "" + ПодчиненныйУзел.Значение; ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("Имя"); ФИОСотрудника = ФИОСотрудника + " " + ПодчиненныйУзел.Значение; ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("Отчество"); ФИОСотрудника = ФИОСотрудника + " " + ПодчиненныйУзел.Значение; ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("ЛицевойСчет"); ЛицевойСчет = ПодчиненныйУзел.Значение; ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("Сумма"); Сумма = Число(ПодчиненныйУзел.Значение); ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("ОтделениеБанка"); ОБ = ПодчиненныйУзел.Значение; ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("ФилиалОтделенияБанка"); ФОБ = ПодчиненныйУзел.Значение; // Выводим строку документа Таб.ВывестиСекцию("Строка"); Иначе ДостигнутыйУровень = XMLДокумент.Спуститься(); Продолжить; КонецЕсли; КонецЕсли; ДостигнутыйУровень = XMLДокумент.Следующий(); КонецЦикла; КонецЕсли; Таб.Опции(0,0,5,0); Таб.Показать("Список на перечисление зарплаты на лицевые счета сотрудников"); КонецПроцедуры
Объект "
ПоследовательноЗаписываемыйДокумент"
Объект "
ПоследовательноЗаписываемыйДокумент"
предназначен для последовательной обработки вновь создаваемого XML-документа без создания объектной модели документа (DOM).
Атрибуты объекта "
ПоследовательноЗаписываемыйДокумент"
Указать имя создаваемого файла, включая путь к нему, позволяет атрибут ИмяФайла
.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); Док = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент(); Док.ИмяФайла = ИмяФайлаДанных; // Вставляем открывающий тег нового элемента Док.ОткрытьЭлемент("ФайлОбмена"); . . .
Получить доступ к части документа, не записанной после команды Сбросить()
, позволяет атрибут Содержание
объекта "
ПоследовательноЗаписываемыйДокумент"
.
Получить ссылку на объект "
АтрибутыЭлемента"
, методы которого могут быть использованы для доступа к атрибутам элемента, создаваемого командами ОткрытьЭлемент()
и ВключитьЭлемент()
, позволяет атрибут АтрибутыЭлемента
. Описания методов объекта "
АтрибутыЭлемента"
приведены далее.
Методы объекта "
ПоследовательноЗаписываемыйДокумент"
Создать открывающий тег с указанным именем и вставить указанное значение элемента позволяет метод ОткрытьЭлемент()
объекта "
ПоследовательноЗаписываемыйДокумент"
. Пространство имён при этом берётся из текущих установок мапирования. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
ОткрытьЭлемент(<ПолноеИмя>, <Значение>)
где
- <ПолноеИмя> — строка — полное имя тега с префиксом;
- <Значение> — строка — значение элемента. Параметр является необязательным.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); Док = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент(); Док.ИмяФайла = ИмяФайлаДанных; // Вставляем открывающий тег нового элемента Док.ОткрытьЭлемент("ФайлОбмена"); . . .
Создать закрывающий тег элемента позволяет метод ЗакрытьЭлемент()
объекта "
ПоследовательноЗаписываемыйДокумент"
. Параметры и возвращаемое значение у метода отсутствуют.
Пример использования:
Анализатор = СоздатьОбъект("AddIn.XMLParser"); Док = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент(); Док.ИмяФайла = ИмяФайлаДанных; // Вставляем открывающий тег нового элемента Док.ОткрытьЭлемент("ФайлОбмена"); . . . Док.ЗакрытьЭлемент(); // Сбрасываем построенную структуру тегов на диск и закрываем файл Док.Сбросить(); Док.Завершить();
Создать открывающий тег с указанным именем, вставить указанное значение элемента и добавить закрывающий тег позволяет метод ВключитьЭлемент()
объекта "
ПоследовательноЗаписываемыйДокумент"
. Вызов данного метода аналогичен последовательному вызову методов ОткрытьЭлемент()
и ЗакрытьЭлемент()
. Пространство имён при этом берётся из текущих установок мапирования. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
ВключитьЭлемент(<ПолноеИмя>, <Значение>)
где
- <ПолноеИмя> — строка — полное имя тега с префиксом;
- <Значение> — строка — значение элемента. Параметр является необязательным.
У данного метода есть и другой синтаксис, позволяющий добавить новый элемент (возможно, с подчинёнными узлами), переданный методу в качестве аргумента.
ВключитьЭлемент(<DOMобъект>)
где <DOMобъект> – узел, который нужно целиком включить в содержание.
Пример использования:
ПравилаОбмена = глПравила.ВыбратьУзел("ПравилаОбмена"); . . . Док.ВключитьЭлемент(ПравилаОбмена); Док.Сбросить();
Вставить узел инструкции обработки позволяет метод ВключитьИнструкциюОбработки()
объекта "
ПоследовательноЗаписываемыйДокумент"
. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
ВключитьИнструкциюОбработки(<Приложение>, <Данные>)
где
- <Приложение> — строка — наименование приложения;
- <Данные> — строка — текст инструкции обработки.
Установить указанное пространство имён для узла элемента и подчинённых ему узлов и атрибутов с указанным префиксом позволяет метод ОткрытьСвязываниеПрефикса()
объекта "
ПоследовательноЗаписываемыйДокумент"
. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
ОткрытьСвязываниеПрефикса(<Префикс>, <ПространствоИмен>)
где
- <Префикс> — строка — префикс;
- <ПространствоИмен> — строка — идентификатор пространства имён.
Закончить действие последнего вызова метода ОткрытьСвязываниеПрефикса()
с указанным префиксом позволяет метод ЗакрытьСвязываниеПрефикса()
объекта "
ПоследовательноЗаписываемыйДокумент"
. Эта конструкция может быть вложенной, в этом случае продолжается действие метода ОткрытьСвязываниеПрефикса()
с указанным префиксом более верхнего уровня. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
ЗакрытьСвязываниеПрефикса(<Префикс>)
где <Префикс> — строка — префикс.
Записать содержимое документа в выходной файл и очистить оперативную память компьютера позволяет метод Сбросить()
объекта "
ПоследовательноЗаписываемыйДокумент"
. Использование метода имеет смысл только, если установлен атрибут ИмяФайла
вышеназванного объекта. Параметры и возвращаемое значение у метода отсутствует.
Пример использования:
Док.ЗакрытьЭлемент(); Док.Сбросить(); Док.Завершить();
Примечание: Метод Сбросить()
может быть вызван неоднократно. При каждом его вызове очередная порция XML-кода будет добавляться в конец файла. Окончательное закрытие файла происходит после вызова метода Завершить()
.
Очистить содержимое документа без записи в файл позволяет метод Очистить()
объекта "
ПоследовательноЗаписываемыйДокумент"
. Параметры и возвращаемое значение у метода отсутствуют.
Закрыть сформированный XML-файл позволяет метод Завершить()
объекта "
ПоследовательноЗаписываемыйДокумент"
. Параметры и возвращаемое значение у метода отсутствуют.
Пример использования:
Док.ЗакрытьЭлемент(); Док.Сбросить(); Док.Завершить();
Методы объекта "
АтрибутыЭлемента"
OLE-объект "
АтрибутыЭлемента"
, возвращаемый одноимённым свойством объекта "
ПоследовательноЗаписываемыйДокумент"
, позволяет получить доступ к атрибутам XML-элемента, создаваемого с помощью команд ОткрытьЭлемент()
и ВключитьЭлемент()
.
Установить значение для указанного атрибута позволяет метод УстановитьАтрибут()
объекта "
АтрибутыЭлемента"
. Если указанный атрибут отсутствует, метод добавляет его. Возвращаемого значения у метода нет.
Синтаксис метода:
УстановитьАтрибут(<НаименованиеАтрибута>, <Значение>, <Режим>)
где
- <НаименованиеАтрибута> — строковое выражение — наименование атрибута, значение которого устанавливается;
- <Значение> — значение, которое следует присвоить атрибуту. Если атрибуту присвоен определённый тип, выполняется попытка преобразования;
- <Режим> — необязательный параметр числового типа. Если установлен в 0, то выполняется проверка на пустое значение. Если значение пустое — атрибут не устанавливается.
Установить имя (без префикса) атрибуту с указанным порядковым номером позволяет метод НаименованиеАтрибута()
. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
НаименованиеАтрибута(<НомерАтрибута>, <ИмяАтрибута>)
где
- <НомерАтрибута> — число — номер атрибута в списке атрибутов. Нумерация атрибутов ведётся с нуля;
- <ИмяАтрибута> — строка, содержащая имя (без префикса), которое необходимо установить.
Установить полное наименование (с префиксом) атрибуту с указанным порядковым номером позволяет метод ПолноеНаименованиеАтрибута()
. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
ПолноеНаименованиеАтрибута(<НомерАтрибута>, <ПолноеИмяАтрибута>)
где
- <НомерАтрибута> — число — номер атрибута в списке атрибутов. Нумерация атрибутов ведётся с нуля;
- <ПолноеИмяАтрибута> — строка, содержащая имя атрибута с префиксом, которое необходимо установить.
Установить пространство имён атрибуту с указанным порядковым номером позволяет метод ПространствоИменАтрибута()
. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
ПространствоИменАтрибута(<НомерАтрибута>, <ПространствоИмен>)
где
- <НомерАтрибута> — число — номер атрибута в списке атрибутов. Нумерация атрибутов ведётся с нуля;
- <ПространствоИмен> — строка, содержащая идентификатор пространства имён, которое необходимо установить.
Установить значение атрибута с указанным порядковым номером позволяет метод ЗначениеАтрибута()
. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
ЗначениеАтрибута(<НомерАтрибута>, <Значение>)
где
- <НомерАтрибута> — число — номер атрибута в списке атрибутов. Нумерация атрибутов ведётся с нуля;
- <Значение> — строка, содержащая значение атрибута, которое необходимо установить.
Удалить атрибут с указанным порядковым номером в списке позволяет метод Удалить()
. Возвращаемое значение у метода отсутствует.
Синтаксис метода:
Удалить(<НомерАтрибута>)
где <НомерАтрибута> — число — номер атрибута в списке. Нумерация атрибутов ведётся с нуля.
Удалить все атрибуты текущего элемента позволяет метод УдалитьВсе()
. Параметры и возвращаемое значение у метода отсутствуют.
Другие статьи по схожей тематике