|   |   | 
| 
 | Как быстро считать файл XML по схеме XSD в таблицу значений? | ☑ | ||
|---|---|---|---|---|
| 0
    
        adelaide 18.06.14✎ 17:31 | 
        Есть поставщик, он по API выдает прайс в XML, я сгенерировал схему файла XSD мне нужно быстро преобразовать этот файл в ТЗ, знаю про способ через ЧтениеXML, но он не самый быстрый имхо:
 Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл(ПутьКФайлу); Пока Чтение.Прочитать() Цикл Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда .... Есть что побыстрее? Собственно вот кусок XML который мне нужно преобразовать в ТЗ: <Price> <product artikul="DCS101" barcode="085854226929" ..... url="" /> .... <product artikul="" barcode="6942941815029" .... url="" /> </Price> | |||
| 1
    
        adelaide 18.06.14✎ 17:34 | 
        можно не в тз, можно в массив сути не меняет, мне просто по схеме надо преобразовать XML в списочный тип 1С.     | |||
| 2
    
        Bober 18.06.14✎ 17:41 | 
        (0) как вариант через документ DOM, там поиск элементов по "product" и считывание-заполнение тз.     | |||
| 3
    
        adelaide 18.06.14✎ 17:42 | 
        Вроде нашел решение:
 СхемаXML = Новый СхемаXML; СхемаXML.РасположениеСхемы = "C:\Users\prog1c\Documents\111\price.xsd"; СхемыXML = Новый НаборСхемXML; СхемыXML.Добавить(СхемаXML); ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.ОткрытьФайл("C:\Users\prog1c\AppData\Local\Temp\6\r.txt"); Фабрика = Новый ФабрикаXDTO(СхемыXML); Данные = Фабрика.ПрочитатьXML(ЧтениеXML); | |||
| 4
    
        adelaide 18.06.14✎ 17:44 | 
        (3) Да, то что надо, спасибо юзеру Jaap Vduul
 из темы: v8: Чтение xml по схеме xsd Можно закрывать, поиск рулит =) | |||
| 5
    
        DS 18.06.14✎ 17:48 | 
        >> Есть поставщик, он по API выдает прайс в XML
 Веб-сервис, чтоли? Так есть способы красивее... | |||
| 6
    
        Serginio1 18.06.14✎ 17:55 | 
        (3) Можно проще через СоздатьФабрикуXDTO     | |||
| 7
    
        Maxus43 18.06.14✎ 17:57 | 
        а если в конфу xdto пакет добавить - файл схемы не нужен будет     | |||
| 8
    
        adelaide 18.06.14✎ 17:59 | 
        (6) покажи как
 (7) я тупой, у меня так не получилось, туплю во втором параметре: ФабрикаXDTO.Тип("http://урл_пространства_имен", что_тут_писать?); если пишу имя пакета, то возвращает Неопределено. | |||
| 9
    
        adelaide 18.06.14✎ 17:59 | 
        (5) вебсервис но без WSDL     | |||
| 10
    
        Maxus43 18.06.14✎ 18:00 | 
        импортировал схему в xdto пакет в конфигураторе? не макет. xdto пакет. в общих.
 там и урл написан | |||
| 11
    
        H A D G E H O G s 18.06.14✎ 18:01 | 
        Я правильно понимаю, что при чтении через XDTO файл хреначиться в область памяти сразу, махом, без построчного добавления?     | |||
| 12
    
        adelaide 18.06.14✎ 18:02 | 
        (10) да, импортировал пакет, урл прописан, пробовал делать:  ФабрикаXDTO.Тип("http://урл_пространства_имен", "Имя_пакета")     | |||
| 13
    
        adelaide 18.06.14✎ 18:02 | 
        возвращает неопределено     | |||
| 14
    
        acsent 18.06.14✎ 18:03 | 
        (11) конечно, ибо объект создается     | |||
| 15
    
        Serginio1 18.06.14✎ 18:18 | 
        (8)
 Фабрика = СоздатьФабрикуXDTO("C:\Users\prog1c\Documents\111\price.xsd"); | |||
| 16
    
        Serginio1 18.06.14✎ 18:20 | 
        (8) ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)     | |||
| 17
    
        Serginio1 18.06.14✎ 18:21 | 
        16 + тьфу Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)     | |||
| 18
    
        blopp 18.06.14✎ 18:24 | 
        (11) Если вызывать чтение стоя на начале первого элемента файла - то конечно считается все целиком.
 Но фабрикой можно тоже по частям читать - начало элемента явно через ЧтениеXML, а то что внутри - фабрикой. | |||
| 19
    
        Serginio1 18.06.14✎ 18:38 | 
        (11) нет. Если в документе много объектов то считвается только один объект. Например 
 ЧтениеXML=Новый ЧтениеXML; ЧтениеXML=Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); ЧтениеXML.ПерейтиКСодержимому(); ЧтениеXML.Прочитать(); Пока ЧтениеXML.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл ОбъектXDTO=Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)); КонецЦикла; ЧтениеXML.Закрыть(); | |||
| 20
    
        Fragster гуру 18.06.14✎ 18:45 | 
        кто-нибудь осилил магию представления XML из (0) сразу в ТЗ по колонкам и строкам, без цикла, только через пакеты XDTO и схемы?     | |||
| 21
    
        Bober 18.06.14✎ 18:51 | 
        (20) пока не видел живого примера со схемой xml и тз.     | |||
| 22
    
        Serginio1 18.06.14✎ 19:16 | 
        (20) А смысл? Ты также работаешь с объектом как и с тз.
 В принципе не проблема используя ИзXMLТипа создать типы колонок | |||
| 23
    
        Fragster гуру 18.06.14✎ 19:21 | 
        (22) смысл меньше букв в загрузке в базу. теоретически через XSLT можно преобразовать исходный XML к ValueTable из http://v8.1c.ru/8.1/data/core и все. Но может есть способ проще.     | |||
| 24
    
        Serginio1 18.06.14✎ 19:30 | 
        (23) С каких это букв меньше? Тоже самое.
 ОбъектXDTO=Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)); | |||
| 25
    
        Serginio1 18.06.14✎ 19:32 | 
        (24) Ты сначала должен преобразовать к ValueTable, а затем применить ПрочитатьXML     | |||
| 26
    
        Fragster гуру 18.06.14✎ 19:38 | 
        (24)  да, но ОбъектXDTO не запихаешь параметром в запрос как ТЗ, или не запишешь в базу, например, как документ какой-ниубдь.     | |||
| 27
    
        Serginio1 18.06.14✎ 19:49 | 
        Объект=СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
 Объект.Записать(); А так согласен. Просто задачи такой не было. Да и ОбъектXDTO может быть весьмя сложной структурой ввиде дерева | |||
| 28
    
        Fragster гуру 18.06.14✎ 19:54 | 
        (27) вот именно, что "сложной структурой". просто эта структура нам известна, и неплохо бы эту структуру сразу в определенный объект преобразовать, а не в абстрактный ОбъектXDTO, из которого через постобработку получать ТЗ, ДокументОбъект и прочее     | |||
| 29
    
        Serginio1 19.06.14✎ 11:50 | 
        (28) У меня обмен между конфигурациями на ОбъектахXDTO так быстрее. Причем выгружается сразу в схему загружаемой конфигурации. Так, что объекты загружаются сразу. Единственно, что когда загружающая конфигурация загружается, нужно изменять схему ну и заполнение полей. 
 Там все равно нужно много дополнительных действий, если документы и предопределенные элементы не совпадают. Но зато загрузка очень быстрая. Что кстати и 1С могла сделать. Например v8: XSD схема программно с нуля. | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |