Вход | Регистрация
 

Народ, а как счас модно читать XML файл.

Народ, а как счас модно читать XML файл.
Я
   Гений 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 - штатные средства.
   Гений 1С
 
2 - 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
   Гений 1С
 
3 - 17.03.20 - 19:40
А XML по схеме XTDO уаще быстро читается? или ЧтениеXML шибче?
   Гений 1С
 
4 - 17.03.20 - 19:41
И да, файл огромный. XDTO ж в память засасывает, так?
   ДенисЧ
 
5 - 17.03.20 - 19:54
(3) Шибечее всего читает УдалитьФайлы().
Но тебе ведь не это надо?
Я ж говорю - читай штатными средствами MSSQL. Всё равно руками - не обгонишь.
   Cyberhawk
 
6 - 17.03.20 - 20:03
Некоторые текстовые файлы только через ДОМ-модель сможешь прочитать.
ЧтениеХМЛ как минимум не понимает одновременно текстовые свойства и текстовое содержимое.
   icipher
 
7 - 17.03.20 - 20:07
Построитель = Новый ПостроительDOM;

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

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

и т. д.
   Гений 1С
 
8 - 17.03.20 - 20:09
(6) Дом модель умирает на больших файлах, плавали - знаем.
   Cyberhawk
 
9 - 17.03.20 - 20:10
(8) Так необязательно ею читать весь целиком
   Гений 1С
 
10 - 17.03.20 - 20:13
(9) это как?
   Skipper
 
11 - 17.03.20 - 20:39
(0) XDTO
   ProProg
 
12 - 17.03.20 - 20:55
Обычное чтение XML в цикле
   Гений 1С
 
13 - 17.03.20 - 20:58
(12) вот придется код писать под каждую структуру. Я у себя формализовал. ВОт думаю, велосипед или давать в печать?
   ProProg
 
14 - 17.03.20 - 21:07
не понял что значит под каждую. ты конструктор хочешь?
   ProProg
 
15 - 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/
   Garykom
 
16 - 17.03.20 - 21:10
Прикольно что некоторые только сейчас доходят до уже устаревших технологий типа XML.

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

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

КонецПроцедуры
   big
 
43 - 18.03.20 - 10:55
(19) А можно взять "помучить" это файл в 500 мБ?
   Fragster
 
44 - 18.03.20 - 10:57
500 мегабайт в XDTO влезет нормально. если страшно, то можно с помощью Чтение спуститься до уровня первого списка (пропустить Products) и в цикле читать Product как объектXDTO. тогда памяти сильно меньше надо будет.
   Garykom
 
45 - 18.03.20 - 10:59
(39) Это все давным давно есть из коробки в нормальных фреймворках.
И в 1С есть но тормозит и жрет кучу ресурсов.
   Garykom
 
46 - 18.03.20 - 11:00
(44) Проще аля sax прогнать и получить на выходе Структуру с вложенными Структурами а затем работать с ними.
   Garykom
 
47 - 18.03.20 - 11:03
(46) Ну или в ДеревоЗначений
https://helpf.pro/faq/view/1321.html
   Fragster
 
48 - 18.03.20 - 11:19
(46)(47) оно принципиально не отличается от объекта XDTO и не факт, что будет меньше памяти жрать
   Djelf
 
49 - 18.03.20 - 11:25
500 метров это ерунда, реестр лицензий на 8 гигов, это более серьезный вызов http://fsrar.ru/opendata/7710747640-reestr/
   Fragster
 
50 - 18.03.20 - 11:26
(49) ну смотри, там даже xsd лежит
   sikuda
 
51 - 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);
            }
        }
    }
   Franchiser
 
52 - 19.03.20 - 15:30
(15) второе видео 7:12/9:57
Недельный программатор - это не д.б. число
   Гений 1С
 
53 - 20.03.20 - 21:29
(35) если что то я обрабатывал выгрузку всех товаров с сайта. Переносил сайт с одного движка на другой (Друпал). ;-)


Список тем форума
Рекламное место пустует  Рекламное место пустует
Компьютер — устройство разработанное для ускорения и автоматизации человеческих ошибок.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.