|
Не верно считываются данные из XML-документа. | ☑ | ||
---|---|---|---|---|
0
america2013
25.10.13
✎
14:14
|
Рад приветствовать вас, уважаемые форумчане!!!
Прошу помочь с такой проблемой: 1) имею XML-файл (пример, формировал программно ранее его сам): <?xml version="1.0" encoding="UTF-8"?> -<Корневой> <Элемент ПроцентСкидки="0" СуммаСкидки="0" СуммаВсего="600" СуммаНДС="64.29" КодСтавкиНДС="00000009" Сумма="600" Цена="200" Количество="3" КодНоменклатуры="99005724" ДатаЗакрытия="2013-08-28T23:50:00" Номер="А010000591"/> <Элемент ПроцентСкидки="0" СуммаСкидки="0" СуммаВсего="2400" СуммаНДС="257.14" КодСтавкиНДС="00000009" Сумма="2400" Цена="150" Количество="16" КодНоменклатуры="99005725" ДатаЗакрытия="2013-08-28T23:50:00" Номер="А010000591"/> <Элемент ПроцентСкидки="0" СуммаСкидки="0" ... 2) программно пытаюсь считать этот файл таким способом: ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(Путь + ИмяФайлаДляЗагрузки); СЗ = Новый СписокЗначений; //НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент(); Пока ЧтениеXML.Прочитать() Цикл // Реквизит ЧтениеXML.ПрочитатьАтрибут(); Атрибут = ЧтениеXML.Значение; Если ЧтениеXML.Имя = "Номер" Тогда СЗ.Добавить(ЧтениеXML.Значение); КонецЕсли; // Реквизит ЧтениеXML.ПрочитатьАтрибут(); Атрибут = ЧтениеXML.Значение; Если ЧтениеXML.Имя = "ДатаЗакрытия" Тогда СЗ.Добавить(ЧтениеXML.Значение); КонецЕсли; // Реквизит ЧтениеXML.ПрочитатьАтрибут(); Атрибут = ЧтениеXML.Значение; Если ЧтениеXML.Имя = "КодНоменклатуры" Тогда СЗ.Добавить(ЧтениеXML.Значение); КонецЕсли; // Реквизит ЧтениеXML.ПрочитатьАтрибут(); Атрибут = ЧтениеXML.Значение; Если ЧтениеXML.Имя = "Количество" Тогда СЗ.Добавить(ЧтениеXML.Значение); КонецЕсли; ... Если СЗ.Количество() = 11 Тогда СоздатьДокументРеализацияТоваровИзЗакрытияСмены(СЗ); СЗ.Очистить(); КонецЕсли; ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение = ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение + 1; КонецЦикла; 3) при таком считывании при первом прохождении цикла получаю (атрибут КодНоменклатуры) ЧтениеXML.Значение = "99005724" 4) при следующем выполнении цикла, снова получаю это же значение (получаю (атрибут КодНоменклатуры) ЧтениеXML.Значение = "99005724"), хотя в самом файле такое значение повторяется только единожды Итог проблемы: в список значений (СЗ) попадают задвоенные значения. |
|||
1
Ёпрст
25.10.13
✎
14:17
|
Как бэ, код в топку
|
|||
2
america2013
25.10.13
✎
14:21
|
(1) Возможно код и не верный, по каким-то критериям и если не сложно, то прошу, приведите более рациональное решение.
Но почему же при чтении данные считываются по 2 раза? |
|||
3
Ёпрст
25.10.13
✎
14:21
|
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.КоличествоАтрибутов()>0 Цикл Пока ЧтениеXML.ПрочитатьАтрибут()Цикл <имеем атрибуты> КонецЦикла; КонецЕсли; ...... |
|||
4
america2013
25.10.13
✎
14:31
|
(3) Да, предложенный вариант значительно упросил код. Спасибо! Но проблема осталась: ЧтениеXML.Значение считывается по 2 раз, прежде чем перейти к следующему.
|
|||
5
Зойч
25.10.13
✎
14:32
|
Там открытие тега и заккрытие
|
|||
6
america2013
25.10.13
✎
14:36
|
(5) Пожалуйста, поясните, что значит открытие-закрытие?
На данный момент код имеет вид: ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(Путь + ИмяФайлаДляЗагрузки); СЗ = Новый СписокЗначений; //НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент(); Пока ЧтениеXML.Прочитать() Цикл Пока ЧтениеXML.ПрочитатьАтрибут()Цикл СЗ.Добавить(ЧтениеXML.Значение); //Здесь значение считывается 2 раза : ((( КонецЦикла; Если СЗ.Количество() = 11 Тогда СоздатьДокументРеализацияТоваровИзЗакрытияСмены(СЗ); СЗ.Очистить(); КонецЕсли; ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение = ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение + 1; КонецЦикла; |
|||
7
Ёпрст
25.10.13
✎
14:40
|
Зачетный код... и толку от списка значения такого ?
Мот того, структуру лучше завести, или соответствие ? |
|||
8
Ёпрст
25.10.13
✎
14:41
|
как ты потом из списка своего получишь значения ?
Они же в разнобой могут быть.. а не так, как ты ожидаешь. |
|||
9
Ёпрст
25.10.13
✎
14:43
|
ПараметрыОбработки = Новый Соответствие;Пока ЧтениеXML.Прочитать() Цикл
Пока ЧтениеXML.ПрочитатьАтрибут()Цикл ПараметрыОбработки.Вставить(ЧтениеXML.Имя,ЧтениеXML.Значение); КонецЦикла; |
|||
10
Serginio1
25.10.13
✎
14:48
|
Загрузи в тз через v8: Веб-сервис и передача-прием XML и посмотри что у тебя получается
|
|||
11
america2013
25.10.13
✎
14:59
|
(8) Данные из списка (СЗ) потом попадают в разные места. Структура и соответствие использовать можно, но мне привычнее здесь списком. Данные однотипные и в порядке правильности попадания в список нету. Суть не важно, как я храню потом данные, проблема в том, как считать данные...
(9) Испробовал ваш метод: ПараметрыОбработки = Новый Соответствие; Пока ЧтениеXML.Прочитать() Цикл Пока ЧтениеXML.ПрочитатьАтрибут()Цикл ПараметрыОбработки.Вставить(ЧтениеXML.Имя,ЧтениеXML.Значение); //Значения так же считываются 2 раза ((((((((( КонецЦикла; КонецЦикла; (10) Сложно с наскока такое решить. Попробую проще решить проблему. |
|||
12
Ёпрст
25.10.13
✎
15:04
|
(11) Отладчик в рукти и вперёд..
Нам отсюда не видно, что есть в твоём понимании "значения так же считываются 2 раза " |
|||
13
Serginio1
25.10.13
✎
15:19
|
(10) Там подаешь строку на вход и у тебя создается ТаблицаЗначений. В отладчике смотришь что у тебя получилось.
|
|||
14
america2013
25.10.13
✎
15:21
|
(12) и так думаю (13) тоже: именно в отладчике я и вижу, что при первом проходе цикла ЧтениеXML.Значение = "99005724", и при втором проходе этого же значения в расчете отображается "99005724".
|
|||
15
Ёпрст
25.10.13
✎
15:30
|
(14) дай исходный xml
|
|||
16
Ёпрст
25.10.13
✎
15:31
|
И у какого именно атрибута ты смотришь значение ?????
|
|||
17
america2013
25.10.13
✎
15:33
|
(15) Вот часть:
<?xml version="1.0" encoding="UTF-8"?> -<Корневой> <Элемент ПроцентСкидки="0" СуммаСкидки="0" СуммаВсего="600" СуммаНДС="64.29" КодСтавкиНДС="00000009" Сумма="600" Цена="200" Количество="3" КодНоменклатуры="99005724" ДатаЗакрытия="2013-08-28T23:50:00" Номер="А010000591"/> <Элемент ПроцентСкидки="0" СуммаСкидки="0" СуммаВсего="2400" СуммаНДС="257.14" КодСтавкиНДС="00000009" Сумма="2400" Цена="150" Количество="16" КодНоменклатуры="99005725" ДатаЗакрытия="2013-08-28T23:50:00" Номер="А010000591"/> <Элемент ПроцентСкидки="0" СуммаСкидки="0" ... (16) КодНоменклатуры |
|||
18
Serginio1
25.10.13
✎
15:33
|
(14) То есть в Таблице значений в узле появилось две одинаковых строки с одинаковыми значениями?
Ты использовал (10)? |
|||
19
america2013
25.10.13
✎
15:35
|
(18) Выходит, что так... хотя в самом файле такое значение повторяется только 1 раз.
Пример в (10) ещё не использовал. |
|||
20
Ёпрст
25.10.13
✎
15:37
|
(17) и че, для разных ЭЛЕМЕНТОВ в твоём xml не может быть одинакового кода номенклатуры ???
:))))))))))))))))))))))))))))))))))))))))))))))))))) |
|||
21
Ёпрст
25.10.13
✎
15:39
|
и судя по коду, у тебя 1 документ - один товар всегда..
И чего, в разных документах не может быть этой же номенклатуры ? |
|||
22
america2013
25.10.13
✎
15:43
|
(21) Нет, в одном документе может быть несколько товаров. И товары в документах могут повторяться, но как я понял, каждый Элемент считывается по 2 раза, один и тот же номер документа, одна и та же сумма. Если Элементы считываются по порядку, то следующем шагом цикла, я рассчитываю увидеть следующий код номенклатуры.
|
|||
23
George Wheels
25.10.13
✎
15:58
|
При первом ЧтениеXML.Прочитать() читается начало элемента, при втором ЧтениеXML.Прочитать() читается конец элемента, а атрибуты его-же.
В начале цикла сделай проверку: Пока ЧтениеXML.Прочитать() Цикл Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда Продолжить; КонецЕсли; |
|||
24
Ёпрст
25.10.13
✎
16:04
|
(22) У тебя это не так.
|
|||
25
america2013
25.10.13
✎
16:11
|
(24) Великодушно прошу просить моё не знание этого формата и методов с ним работать, но мне не понятно, что именно там не так?
|
|||
26
Serginio1
25.10.13
✎
16:16
|
(10) Ну так используй уже испытанное.
Модифицируй пример из 10 Функция ПрочитатьXMLСтрока(Путь,ИмяФайлаДляЗагрузки) Чтение= новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(Путь + ИмяФайлаДляЗагрузки); и посмотри, что у тебя получается |
|||
27
america2013
25.10.13
✎
16:17
|
(23) Я МЫСЛЕННО НОШУ ВАС НА РУКАХ!!! Ваш метод сделал то, что мне нужно! И что должно быть наверное характерно, это то, что весь процесс стал работать в 2 раза быстрее.
В итоге получилось в моем странном коде: ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(Путь + ИмяФайлаДляЗагрузки); СЗ = Новый СписокЗначений; //НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент(); Пока ЧтениеXML.Прочитать() Цикл Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда Продолжить; КонецЕсли; Пока ЧтениеXML.ПрочитатьАтрибут()Цикл СЗ.Добавить(ЧтениеXML.Значение); КонецЦикла; Если СЗ.Количество() = 11 Тогда СоздатьДокументРеализацияТоваровИзЗакрытияСмены(СЗ); СЗ.Очистить(); КонецЕсли; ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение = ФормаСтатуса.ЭлементыФормы.ЗначениеИндикатора.Значение + 1; КонецЦикла; |
|||
28
america2013
25.10.13
✎
16:17
|
Благодарю всех участников за помощь!!!
|
|||
29
George Wheels
25.10.13
✎
16:18
|
(28) На здоровье.
|
|||
30
Serginio1
25.10.13
✎
16:19
|
(28) Да а стоило всего применить код из 10
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |