Имя: Пароль:
1C
1С v8
Чтение 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
Всё нормально работает.

Вот скриншот:
http://s45.radikal.ru/i107/1205/45/0032fb60b172.png
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) спасибо еще раз
AdBlock убивает бесплатный контент. 1Сергей