|
Разбор 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
|
Спасибо всем отозвавшимся проверка по имени элемента решила проблему
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |