Имя: Пароль:
1C
 
Народ, а как счас модно читать XML файл.
0 Гений 1С
 
гуру
17.03.20
19:37
Я хочу прочитать нативно, быстро прочитать через ЧтениеXML большой файл.
Он, допустим имеет такую структуру
Products
  Product
     Categories
       Category
       Category
  Product
     Categories
       Category
       Category

Product и Category как бы тоже содержат поля (без атрибутов).

Вот как это хозяйство правильно прочитать?

А то я написал универсальную читалку, читает на клиенте. Но вдруг это изобретение велосипедов, как правильно?
1 ДенисЧ
 
17.03.20
19:38
В 1с XDTO.
В SQL - штатные средства.
2 Гений 1С
 
гуру
17.03.20
19:40
(1) В XDTO, говоришь? Там нужно всю схему XML валидировать? Можно пример? что-то не понимаю.

Вот пример:

Products
  Product
     ProductName BigItem
     ProductID 1
     Categories
       Category
         CategoryID 11
         CategoryName Electric
       Category
         CategoryID 12
         CategoryName Ware
  Product
     ProductName SmallItem
     ProductID 2
     Categories
       Category
         CategoryID 11
         CategoryName Electric
3 Гений 1С
 
гуру
17.03.20
19:40
А XML по схеме XTDO уаще быстро читается? или ЧтениеXML шибче?
4 Гений 1С
 
гуру
17.03.20
19:41
И да, файл огромный. XDTO ж в память засасывает, так?
5 ДенисЧ
 
17.03.20
19:54
(3) Шибечее всего читает УдалитьФайлы().
Но тебе ведь не это надо?
Я ж говорю - читай штатными средствами MSSQL. Всё равно руками - не обгонишь.
6 Cyberhawk
 
17.03.20
20:03
Некоторые текстовые файлы только через ДОМ-модель сможешь прочитать.
ЧтениеХМЛ как минимум не понимает одновременно текстовые свойства и текстовое содержимое.
7 icipher
 
17.03.20
20:07
Построитель = Новый ПостроительDOM;

ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.УстановитьСтроку(Ответ);
    
Документ = Построитель.Прочитать(ЧтениеХМЛ);

ТаблицаОтчислений = Документ.ПолучитьЭлементыПоИмени("deductionsDetailed");

и т. д.
8 Гений 1С
 
гуру
17.03.20
20:09
(6) Дом модель умирает на больших файлах, плавали - знаем.
9 Cyberhawk
 
17.03.20
20:10
(8) Так необязательно ею читать весь целиком
10 Гений 1С
 
гуру
17.03.20
20:13
(9) это как?
11 Skipper
 
17.03.20
20:39
(0) XDTO
12 ProProg
 
17.03.20
20:55
Обычное чтение XML в цикле
13 Гений 1С
 
гуру
17.03.20
20:58
(12) вот придется код писать под каждую структуру. Я у себя формализовал. ВОт думаю, велосипед или давать в печать?
14 ProProg
 
17.03.20
21:07
не понял что значит под каждую. ты конструктор хочешь?
15 ProProg
 
17.03.20
21:08
Универсальную я уже сделал
Price Convertor: загрузка прайс-листов YML / XML в 1С
https://subsystems.ru/solutions/parsery-praysov/price-convertor-zagruzka-prays-listov-yml-xml-v-1s/
16 Garykom
 
гуру
17.03.20
21:10
Прикольно что некоторые только сейчас доходят до уже устаревших технологий типа XML.

(0) Когда будешь осваивать JSON?
17 Garykom
 
гуру
17.03.20
21:11
(15) Маня? Ты шо дизайн сайтика сменил?
18 Сияющий в темноте
 
17.03.20
21:14
(6) чтение xml при должных настройках все прекраснг читает.
19 ProProg
 
17.03.20
21:16
файл 500 гиг с 260 000 товарами (еще у них соти свойств) три минуты занимает
20 Garykom
 
гуру
17.03.20
21:17
(19) Питон плохо умеет параллелизм так что хня твоя читалка. Можно круче в кучу потоков.
21 ProProg
 
17.03.20
21:17
При этом там еще проблема - что группы отдельно (еще и с рекурсией) и товары отдельно с ссылками по айди.
Вот это тормознее чем само чтение.
22 ProProg
 
17.03.20
21:18
(20) ты смешной. когда нет смысла ускорятся (3 минуты 500 гиг файл) - то нафига мучаться.
Пойди найди питонщика - 100 000 денег мало будет.
23 ProProg
 
17.03.20
21:20
в 1С тоже есть функции потокового чтения и не поверишь даже дробления файлов.
только нафига усложнять там где оно не нужно!
золотое правило - не делай много работы там где оно нафиг не нужно.
24 ProProg
 
17.03.20
21:23
в файле 5000 свойств. у всех товаров они разные.
в каждого от 5 до 25 свойств. 4000 групп разных видов товаров.

Твой питонщик загнется код писать. Это только 1Сник способен расколдовать и не не каждый.
3000 баксов заплатишь за программу которую он постоянно будет глюки вылавливать и править. потому что мозг не включит как все разложить.
25 mikecool
 
17.03.20
22:04
(15)слово "прийдет" пишется как "придет"
26 Кирпич
 
17.03.20
22:25
+(25) 500 гиг еще на**здел
27 Кирпич
 
17.03.20
22:28
(19) у тебя там каждый товар описывается романом типа "Война и мир"?
28 ProProg
 
17.03.20
22:39
Да ошибся. 500 мегабайт.
29 Кирпич
 
17.03.20
22:54
(20) В питоне есть expat из коробки. Это, пожалуй, самый быстрый способ читать xml. А вместо потоков можно использовать процессы. Оно там по писанине мало чем отличается от потоков.
30 Сияющий в темноте
 
17.03.20
23:05
пихаиь все в один xml-файл,это как все яйца в одной корзине.
еще и самый идиотский формат,который даже простые последовательности символов не обещает сохранять.
31 ProProg
 
17.03.20
23:07
(30) такое повсеместно. еще хуже коммерс ML
там в три файла распихивают но потом все эти три надо между собой в одной целое соединять - а это множественные поиски и проставления.
самый быстрый и удобны как всегда CSV
32 ProProg
 
17.03.20
23:08
99 процентов еще в экселях живет. и мало того в эксели картинки пихает.
33 Lokli
 
18.03.20
07:14
Есть же описание и разбор вариантов в 1С.
http://catalog.mista.ru/public/311011/
34 Cyberhawk
 
18.03.20
09:28
(18) А, ну значит это через ФабрикуХДТО такой косяк: когда есть и атрибут (то что внутри тэга), и значение (то что между открывающим и закрывающим тэгами), то значение никуда не читается (только атрибут).
35 Арбузов
 
18.03.20
09:32
(28) Даже на 500М одним файлом прайс выгружают только отморозки какие-то.
36 ДенисЧ
 
18.03.20
09:33
(35) Не отморозки, а маньяки. В основном - ростовские...
37 Арбузов
 
18.03.20
09:35
(36) Маньяки и Гении :)) И непонятно, кто из них страшнее.
38 DrZombi
 
гуру
18.03.20
09:54
(0) Файл может быть и в одну строку
39 sikuda
 
18.03.20
10:32
(0) ХМL это простой длинный текстовый файл, чтение осуществляется последовательно. А нужно
- сразу переход в нужное место
- выделение необходимого куска
- быстрое приведения его в структуру загрузки 1С (обычно используем XDTO)
40 ProProg
 
18.03.20
10:44
1С могла бы при желании ускорить работу с XML и уростить. но по неводомым причинам не делает этого.
Разные методы по разному работают и выдают скоростные результаты.
41 ProProg
 
18.03.20
10:46
Проблема на самолм деле в том что кто как хочет так и лепит XML
Сейчас все чаще попадаются YML - там хоть какая то структура есть определенная.
Но до сих пор попадаются просто уродские XML в которых налеплено как попало.

XML это паутинная структура, особенно когда в одном файле разные таблицы.
42 АнализДанных
 
18.03.20
10:54
(2) XDTO можно читать, без схемы, но имей ввиду: если у тебя есть какой-то элемент с типом "Список", например в твоем случае это получается "Category", то
- если список из 1-го элемента, то он прочитает его, как тип ОбъектXDTO
- если список из более 1-го элемента, то он прочитает его, как тип СписокXDTO.

Решается простой процедурой, например:

Для Каждого ЭлСпискаXDTO Из КоллекцияXDTO(CategoryXDTO) Цикл
   //обработка
КонецЦикла

Процедура КоллекцияXDTO(ОбъектXDTO) Цикл

   Если ТипЗнч(ОбъектXDTO)=Тип(СписокXDTO) Тогда
       Возврат ОбъектXDTO;
   Иначе
       МассивОбъектов = Новый Массив;
       МассивОбъектов.Добавить(ОбъектXDTO);
       Возврат МассивОбъектов;
   КонецЕсли;

КонецПроцедуры
43 big
 
18.03.20
10:55
(19) А можно взять "помучить" это файл в 500 мБ?
44 Fragster
 
гуру
18.03.20
10:57
500 мегабайт в XDTO влезет нормально. если страшно, то можно с помощью Чтение спуститься до уровня первого списка (пропустить Products) и в цикле читать Product как объектXDTO. тогда памяти сильно меньше надо будет.
45 Garykom
 
гуру
18.03.20
10:59
(39) Это все давным давно есть из коробки в нормальных фреймворках.
И в 1С есть но тормозит и жрет кучу ресурсов.
46 Garykom
 
гуру
18.03.20
11:00
(44) Проще аля sax прогнать и получить на выходе Структуру с вложенными Структурами а затем работать с ними.
47 Garykom
 
гуру
18.03.20
11:03
(46) Ну или в ДеревоЗначений
https://helpf.pro/faq/view/1321.html
48 Fragster
 
гуру
18.03.20
11:19
(46)(47) оно принципиально не отличается от объекта XDTO и не факт, что будет меньше памяти жрать
49 Djelf
 
18.03.20
11:25
500 метров это ерунда, реестр лицензий на 8 гигов, это более серьезный вызов http://fsrar.ru/opendata/7710747640-reestr/
50 Fragster
 
гуру
18.03.20
11:26
(49) ну смотри, там даже xsd лежит
51 sikuda
 
19.03.20
14:15
(45) Да вообще 1Сина придумала ХМLЧтение.Прочитать() кусочками. Ведь нет же нигде такого ;)))
<?php
    $reader = new XMLReader();
    $reader->open('example.xml'); // указываем ридеру что будем парсить этот файл
    // циклическое чтение документа
    while($reader->read()) {
        if($reader->nodeType == XMLReader::ELEMENT) {
            // если находим элемент <card>
            if($reader->localName == 'card') {
                $data = array();
                // считываем аттрибут number
                $data['number'] = $reader->getAttribute('number');
                // читаем дальше для получения текстового элемента
                $reader->read();
                if($reader->nodeType == XMLReader::TEXT) {
                    $data['name'] = $reader->value;
                }
                // ну и запихиваем в бд, используя методы нашего адаптера к субд
                SomeDataBaseAdapter::insertContact($data);
            }
        }
    }
52 Franchiser
 
гуру
19.03.20
15:30
(15) второе видео 7:12/9:57
Недельный программатор - это не д.б. число
53 Гений 1С
 
гуру
20.03.20
21:29
(35) если что то я обрабатывал выгрузку всех товаров с сайта. Переносил сайт с одного движка на другой (Друпал). ;-)