Имя: Пароль:
1C
1С v8
Загрузка из XML
0 thomY100
 
29.11.11
10:29
Добрый день, есть такой вопрос, выгружаю данные из базы в XML следующим образом:

ЗаписьXML.ЗаписатьНачалоЭлемента("Организация");
ЗаписатьXML(ЗаписьXML, Организация.ПолучитьОбъект());
       
Пока Выборка.Следующий() Цикл
       
ОбработкаПрерыванияПользователя();
       
ЗаписьXML.ЗаписатьНачалоЭлемента("Строка");
ЗаписатьXML(ЗаписьXML, "Строка");
       
ЗаписьXML.ЗаписатьНачалоЭлемента("ФизЛицо");
ЗаписатьXML(ЗаписьXML, Выборка.ФизЛицо.ПолучитьОбъект());
ЗаписьXML.ЗаписатьКонецЭлемента();
       
       ЗаписьXML.ЗаписатьНачалоЭлемента("ПодразделениеОрганизации");
ЗаписатьXML(ЗаписьXML,Выборка.ПодразделениеОрганизации.ПолучитьОбъект());
ЗаписьXML.ЗаписатьКонецЭлемента();

КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента();

Выгружается результат запроса и вроде бы нормально выгружается, теперь нужно загрузить в другой базе эти данные в документ, делаю так

ЧтениеXML.Прочитать();

Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
   ЗаписанноеЗначение = ПрочитатьXML(ЧтениеXML);
КонецЦикла;

Но в цикле читается только корневой элемент, подскажите пожалуйста как прочитать все элементы с учетом иерархии?
1 rutony
 
29.11.11
10:36
(0) Метод Прочитать(); читает узел, его нужно вызывать Н-раз пока не кончиться файл

что то наподобие:

Пока Файл.Прочитать() Цикл

// тут проверяешь что за узел прочитан и нужно ли что то делать

КонецЦикла;
2 andrewks
 
29.11.11
10:39
Функция ВывестиЭлем(ХМЛ,Знач Смещ);
   
   Рез=1;
   Попытка
       Пока ХМЛ.Прочитать() Цикл
           ТипУзла=ХМЛ.ТипУзла;
           Если (ТипУзла=ТипУзлаXML.НачалоЭлемента) Тогда
               Смещ=Смещ+"    ";
               Сообщить(Смещ+"Элемент "+ХМЛ.Имя+":",СтатусСообщения.Важное);
               
               Пока (ХМЛ.ПрочитатьАтрибут()) Цикл
                   Сообщить(Смещ+"Атрибут: "+ХМЛ.Имя+", значение: <"+ХМЛ.Значение+">");
               КонецЦикла;
           ИначеЕсли (ТипУзла=ТипУзлаXML.КонецЭлемента) Тогда
               Смещ=Лев(Смещ,СтрДлина(Смещ)-4);
           ИначеЕсли (ТипУзла=ТипУзлаXML.Текст) Тогда
               Сообщить(Смещ+"Текст элемента: <"+ХМЛ.Значение+">");
           ИначеЕсли (ТипУзла=ТипУзлаXML.СекцияCDATA) Тогда
               Сообщить(Смещ+"CDATA: <"+ХМЛ.Значение+">");
           ИначеЕсли (ТипУзла=ТипУзлаXML.Комментарий) Тогда
               Сообщить(Смещ+"Комментарий: <"+ХМЛ.Значение+">",СтатусСообщения.Информация);
           Иначе
               Сообщить(Смещ+"Элемент "+ХМЛ.Имя+":");
               Сообщить(Смещ+"Тип: "+ХМЛ.Значение);
           КонецЕсли;
           
       КонецЦикла;
       
   Исключение
       Сообщить(ОписаниеОшибки());
       Рез=0;
   КонецПопытки;
   
   Возврат Рез;
КонецФункции


ХМЛ=Новый ЧтениеXML;
   ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЧтенияXML(,,,ТипПроверкиXML.НетПроверки));
   ВывестиЭлем(ХМЛ,"");
   ХМЛ.Закрыть();
   ХМЛ=Неопределено;
3 thomY100
 
29.11.11
10:50
а в какой момент мне получать ссылки на элементы?
я так понимаю их возвращает только метод ПрочитатьXML
Основная теорема систематики: Новые системы плодят новые проблемы.