|
ФабрикаXDTO. Не могу подтянуть типы из схем XSD | ☑ | ||
---|---|---|---|---|
0
Zixxx
30.11.13
✎
14:26
|
По ссылке: http://yadi.sk/d/vct7UKrODZ4wL (1 файл xml и 5 файлов xsd)
Чтение XML осуществляю следующим кодом: [code] ФайлыXSD = Новый Массив(); ФайлыXSD.Добавить("d:\xdto\1.xsd"); ФайлыXSD.Добавить("d:\xdto\2.xsd"); ФайлыXSD.Добавить("d:\xdto\3.xsd"); ФайлыXSD.Добавить("d:\xdto\4.xsd"); ФайлыXSD.Добавить("d:\xdto\5.xsd"); ФабрикаДанных = СоздатьФабрикуXDTO(ФайлыXSD); НовыйЧтение = Новый ЧтениеXML; НовыйЧтение.ОткрытьФайл("d:\xdto\1.xml"); Документ = ФабрикаДанных.ПрочитатьXML(НовыйЧтение, ФабрикаДанных.Тип("http://schemas.xmlsoap.org/soap/envelope/", "Envelope")); [/code] В итоге все значения у меня выходят строковые, грешу на то что не правильно для типа фабрику указал URI и Имя. Но пробовал по разному никак не выходит. Подскажите хлопцы как правильно задать тип для фабрики. |
|||
1
Zixxx
30.11.13
✎
14:27
|
Как-то неправильно URI у меня в первом посте отобразился.
http://schemas.xmlsoap.org/soap/envelope/ |
|||
2
Zixxx
30.11.13
✎
15:32
|
ап
|
|||
3
etc
30.11.13
✎
16:28
|
у тебя в файле нет описания namespce-а?
Попробуй вот так: ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(Файл.ПолноеИмя); ТипXML = ПолучитьXMLТип(ЧтениеXML); Данные = мФабрика.ПрочитатьXML(ЧтениеXML, мФабрика.Тип(ТипXML)); |
|||
4
etc
30.11.13
✎
16:30
|
Если под твой вариант то
ФабрикаДанных = СоздатьФабрикуXDTO(ФайлыXSD); НовыйЧтение = Новый ЧтениеXML; НовыйЧтение.ОткрытьФайл("d:\xdto\1.xml"); ТипXML = ПолучитьXMLТип(НовыйЧтение); Документ = ФабрикаДанных.ПрочитатьXML(НовыйЧтение, ФабрикаДанных.Тип(ТипXML)); |
|||
5
Zixxx
30.11.13
✎
17:53
|
(4) Нет там не так все просто, ФабрикаДанных.Тип(ТипXML) возвращает неопределено. Я так думаю что это из-за того что там неименованные типы.
У меня получается если делать так: ФабрикаДанных.Пакеты[5].КорневыеСвойства[0].Тип Но пакеты по индексу всегда разные, поэтому надо в цикле обходить и смотреть URI, но решение как-то не нравиться |
|||
6
alexei366
30.11.13
✎
18:26
|
(5) Посмотри в СП, там для коллекции пакетов есть метод получить в параметре которого указываешь пространство имен пакета, и без всяких индексов
|
|||
7
alexei366
30.11.13
✎
18:26
|
(5) Ну собственно такой же метод для получения корневого свойства из коллекции имеется
|
|||
8
Zixxx
30.11.13
✎
19:32
|
(7) Спасибо
Дальше пробую тянуть пакеты из конфигурации, следующим кодом: [code] НовыйЧтение = Новый ЧтениеXML; НовыйЧтение.ОткрытьФайл("d:\xdto\1.xml"); ТипXML = ПолучитьXMLТип(НовыйЧтение); Пакет = ФабрикаXDTO.Пакеты.Получить(ТипXML.URIПространстваИмен); Корень = Пакет.КорневыеСвойства.Получить(ТипXML.ИмяТипа); Докумет = ФабрикаXDTO.ПрочитатьXML(НовыйЧтение, Корень.Тип); [/code] Получаю ошибку... Ошибка при вызове метода контекста (ПрочитатьXML) Хотя аналогичный код работает если брать из файлов схемы [code] НовыйЧтение = Новый ЧтениеXML; НовыйЧтение.ОткрытьФайл("d:\xdto\1.xml"); ТипXML = ПолучитьXMLТип(НовыйЧтение); ФайлыXSD = Новый Массив(); ФайлыXSD.Добавить("d:\xdto\1.xsd"); ФайлыXSD.Добавить("d:\xdto\2.xsd"); ФайлыXSD.Добавить("d:\xdto\3.xsd"); ФайлыXSD.Добавить("d:\xdto\4.xsd"); ФайлыXSD.Добавить("d:\xdto\5.xsd"); ФабрикаДанных = СоздатьФабрикуXDTO(ФайлыXSD); ПакетДанных = ФабрикаДанных.Пакеты.Получить(ТипXML.URIПространстваИмен); КорневыеСвойства = ПакетДанных.КорневыеСвойства.Получить(ТипXML.ИмяТипа); Документ = ФабрикаДанных.ПрочитатьXML(НовыйЧтение, КорневыеСвойства.Тип); [/code] Из за чего появляется ошибка в первом варианте, когда пакеты у меня загружены в конфигурацию??? |
|||
9
alexei366
30.11.13
✎
20:17
|
(8) Что за ошибка?
|
|||
10
Apokalipsec
30.11.13
✎
20:26
|
массив совать в СоздатьФабрикуXDTO - это оригинально.
Курите СП. |
|||
11
Zixxx
30.11.13
✎
20:31
|
(10) Работает так...
[code] НовыйЧтение = Новый ЧтениеXML; НовыйЧтение.ОткрытьФайл("d:\xdto\1.xml"); ТипXML = ПолучитьXMLТип(НовыйЧтение); Пакеты = Новый Массив; Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http://schemas.xmlsoap.org/soap/envelope/")); Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http://tempuri.org/")); Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http://mz.gov.kz/form1/v1")); Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http://schemas.datacontract.org/2004/07/MSS.Business.Data.AcReg.ForExternalService")); Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http://schemas.microsoft.com/2003/10/Serialization/Arrays")); ФабрикаДанных = СоздатьФабрикуXDTO(ФайлыXSD); ПакетДанных = ФабрикаДанных.Пакеты.Получить(ТипXML.URIПространстваИмен); КорневыеСвойства = ПакетДанных.КорневыеСвойства.Получить(ТипXML.ИмяТипа); Документ = ФабрикаДанных.ПрочитатьXML(НовыйЧтение, КорневыеСвойства.Тип); [/code] А никак нельзя создать фабрику например по корневому пакету, который бы по директивам импорта подтянул все остальные. Так будет проще, поменяли пакет добавили еще один пакет и код работает. А так придется в коде добавлять в массив еще один пакет, как то не удобно сильно. |
|||
12
Apokalipsec
30.11.13
✎
21:15
|
фабрика предназначена для чтения пакета и создания объекта по заданной схеме, как вы хотите пакеты с разной структурой читать через одну и ту же схему?
Не знаю для чего вы собираетесь это использовать, да и вообще код слегка нечитабелен, поэтому посоветовать ничего не могу. |
|||
13
Zixxx
30.11.13
✎
21:59
|
(12) Нет, ты не правильно понял.
У меня есть 5 пакетов XDTO, с помощью которых я читаю xml. Я не хочу для метода "СоздатьФабрикуXDTO" указывать массив из 5-ти пакетов. Я хочу взять корневой пакет XDTO и чтобы остальные подтянулись по Директивам импорта. Ниже код, там мне приходиться создавать массив и помещать в него 5-ть пакетов. А хочу автоматом взять корневой пакет и создать фабрику... [code] НовыйЧтение = Новый ЧтениеXML; НовыйЧтение.ОткрытьФайл("d:\xdto\1.xml"); ТипXML = ПолучитьXMLТип(НовыйЧтение); Пакеты = Новый Массив; Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http:***")); Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http:***")); Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http:***")); Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http:***")); Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http:***")); ФабрикаДанных = СоздатьФабрикуXDTO(ФайлыXSD); ПакетДанных = ФабрикаДанных.Пакеты.Получить(ТипXML.URIПространстваИмен); КорневыеСвойства = ПакетДанных.КорневыеСвойства.Получить(ТипXML.ИмяТипа); Документ = ФабрикаДанных.ПрочитатьXML(НовыйЧтение, КорневыеСвойства.Тип); [/code] |
|||
14
etc
30.11.13
✎
22:52
|
(13) походу 1С не переваривает такие схемы. Если ты загрузишь схемы в фабрику XDTO и посмотришь получившиеся пакеты то видно что все типы опианы как "Свойства". Например в пакете самого верхнего уровня "http://schemas.xmlsoap.org/soap/envelope/" единственное свойство "Envelope" -> "Body" имеет пустой "Тип", и при попытке выбора даже с условием того что все пакеты загружены не получится, поскольку в других пакетах не описаны "ТипыОбъектов" а только "Свойства".
|
|||
15
etc
30.11.13
✎
22:58
|
+(14) короче правь схемы если есть возможность
|
|||
16
etc
30.11.13
✎
23:14
|
особенно меня последняя 5-я схема удивляет:
<xs:schema xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="string" type="xs:unsignedShort" /> </xs:schema> описываем свойство с именем "string" которое имее тип "unsignedShort". нахуа?. Должно то быть не xs:element а xs:SimpleType или на худой конец xs:ComplexType |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |