Addin xmlparser

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-формате.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *