|
ФабрикаXDTO, вопросы | ☑ | ||
---|---|---|---|---|
0
hawksib
07.08.17
✎
08:21
|
Собственно, т.к. материал на просторах интернета есть, но некоторые вопросы в той или иной мере не разобраны, а синтаксис-помощник, имхо, дает противоречивую, не соответствующую реальному поведению картину, хотел бы у знатоков уточнить несколько вопросов (за "тупость" вопросов строго не ругайте, тема для меня новая):
я так понял, что при создании объектаXDTO значения свойств объекта будут не определены до тех пор, пока объект не будет "инициализирован" Как правильно инициализировать объект? понятно, что в рекурсии, но почему конструкция ФабрикаXD.Создать("http://www.w3.org/2001/XMLSchema", "string") возвращает Неопределено, как определить тип объекта, описанного примитивным типом. |
|||
1
Ёпрст
07.08.17
✎
08:34
|
||||
2
hawksib
07.08.17
✎
09:23
|
(1) что-то стало яснее, но в целом, вопрос не снимается
|
|||
3
hawksib
07.08.17
✎
11:00
|
всё-таки, концептуальный вопрос: если ФабрикаXD.Создать() возвращает объектXDTO, его свойства всегда не определены, как его правильно инициализировать, что бы через точку обращаться к свойствам вложенных объектов?
как определить тип значения свойств с примитивными типами, верно ли что нужно сравнивать базовый тип свойства с пространством имен http://www.w3.org/2001/XMLSchema |
|||
4
тарам пам пам
07.08.17
✎
11:50
|
(3) для примитивных типов можно писать в лоб:
ОбъектХДТО.ЧисловойРеквизит = 5; Для сложных типов как-то так: ЗначениеСложногоТипа = ФабрикаХДТО.Создать(ФабрикаХДТО.Тип("ОченнаСложныйТип")); ЗначениеСложногоТипа.Реквизит1 = "бла бла бла"; ЗначениеСложногоТипа.Реквизит2 = 5; ОбъектХДТО.СложныйРеквизит = ЗначениеСложногоТипа; За точный синтаксис не ручаюсь, писал по памяти. |
|||
5
hawksib
08.08.17
✎
04:54
|
как фабрика xdto десериализует xml? у меня есть xml-ка следующего вида:
<?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header/> <env:Body> <receiveApplicationResultResponse xmlns="http://api.vetrf.ru/schema/cdm/application/ws-definitions"> <application xmlns="http://api.vetrf.ru/schema/cdm/application"> <applicationId>ffea66a5-bca0-448d-8162-8e7abf054b2d</applicationId> <status>REJECTED</status> <serviceId>mercury-g2b.service</serviceId> <issuerId>fcde4961-218a-11e2-a69b-b499babae7ea</issuerId> <issueDate>2017-08-08T08:49:20.000+03:00</issueDate> <rcvDate>2017-08-08T04:49:24.000+03:00</rcvDate> <prdcRsltDate>2017-08-08T04:49:24.000+03:00</prdcRsltDate> <errors> <apl:error code="APLM0007" xmlns:apl="http://api.vetrf.ru/schema/cdm/application">Wrong application data format. Format validation failed due to XML Schema rules: Missing Attribute 'count'</apl:error> </errors> </application> </receiveApplicationResultResponse> </env:Body> </env:Envelope> если засунуть её в функцию ФабрикаXDTO.ПрочитатьXML, то через точку могу получить только код ошибки ОтветDO.Body.receiveApplicationResultResponse.application.errors.error.code, а вот сообщение, т.е. текст как нужно получать? |
|||
6
hawksib
08.08.17
✎
07:29
|
а когда каждый узел обхожу чтением xml не могу получить поле code
|
|||
7
hawksib
08.08.17
✎
07:38
|
(6) с атрибутом разобрался
Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда Пока ЧтениеXML.ПрочитатьАтрибут() Цикл Сообщить(ЧтениеXML); КонецЦикла КонецЕсли; но как десериализовать чтение, что бы получить текст элемента, не понимаю, получаю только значение атрибута, хоть свою функцию пиши |
|||
8
hawksib
08.08.17
✎
08:23
|
когда создаю объект фабрики вижу, что у него полей больше, чем описано типе объектов пакета xdto, откуда эти поля берутся?
|
|||
9
hawksib
08.08.17
✎
10:03
|
(5) + (6) и (8) актуально
|
|||
10
hawksib
09.08.17
✎
07:36
|
up
|
|||
11
hawksib
09.08.17
✎
10:32
|
переписал функцию заполнения объектов фабрики, сделал так (что бы добавлялись только нужные поля)
&НаСервере Процедура ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO, тСоответствие) Для Каждого Эл Из тСоответствие Цикл ЛевоеИмяПоля = ?(Найти(Эл.Ключ, "/") <> 0, Лев(Эл.Ключ, Найти(Эл.Ключ, "/")-1), Эл.Ключ); ПравыеИменаПолей = Прав(Эл.Ключ, СтрДлина(Эл.Ключ) - Найти(Эл.Ключ, "/")); Если ЛевоеИмяПоля = ПравыеИменаПолей Тогда Если ТипЗнч(ОбъектXDTO[ЛевоеИмяПоля]) = Тип("СписокXDTO") Тогда ОбъектXDTO[ЛевоеИмяПоля].Добавить(Эл.Значение); Иначе ОбъектXDTO[ЛевоеИмяПоля] = Эл.Значение; КонецЕсли; Иначе ОбъектXDTO[ЛевоеИмяПоля] = ФабрикаXD.Создать(ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.URIПространстваИмен, ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.Имя); ИменаПолей = Новый Соответствие; ИменаПолей.Вставить(ПравыеИменаПолей, Эл.Значение); ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO[ЛевоеИмяПоля], ИменаПолей); КонецЕсли; КонецЦикла; КонецПроцедуры // ЗаполнитьСвойстваОбъектаXDTOрек после того, как записываю xml в файл, вижу, что структура xml отличается, от структуры, которая ещё была в отладке в объектеXDTO, кто-нибудь может подсказать? |
|||
12
hawksib
09.08.17
✎
10:37
|
во все ветки дерева положил по 1 элементу, хотя в отладке смотрю, всё заполнено корректно
|
|||
13
hawksib
09.08.17
✎
11:02
|
блин, естественно, если поле инициализировано, объект фабрики больше создавать не нужно
|
|||
14
hawksib
09.08.17
✎
11:03
|
примерно так получилось
&НаСервере Процедура ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO, тСоответствие) Для Каждого Эл Из тСоответствие Цикл ЛевоеИмяПоля = ?(Найти(Эл.Ключ, "/") <> 0, Лев(Эл.Ключ, Найти(Эл.Ключ, "/")-1), Эл.Ключ); ПравыеИменаПолей = Прав(Эл.Ключ, СтрДлина(Эл.Ключ) - Найти(Эл.Ключ, "/")); Если ЛевоеИмяПоля = ПравыеИменаПолей Тогда Если ТипЗнч(ОбъектXDTO[ЛевоеИмяПоля]) = Тип("СписокXDTO") Тогда ОбъектXDTO[ЛевоеИмяПоля].Добавить(Эл.Значение); Иначе ОбъектXDTO[ЛевоеИмяПоля] = Эл.Значение; КонецЕсли; Иначе Если ОбъектXDTO[ЛевоеИмяПоля] = Неопределено Тогда ОбъектXDTO[ЛевоеИмяПоля] = ФабрикаXD.Создать(ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.URIПространстваИмен, ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.Имя); КонецЕсли; ИменаПолей = Новый Соответствие; ИменаПолей.Вставить(ПравыеИменаПолей, Эл.Значение); ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO[ЛевоеИмяПоля], ИменаПолей); КонецЕсли; КонецЦикла; КонецПроцедуры // ЗаполнитьСвойстваОбъектаXDTOрек |
|||
15
hawksib
16.08.17
✎
04:47
|
up, поделитесь кто-нибудь опытом по (5) сообщению, кто что знает / думает
|
|||
16
big
16.08.17
✎
06:27
|
По-моему лучше на тематическом форуме спросить. Народ весьма активно тему обсуждает.
http://www.fsvps.ru/vetrf-forum/posts/list/6955.page |
|||
17
hawksib
16.08.17
✎
06:31
|
(16) как раз на нем моё последнее сообщение, ладно, попробую там ещё уточнить
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |