Имя: Пароль:
1C
1С v8
Чтение/ЗаписьXML, проблема с десериализацией простых типов
, , ,
0 andrewks
 
17.08.12
23:40
вот, к примеру, тестовый код:



   ТэгНастроек="Настройки";
   
   ЗаписьНастроек=Новый ЗаписьXML;
   ЗаписьНастроек.УстановитьСтроку();
   ЗаписьНастроек.ЗаписатьОбъявлениеXML();
   ЗаписьНастроек.ЗаписатьНачалоЭлемента(ТэгНастроек);
   
   ЗаписьНастроек.ЗаписатьНачалоЭлемента("Наименование");
   ЗаписатьXML(ЗаписьНастроек,"Здесь наименование");
   ЗаписьНастроек.ЗаписатьКонецЭлемента();
   
   ЗаписьНастроек.ЗаписатьКонецЭлемента();
   
   СтрокаНастроек=ЗаписьНастроек.Закрыть();
   
   ЧтениеНастроек=Новый ЧтениеXML;
   ЧтениеНастроек.УстановитьСтроку(СтрокаНастроек);
   Сообщить(СтрокаНастроек);
   
   ВошлиВНастройки=Ложь;
   Пока ЧтениеНастроек.Прочитать() Цикл
       ТипУзла=ЧтениеНастроек.ТипУзла;
       Если (ТипУзла=ТипУзлаXML.НачалоЭлемента) Тогда
           Сообщить(ЧтениеНастроек.Имя+"  "+ТипУзла);
           Если ВошлиВНастройки Тогда
               ИмяПоля=ЧтениеНастроек.Имя;
               ЗначениеПоля=ПрочитатьXML(ЧтениеНастроек);
               Сообщить(ИмяПоля+" = "+ЗначениеПоля);
           Иначе
               Если (ЧтениеНастроек.Имя=ТэгНастроек) Тогда
                   ВошлиВНастройки=Истина;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   
   ЧтениеНастроек.Закрыть();



при попытке выполнения ПрочитатьXML вываливается ошибка: "Значения данного типа не могут быть представлены в XML"

хмл формируется корректно:

<?xml version="1.0"?>
<Настройки>
   <Наименование>
       <string>Здесь наименование</string>
   </Наименование>
</Настройки>

но чтение значения не отрабатывает, как надо

вопрос: почему?
1 andrewks
 
17.08.12
23:50
при явном указании типа ПрочитатьXML  - то же самое.

меня ломает разбирать тип и значение самому. где собака порылась?
2 H A D G E H O G s
 
17.08.12
23:51
Типхмл=ПолучитьXMLТип(ЧтениеНастроек);
3 H A D G E H O G s
 
17.08.12
23:51
Типхмл.ИмяТипа = "Наименование"

Странный такой тип
4 andrewks
 
17.08.12
23:53
опять происки Бори Нуралиева?
5 H A D G E H O G s
 
17.08.12
23:53
Думаю, надо установить контект пространств имен
6 H A D G E H O G s
 
17.08.12
23:54
(4) Думаю, нет
7 H A D G E H O G s
 
17.08.12
23:54
Счаст доковыряю.
8 H A D G E H O G s
 
17.08.12
23:55
Используем силу глобального поиска по типовым УПП!
9 andrewks
 
17.08.12
23:55
ппц, чтобы корректно прочитать значение, нужно самому войти в следующий тэг - который с именем типа. ну не маразм ли? как это по-одинесовски...
10 H A D G E H O G s
 
17.08.12
23:55
Победил?
11 andrewks
 
17.08.12
23:56
вот примерно так:


   ВошлиВНастройки=Ложь;
   Пока ЧтениеНастроек.Прочитать() Цикл
       ТипУзла=ЧтениеНастроек.ТипУзла;
       Если (ТипУзла=ТипУзлаXML.НачалоЭлемента) Тогда
           Сообщить(ЧтениеНастроек.Имя+"  "+ТипУзла);
           Если ВошлиВНастройки Тогда
               ИмяПоля=ЧтениеНастроек.Имя;
               Если ЧтениеНастроек.Прочитать() Тогда
                   ЗначениеПоля=ПрочитатьXML(ЧтениеНастроек,Тип("Строка"));
               КонецЕсли;
               Сообщить(ИмяПоля+" = "+ЗначениеПоля);
           Иначе
               Если (ЧтениеНастроек.Имя=ТэгНастроек) Тогда
                   ВошлиВНастройки=Истина;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;



но я с этим не согласен, это феерическая чушь
12 andrewks
 
17.08.12
23:56
+(11) тип, конечно, указывать не обязательно
13 H A D G E H O G s
 
17.08.12
23:58
Ну почему же
14 andrewks
 
17.08.12
23:59
(13) потому, что нет зеркального отражения между действиями ЗаписатьXML и ПрочитатьXML
15 H A D G E H O G s
 
17.08.12
23:59
<Настройки> 1-ый узел
   <Наименование> 2-ой узел
       <string>  3- ий узел
16 H A D G E H O G s
 
18.08.12
00:00
(14) Ну ему же надо сохранить тип значения.
17 andrewks
 
18.08.12
00:00
(15)

итак, пишем:

сами пишем 1-й узел
сами пишем 2-й узел
потом вызываем ЗаписатьXML - 3-й узел она пишет _сама_

так какого хрена я за неё должен потом _сам_ читать тэг_ который писала _она_, и считать должна _сама_ ?
18 H A D G E H O G s
 
18.08.12
00:01
(17) Нуууу. Она подстраховывает тебя
19 H A D G E H O G s
 
18.08.12
00:01
20 andrewks
 
18.08.12
00:03
(19) сенкс, в следующий раз попробую его. щас уже лень переписывать, почти закончил уже
21 andrewks
 
18.08.12
00:06
пришлось написать вспомогалку:


Функция СчитатьЗначениеИзХМЛ(ХМЛ)
   Если ХМЛ.Прочитать() Тогда
       ТипУзла=ХМЛ.ТипУзла;
       Если (ТипУзла=ТипУзлаXML.НачалоЭлемента) Тогда
           Возврат ПрочитатьXML(ХМЛ);
       КонецЕсли;
   КонецЕсли;
   
КонецФункции