В преддверии Новогодних праздников захотелось порадовать наше уважаемое сообщество, поэтому и родилась данная статья.
Тема неслучайна и возникла после того как столкнулся сам с такой задачей.
Пропагандируется, что XML-стандарт является наиболее быстрым и универсальным для обмена данными.
Универсальные загрузчики в 1С требуют схемы таких файлов. Приведенные примеры и обработки работают с файлами только несложной структуры и если файл имеет вложенность более 2х уровней, обработка отказывается с ней работать. А наличие в примерах документации несуществующих в компоненте v7plus команд может ввести в заблуждение не только новичка, но и опытного одноэснега.
Лично для меня это была тривиальная задача. Это напоминает мне разбор текстовых файлов с разделителями. Оооочень щепетильная и трудоемкая работа как на меня, и на решение у меня ушло почти 2 недели…
Итак, исходные данные – задачка с 2-мя неизвестными: Х – это содержащиеся в xml-файле данные, Y – это структура файла.
Принципиально отказываюсь от DOM-объекта и использую ПоследовательноСчитываемыйДокумент с его довольно скудным набором команд.
Загрузив внешнюю компоненту, создадим экземпляр «ПоследовательноСчитываемыйДокумент» и начнем с ним работать:
гФайл = ХМЛАнализатор.СоздатьПоследовательноСчитываемыйДокумент();
гФайл.СвязатьСФайлом(ИмяВыбрФайла);
номУр=1;
ТипТега = гФайл.Спуститься();
Пока ТипТега <> 4 Цикл // пока не достигнут конец файла
ПрочитатьДерево(ТипТега,гФайл);
Если ТипТега=4 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
В теле цикла мы должны прочитать вложенную структуру узла.
Это выполним при помощи процедуры «ПрочитатьДерево»:
Если ВложТег>0 Тогда
Уровней=КвоУровнейХМЛ(ВложТег,гФайл);
штрих="--";
Если ВложТег<3 Тогда
//первый полученный элемент
Сообщить(""+штрих+"<ИмяТега>="+гФайл.СвойстваТекущегоУзла.Имя+" Уровень="+гФайл.СвойстваТекущегоУзла.Уровень);
Если гФайл.СвойстваТекущегоУзла.КоличествоАтрибутов>0 Тогда
КвоАтрибутов= гФайл.СвойстваТекущегоУзла.КоличествоАтрибутов;
Для а=0 по КвоАтрибутов-1 Цикл
Сообщить(""+гФайл.СвойстваТекущегоУзла.НаименованиеАтрибута(а)+"="+гФайл.СвойстваТекущегоУзла.ЗначениеАтрибута(а));
КонецЦикла;
КонецЕсли;
Сообщить("11111111111111111");
КонецЕсли;
Если ВложТег =3 Тогда
//последующие вложенные элементы на текущем уровне
ВложТег=гФайл.Следующий();
Если ВложТег<3 Тогда
штрих=штрих+"--";
Сообщить(""+штрих+"<ИмяТега>="+гФайл.СвойстваТекущегоУзла.Имя+" Уровень="+гФайл.СвойстваТекущегоУзла.Уровень);
Если гФайл.СвойстваТекущегоУзла.КоличествоАтрибутов>0 Тогда
КвоАтрибутов= гФайл.СвойстваТекущегоУзла.КоличествоАтрибутов;
Для а=0 по КвоАтрибутов-1 Цикл
Сообщить(""+штрих+"<Аттр>="+гФайл.СвойстваТекущегоУзла.НаименованиеАтрибута(а)+"="+гФайл.СвойстваТекущегоУзла.ЗначениеАтрибута(а));
КонецЦикла;
КонецЕсли;
Сообщить("**********************");
КонецЕсли;
КонецЕсли;
КонецЕсли;
Данная процедура использует функцию «КвоУровнейХМЛ», которая позволяет прочитать вложенность узла в полной мере:
Если ур>0 Тогда
Если ур =1 Тогда
ур=гФайл.Спуститься();
Если ур<3 Тогда
номУр=гФайл.СвойстваТекущегоУзла.Уровень;
КонецЕсли;
КонецЕсли;
Возврат номУр;
КонецЕсли;
Таким образом у нас получилась [необходимо зарегистрироваться для просмотра ссылки] (надеюсь) обработка для чтения хмл-файла. Дальше можете для работы с результатом делать все, что вам удобно: занести эти данные в СписокЗначений, в ТаблицуЗначений либо эти оба варианта одновременно.
Спасибо за внимание. (чуть позже выложу саму обработку)
С уважением, Кузьмич.
И с наступающим НГ!
Сообщение отредактировал Acid - 27.01.11, 18:53