Addin xmlparser
Содержание
Экспорт/импорт данных с помощью файлов формата XML.
Расширяемый язык разметки XML (eXtensible Markup Language) представляет собой современное средство для хранения и конвертирования данных. В документе XML данные образуют древовидную структуру, что для большинства пользователей является наиболее понятным способом организации данных. Для начала приведем краткое описание самых простых правил языка XML.
Весь текст xml-документа можно грубо разделить на две категории — символьные данные и тэги. Тэг представляет собой команду, которая начинается с символа «<» и заканчивается символом «>». В отличие от фиксированного набора тэгов языка HTML имена и структуру тэгов XML разработчик xml-документа задает сам. Символьные данные — это те структурированные данные, которые хранятся в документе.
Xml-документ начинается со строки, самый простой вариант, которой имеет следующий вид:
<?xml version=»1.0″?>
Эта строка называется определением 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 version=»1.0″?>
<КорневойЭлемент>
<ПодчиненныйЭлемент имя=»Подчиненный»>
Это текст внутри подчиненного элемента
</ПодчиненныйЭлемент>
</КорневойЭлемент>
Как и при работе с любыми другими форматами данных, сделанные изменения требуется зафиксировать, т.е. записать в файл. Это делает процедура Записать(ПутьКФайлу), которая вызывается для объекта Анализатор, отвечающего за весь документ.
Теперь посмотрим, как производить чтение данных из xml-файла. Загрузка внешней компоненты и создание объекта-парсера, естественно, обязательно провести и здесь. Далее также создается ссылка на xml-документ с помощью функции СоздатьДокумент. Далее следует связать его с конкретным файлом с помощью метода Загрузить(ИмяФайла). Доступ к отдельным узлам xml-документа осуществляется с помощью функции ВыбратьУзел(НазваниеУзла). Функция вернет ссылку на требуемый узел xml-документа, если он один. Например,
ФайлДанных=Анализатор.СоздатьДокумент();
ФайлДанных.Загрузить(Файл);
Корень=ФайлДанных.ВыбратьУзел(«КорневойУзел»);
Эта же функция применяется и к любому другому элементу xml-документа для получения доступа к его подчиненным элементам. Если подчиненных элементов несколько, узнать их количество можно с помощью функции КоличествоПодчиненных(), примененной к объекту родительского элемента. Далее каждый из подчиненных элементов можно получить с помощью функции ПолучитьПодчиненныйПоНомеру(НомерЭлемента). Для каждого элемента можно получить его атрибуты с помощью функции ПолучитьАтрибут(НазваниеАтрибута), а также содержимое элемента с помощью атрибута Значение объекта, содержащего ссылку на элемент.
Экспорт/импорт данных с помощью файлов формата XML.
Разберем тот же пример, что и при использовании файла формата DBF для экспорта и импорта данных. Создадим обработку в типовой конфигурации для экспорта плана счетов. Структура xml-файла должна быть такой. Корневой элемент xml-документа соответствует плану счетов в целом. В нем располагаются подчиненные элементы с именем Счет, содержащие информацию о счетах. В качестве содержимого элементов указывается наименование счета. Остальные данные записываются в качестве атрибутов (код, признаки валютного, количественного учета и пр.). В качестве подчиненных элементов для элемента Счет задаются элементы, обозначающие его субсчета с теми же атрибутами. Приведем код процедуры экспорта плана счетов.
Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+»v7plus.dll»)<>1 Тогда
Предупреждение(«Компонента не обнаружена»);
Возврат;
КонецЕсли;
Анализатор=СоздатьОбъект(«AddIn.XMLParser»);
Корень=Анализатор.СоздатьДокумент();
План=Корень.СоздатьПодчиненныйЭлемент(«ПланСчетов»);
Счет=СоздатьОбъект(«Счет.Основной»);
Родитель=СоздатьОбъект(«Счет.Основной»);
Счет.ВыбратьСчета();
Пока Счет.ПолучитьСчет()=1 Цикл
// если это счет, а не субсчет
Если Счет.Уровень()=1 Тогда
Родитель.НайтиПоКоду(Счет.Код);
СчетXML=План.СоздатьПодчиненныйЭлемент(«Счет»);
СчетXML.УстановитьАтрибут(«Код», Счет.Код);
СчетXML.УстановитьАтрибут(«Валютный», Счет.Валютный);
СчетXML.УстановитьАтрибут(«Количественный», Счет.Количественный);
СчетXML.УстановитьАтрибут(«Забалансовый», Счет.Забалансовый);
Если Счет.Активный=1 Тогда
СчетXML.УстановитьАтрибут(«вид»,»активный»);
ИначеЕсли Счет.Активный=2 Тогда
СчетXML.УстановитьАтрибут(«вид»,»пассивный»);
Иначе
СчетXML.УстановитьАтрибут(«вид»,»активно-пассивный»);
КонецЕсли;
СчетXML.Значение=Счет.Наименование;
Иначе
Если Счет.ПринадлежитГруппе(Родитель)=1 Тогда
СубсчетXML=СчетXML.СоздатьПодчиненныйЭлемент(«Субсчет»);
СубсчетXML.УстановитьАтрибут(«Код», Счет.Код);
// аналогично устанавливаем все атрибуты на элемент СубсчетXML
СубсчетXML.Значение=Счет.Наименование;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Корень.Записать(КаталогПрограммы()+»plan.xml»);
КонецПроцедуры
В результате будет получен файл, фрагмент которого представлен на следующем рисунке.
А теперь приведем код для импорта плана счетов из xml-файла в новую конфигурацию. Код модуля соответствующей обработки должен содержать процедуру Выполнить(), которая имеет такой вид.
Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+»v7plus.dll»)<>1 Тогда
Предупреждение(«Внешняя компонента не найдена»);
Возврат;
КонецЕсли;
Анализатор=СоздатьОбъект(«AddIn.XMLParser»);
Файл=Анализатор.СоздатьДокумент();
Файл.Загрузить(КаталогПрограммы()+»plan.xml»);
План=Файл.ВыбратьУзел(«ПланСчетов»);
кол=План.КоличествоПодчиненных();
Счет=СоздатьОбъект(«Счет.Основной»);
Для инд=1 по кол Цикл
СчетXML=План.ПолучитьПодчиненныйПоНомеру(инд);
КолСубсчетов=СчетXML.КоличествоПодчиненных();
// подчиненным элементом является и содержимое элемента
Если КолСубсчетов>1 Тогда
Счет.Новый(1);
Иначе
Счет.Новый(0);
КонецЕсли;
Счет.Код=СчетXML.ПолучитьАтрибут(«Код»);
Счет.Наименование=СчетXML.Значение;
Счет.Валютный=СчетXML.ПолучитьАтрибут(«Валютный»);
Счет.Количественный=СчетXML.ПолучитьАтрибут(«Количественный»);
Счет.Забалансовый=СчетXML.ПолучитьАтрибут(«Забалансовый»);
Если СчетXML.ПолучитьАтрибут(«вид»)=»активный» Тогда
Счет.Активный=1;
ИначеЕсли СчетXML.ПолучитьАтрибут(«вид»)=»пассивный» Тогда
Счет.Активный=2;
Иначе
Счет.Активный=3;
КонецЕсли;
Счет.Записать();
Если КолСубсчетов>1 Тогда
Счет1=СоздатьОбъект(«Счет.Основной»);
Для инд1=2 По кол_субсчетов Цикл
Субсчет=СчетXML.ПолучитьПодчиненныйПоНомеру(инд1);
Счет1.Новый(0);
Счет1.Код=Субсчет.ПолучитьАтрибут(«Код»);
// аналогично устанавливаются все атрибуты создаваемого субсчета
Счет1.Записать();
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
****************************************************************************
<?xml version=»1.0″ encoding=»windows-1251″?>
<XML_Root>
<Document_Root Наименование=»Заглушка» Адрес=»» Контрагент_Nrec=»0000000000000009h» ИНН=»0000000000000″ КПП=»»>
</Document_Root>
<Document_Root Наименование=»Пенсионный фонд» Адрес=»» Контрагент_Nrec=»0000000000000009h» ИНН=»0000000000000″ КПП=»»>
<Sp_Root Банк=»Сбербанк России ОАО» БИК=»044525225″ РасчетныйСчет=»0000000000000000000″/>
</Document_Root>
<Sp_Root Банк=»Ленинградский ф-л АКБ МИнБа г.Москва» БИК=»044583415″ РасчетныйСчет=»0000000000000000″/>
<Sp_Root Банк=»Ленинградский ф-л АКБ МИнБа г.Москва» БИК=»044583415″ РасчетныйСчет=»0000000000000000000″/>
<Sp_Root Банк=»ФАКБ Московский Индустриальный Ленинградский» БИК=»044583415″ РасчетныйСчет=»00000000000000″/>
</Document_Root>
</XML_Root>
****************************************************************************
//***********************************************************************************************************************
//функция проверяет возможность загрузки компоненты
Функция гВнешняяКомпонента_Загрузить(Значение) Экспорт
Состояние(«Загрузка компоненты: «+Значение);
Если ЗагрузитьВнешнююКомпоненту(Значение)=1 Тогда
Возврат(1);
Иначе
Сообщить(«Ошибка при загрузке компоненты: «+Значение,»!»);
Возврат(0);
КонецЕсли;
КонецФункции
//***********************************************************************************************************************
//процедура чтения xlm файла
Процедура ЧитаемФайл()
//имя файла и директория по умолчанию
пИмяФайла = «first.xml»;
пИмяДиректории = «c:\1Cv77\skript\»;
//открываем файл xml
Если ФС.ВыбратьФайл(0,пИмяФайла,пИмяДиректории,»Выберите файл для импорта»,»XML (*.xml)|*.xml»,»*.xml») = 1 Тогда
ПутьКФайлу = СокрЛП(пИмяДиректории)+СокрЛП(пИмяФайла);
сообщить(ПутьКФайлу);
КонецЕсли;
//пытаемся загрузить внешню компоненту разсобора xml
Если гВнешняяКомпонента_Загрузить(«v7plus.dll»)=0 Тогда
Возврат;
КонецЕсли;
//создаем xlm парсер
Анализатор=СоздатьОбъект(«AddIn.XMLParser»);
Файл=Анализатор.СоздатьДокумент();
Файл.Загрузить(ПутьКФайлу);
//читаем корень xml
Корень=Файл.ВыбратьУзел(«XML_Root»);
//цикл по первому уровню с выводом атрибутов
Для i=1 По Корень.КоличествоПодчиненных() Цикл
Узел=Корень.ПолучитьПодчиненныйПоНомеру(i);
Сообщить(«***************************************************************************») ;
Сообщить(Узел.ПолучитьАтрибут(«Наименование»));
Сообщить(Узел.ПолучитьАтрибут(«ИНН»));
Сообщить(Узел.ПолучитьАтрибут(«Контрагент_Nrec»));
//цикл по подуровню с выводом атрибутов
Для j=1 По Узел.КоличествоПодчиненных() Цикл
ПодУзел = Узел.ПолучитьПодчиненныйПоНомеру(j);
Сообщить(«*********спецификация*****************») ;
Сообщить(ПодУзел.ПолучитьАтрибут(«Банк»));
Сообщить(ПодУзел.ПолучитьАтрибут(«БИК»));
Сообщить(ПодУзел.ПолучитьАтрибут(«РасчетныйСчет»));
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Парсер XML файла позволяет выгружать требуемую информацию с XML файла любой сложности и вложенности. Вы сможете не только выгрузить все данные, но и при необходимости проанализировать структуру уже имеющегося файла и собрать только те данные, которые вам нужны.
Собранные парсером данные можно сохранить как в Excel, так и в другой XML-файл. Также возможна доработка функционала парсера под вашу задачу.
Как это работает?
Вариант №1 — потоковый
Часто XML-файл с актуальной информацией о товарах размещают на сайте. Информация в него подается в потоковом формате и обновляется в режиме онлайн. Как только в магазине меняется информация по наличию или цене товара, она сразу обновляется в XML-файле. В данном случае на вход парсеру подается ссылка на расположение XML-файла на сайте-источнике.
Вариант №2 — статичный/
В этом случае вам нужно только загрузить XML-файл с вашего компьютера и скачать из него нужные данные с помощью парсера. Отличие этого метода от предыдущего лишь в том, что XML-файл остается статичным и не обновляется.
Отправить заявку на парсинг XML-файла
Как используется парсер XML
Парсер XML-файлов позволяет собирать:
- Актуальную информацию по ценам и остаткам товарного ассортимента. Парсер с необходимой периодичностью проверяет XML-файл и выгружает информацию в нужном вам формате.
- Данные о ставках букмекерских контор, так как информация в них подается в потоковом режиме. Вы сможете выгрузить самые свежие данные о ставках.
- Актуальную информацию о горящих турах, авиабилетах, свободных номерах в отелях и т. д. Так как API многих сервисов поддерживают выгрузку в XML-формате.