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