Имя: Пароль:
1C
1С v8
Фабрика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