|
Чтение XML | ☑ | ||
---|---|---|---|---|
0
ХочуСпец
21.05.12
✎
14:43
|
В файле XML есть три раздела:
Workers Materials Machines Необходимо прочитать данные только из раздела Workers Но попадают строки из раздела Machines Что делаю не так? ЧтениеXML=Новый ЧтениеXML(); ЧтениеXML.ОткрытьФайл(СокрЛП(ИмяФайлаXML)); ТекущаяГруппаРесурсов = ""; НачатьТранзакцию(); Пока ЧтениеXML.Прочитать() цикл ОбработкапрерыванияПользователя(); Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И (ЧтениеXML.Имя = "Materials" ИЛИ ЧтениеXML.Имя = "Machines") тогда ЧтениеXML.Пропустить(); КонецЕсли; Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Elem" тогда Наименование = ""; Код = ""; ЕдиницаИзмерения = ""; Цена = 0; Для Кнт = 0 по ЧтениеXML.КоличествоАтрибутов() - 1 цикл ИмяАтрибута = ЧтениеXML.ЛокальноеИмяАтрибута(Кнт); ЗначениеАтрибута = ЧтениеXML.ПолучитьАтрибут(Кнт); Если ИмяАтрибута = "Caption" тогда Наименование = ЗначениеАтрибута; ИначеЕсли ИмяАтрибута = "Code" тогда Код = ЗначениеАтрибута; ИначеЕсли ИмяАтрибута = "Units" тогда ЕдиницаИзмерения = ЗначениеАтрибута; ИначеЕсли ИмяАтрибута = "PriceCE" тогда Цена = Число(ЗначениеАтрибута); КонецЕсли; КонецЦикла; Если Код <> "" тогда НоваяСтрока = ТЗРаботыИзЦенника.Добавить(); НоваяСтрока.Код = Код; НоваяСтрока.Наименование = Наименование; НоваяСтрока.ЕдИзм = ЕдиницаИзмерения; НоваяСтрока.Цена = Цена; НоваяСтрока.БлижайшаяГруппаНаименование = БлижайшаяГруппаНаименованиеРаботы; НоваяСтрока.БлижайшаяГруппаКод = БлижайшаяГруппаКодРаботы; КонецЕсли; КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); ЧтениеXML.Закрыть(); |
|||
1
Vladal
21.05.12
✎
14:45
|
А эти разделы линейно лежат, т.е.
Workers begin / Workers end Materials begin / Materials end Machines begin / Machines end Или это всё табличная часть? |
|||
2
Dmitriy_76
21.05.12
✎
14:46
|
структуру файла покажи
|
|||
3
andrewks
21.05.12
✎
14:46
|
(0) выкладывай xml на zalil.ru
|
|||
4
Vladal
21.05.12
✎
14:47
|
(2) угу.
+ поставь отладчик на строчку Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И |
|||
5
ХочуСпец
21.05.12
✎
14:48
|
<?xml version="1.0" encoding="windows-1251"?>
<Document ProgramVersion="5.4.4.1801" Generator="GrandSmeta" DocumentType="{2B0470FD-477C-4359-9F34-EEBE36B7D348}" DateBase="01.01.2000" DateCurr="25.03.2011"><DbInfo> <Document Caption="Ценник ГС_07-05-2012"/> <Object Caption="ОБЪЕКТ"/> <Construction Caption="Рабочая"/> </DbInfo> <Workers> <Folder Caption="01. Земляные работы"> <Elem Caption="Зарплата" Code="С-1.1" Units="чел.час" Mass="0,6" PriceCE="166,67" PriceBE="100" PriceBaseComment="шт" PriceCurrComment="Срубка оголовков свай"/> </Folder> </Workers> <Materials> <Folder Caption="01.02.02. Цемент"> <Elem Caption="Цемент" Code="1.2.2-1" Units="кг" PriceCE="4,45"/> </Folder> </Materials> <Machines> <Elem Caption="Кран автомобильный г/п 14т КС-3577" Code="М-6" Units="маш.час" PriceCE="1250"/> </Machines> </Document> |
|||
6
sapphire
21.05.12
✎
14:51
|
Кури XPath
|
|||
7
ХочуСпец
21.05.12
✎
14:53
|
(6) где ошибка в коде?
|
|||
8
proger2011
21.05.12
✎
14:55
|
(7) Не суетись... Щас тебе ктонить напишет правильный код... У тебя там сплошная ошибка...
|
|||
9
Vladal
21.05.12
✎
14:59
|
{Форма.Форма(12)}: Ошибка при вызове метода контекста (Прочитать): Ошибка разбора XML: - [1,1]
Фатальная ошибка: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (е) of a 2-byte sequence. SystemId: file://c:/1.xml Пока ЧтениеXML.Прочитать() цикл |
|||
10
ХочуСпец
21.05.12
✎
15:16
|
(9) весь файл огроменный
а если в коде посмотреть? вроде явных ошибок нет |
|||
11
Vladal
21.05.12
✎
15:18
|
||||
12
Vladal
21.05.12
✎
15:19
|
+(11) Взял твой код и просто сделал обёртку - форму с таблицей значений.
|
|||
13
ХочуСпец
21.05.12
✎
15:21
|
(12) если бы нормально работало ) не писал бы
|
|||
14
Vladal
21.05.12
✎
15:21
|
(13) Давай я тебе скину свою обработку, проверишь на своём БОЛЬШОМ файле?
|
|||
15
Vladal
21.05.12
✎
15:22
|
||||
16
Vladal
21.05.12
✎
15:23
|
(7) и (8) Нет ошибок. Код работает нормально.
|
|||
17
ХочуСпец
21.05.12
✎
15:26
|
(14) скинь пжлст
|
|||
18
ХочуСпец
21.05.12
✎
15:28
|
(15) хорошо проверю, спасибо
|
|||
19
ХочуСпец
21.05.12
✎
15:46
|
ситуация следующая:
Код: Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И (ЧтениеXML.Имя = "Materials" ИЛИ ЧтениеXML.Имя = "Machines") тогда ЧтениеXML.Пропустить(); КонецЕсли; отрабатывает, т.е. пропускается чтение, но по какой то причине при следующей итерации все равно заходит в раздел "Machines" |
|||
20
Широкий
21.05.12
✎
15:50
|
(0)Используй ФабрикуXDTO
|
|||
21
ХочуСпец
21.05.12
✎
15:51
|
(20) некогда разбираться )
|
|||
22
ХочуСпец
21.05.12
✎
15:55
|
Разделы идут в следующей последовательности
Workers Materials Machines Раздел Materials пропускается последний раздел - нет |
|||
23
ХочуСпец
21.05.12
✎
16:11
|
Метод Пропустить() - Пропускает дочерние узлы текущего узла и позиционируется на следующий узел.
Получается, что при Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И (ЧтениеXML.Имя = "Materials" ИЛИ ЧтениеXML.Имя = "Machines") тогда ЧтениеXML.Пропустить(); КонецЕсли; пропускает узел "Materials", но потом позиционируется на узле "Machines". Как сделать так чтобы пропускал и узел "Machines"? |
|||
24
Vladal
21.05.12
✎
16:15
|
(23) Разделить на два условия:
Если ЧтениеXML.Имя = "Materials" тогда ЧтениеXML.Пропустить(); КонецЕсли; Если ЧтениеXML.Имя = "Machines" тогда ЧтениеXML.Пропустить(); КонецЕсли; .... обработка цикла ... Если ЧтениеXML.Имя = "Machines" тогда ЧтениеXML.Пропустить(); КонецЕсли; |
|||
25
ХочуСпец
21.05.12
✎
16:18
|
(24) спасибо еще раз
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |