Имя: Пароль:
1C
1С v8
Разбор XML
0 Dmitriy_White
 
12.02.12
23:11
Чувствую что проблема банальна и решение на поверхности, но все никак не получается.
Есть такой xml файл:
[code]<?xml version="1.0" encoding="windows-1251"?>
<Товары>
 <Элемент Код="z000758" Наименование="Ветпрепараты" ЭтоГруппа="1"/>
 <Элемент Код="z000440" Наименование="Аквариумные лекарства,препараты" ЭтоГруппа="1" Группа="z000758"/>
 <Элемент Код="z005608" Наименование="Аква-Медика м/у 15г 1*50 препарат" БазоваяЕдиница="шт" ВидНоменклатуры="Товар (пр. ТМЦ)" ПолнНаименование="Аква-Медика м/у 15г 1*50 препарат" ШК="2000000056081" НДС="18%" Страна="" Группа="z000440"/>
 <Элемент Код="z004036" Наименование="Аквамин Флора-6 (0,5 кг)" БазоваяЕдиница="шт" ВидНоменклатуры="Товар (пр. ТМЦ)" ПолнНаименование="Аквамин Флора-6 (0,5 кг)" ШК="2000000040363" НДС="18%" Страна="" Группа="z000440"/>
 <Элемент Код="z004037" Наименование="Аквамин Флора-7 (0,5 кг)" БазоваяЕдиница="шт" ВидНоменклатуры="Товар (пр. ТМЦ)" ПолнНаименование="Аквамин Флора-7 (0,5 кг)" ШК="2000000040370" НДС="18%" Страна="" Группа="z000440"/>
 <Элемент Код="z004039" Наименование="Антибак" БазоваяЕдиница="шт" ВидНоменклатуры="Товар (пр. ТМЦ)" ПолнНаименование="Антибак" ШК="2000000040394" НДС="18%" Страна="" Группа="z000440"/>
 <Элемент Код="z004040" Наименование="Антибак-250 6 таб." БазоваяЕдиница="шт" ВидНоменклатуры="Товар (пр. ТМЦ)" ПолнНаименование="Антибак-250 6 таб." ШК="2000000040400" НДС="18%" Страна="" Группа="z000440"/>
 <Элемент Код="z004041" Наименование="Антибак-Про" БазоваяЕдиница="шт" ВидНоменклатуры="Товар (пр. ТМЦ)" ПолнНаименование="Антибак-Про" ШК="2000000040417" НДС="18%" Страна="" Группа="z000440"/>
</Товары>[/code]
В который выгружены данные о товарах из 7.7.
Задача стоит в том, что бы загрузить его в Розницу 2.0. Для этого написал такой код
[code]
Процедура ВыполнитьЗагрузку()            
       Чтение = Новый ЧтениеXML;
       Чтение.ОткрытьФайл("C:\XML\tovar_out.xml");          
       Стр=0;
       Пока Чтение.Прочитать() Цикл
           Стр = Стр + 1;
           Сообщить("!"+Стр);//выводим для проверки при отладке
           Если Чтение.ПолучитьАтрибут("Код")<>"" Тогда
               Код = Чтение.ПолучитьАтрибут("Код");
           Иначе
                Сообщить("Ошибка в строке, пустой код" +  Стр);
           КонецЕсли;
           // и так далее разбор и создание элементов но не в этом суть
       КонецЦикла;
       
       КонецПроцедуры
[/code]
Так вот цикл проходит файл дважды в результате чего данные соответственно задваиваются. Подскажите почему это происходит, а то что-то запутался совсем?
1 asady
 
12.02.12
23:14
(0) проверяй тип элемента - читай толькр начало
2 Гость2
 
12.02.12
23:15
За такую выгрузку за яйца вешают
3 mirosh
 
12.02.12
23:16
(2) себя повесь
4 Гость2
 
12.02.12
23:21
+(2) Уважающий себя прог всегда делает ЕДИНООБРАЗИЕ набора атрибутов идентичных элементов.
5 sda553
 
12.02.12
23:54
(0) по делу. тебе надо перед чтением атрибутов поставить проверку, что то типа
если чтение.типузла=типузлаxml.началоэлемента тогда

у тебя идет задвоение из за того что начало каждого элемента читает, потом конец
6 zak555
 
12.02.12
23:56
понятие "вложенного" узда рассказывать надо ?
7 andrewks
 
12.02.12
23:59
(0) вот тебе примеры чтения:

ДОМ:

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

   ПострДОМ=Новый ПостроительDOM;
   ХМЛ=Новый ЧтениеXML;
   ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЧтенияXML(,,,ТипПроверкиXML.НетПроверки));
   ДОМ=ПострДОМ.Прочитать(ХМЛ);
   
   ВывестиЭлем_ДОМ(ДОМ,"");
   ХМЛ.Закрыть();


не ДОМ:


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

   ХМЛ=Новый ЧтениеXML;
   ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЧтенияXML(,,,ТипПроверкиXML.НетПроверки));
   ВывестиЭлем(ХМЛ,"");
   ХМЛ.Закрыть();
   ХМЛ=Неопределено;
8 Dmitriy_White
 
13.02.12
00:06
Спасибо всем отозвавшимся проверка по имени элемента решила проблему
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.