| 
    
        
     
     | 
    
  | 
Фабрика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  | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |