Имя: Пароль:
1C
 
Работа с XML ничего нового не появилось?
,
0 Kongo2019
 
14.07.22
13:32
Работа с XML ничего нового не появилось?
Какие тенденции. Может 1С чего нового придумала.
Или все по прежнему,ПостроительDOM и погнали.
1 СеменовСемен
 
14.07.22
13:34
А чего не хватает. 100500 способов же есть
2 СеменовСемен
 
14.07.22
13:34
А тенденция переходить на жсон
3 Kongo2019
 
14.07.22
13:37
Дык мне контрагенты XML шлют.
4 Kassern
 
14.07.22
13:45
(3) Есть ФабрикаXDTO Есть ЧтениеXML как хочешь, так и парсишь
5 СеменовСемен
 
14.07.22
13:57
Небольшие удобнее через фабрику
6 NorthWind
 
14.07.22
14:03
(0) а чего нового там может появиться? Технологии уже 20 с лишним лет...
7 Ненавижу 1С
 
гуру
14.07.22
14:04
LINQ to XML не завезли, да
8 Мультук
 
гуру
14.07.22
14:05
(0)

Имхо, всё что есть "у взрослых" - есть в 1С. Какие тут еще тенденции.

P.S.

Лучше бы им кто pandas из питона показал, а то таблицаЗначений уже печалит...
9 Гений 1С
 
гуру
14.07.22
15:00
(0) я писал свой разбор XML. На клиенте работает и на сервере. Гонит в соответствие. Разбирает через чтение XML. Удобнее чем DOM
10 Гений 1С
 
гуру
14.07.22
15:02
(6) то что в 1с по XML - это боль и отвращение.
Даже если DOM заюзать, нет банальных частых функций для поиска тега, атрибута, приходится свою обвязку писать.
Не говоря уже о том, что DOM для больших файлов. и было бы интересно использовать чтение для нахождения нужного объеекта в XML, а его уже парсить через DOM. Но всё это не для 1С, там пипл и так схавает.
11 Kassern
 
14.07.22
15:05
(10) Ну так грузи в ДЗ и по нему штатными методами ищи нужные строки, в чем проблема?
12 Мультук
 
гуру
14.07.22
15:21
(10) XPATH
13 СеменовСемен
 
14.07.22
15:48
(9) чем это лучше объекта xdto ?
14 NorthWind
 
14.07.22
15:55
(13) несколько дней вдуплять не надо. Все же хдто крайне тугая и непрозрачная вещь
15 NorthWind
 
14.07.22
15:56
хотя, в принципе, после того как в общих чертах дойдет как оно работает - вроде ничего. Но произошло это у меня, например, небыстро.
16 Kassern
 
14.07.22
16:04
(14) Тут скорее всего идет речь о Данные=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
17 Ненавижу 1С
 
гуру
14.07.22
16:25
(9) и что является ключом?
18 Kassern
 
14.07.22
16:26
(17) имя тега скорее всего. Соответствие в этом плане гораздо лояльней структуры)
19 Ненавижу 1С
 
гуру
14.07.22
16:29
(18) теги могут иметь одинаковые имена
20 Kassern
 
14.07.22
16:30
(19) на одном уровне?
21 Ненавижу 1С
 
гуру
14.07.22
16:31
(20) прикинь:
22 Ненавижу 1С
 
гуру
14.07.22
16:31
<Items>
<Item>
<Id>ba802a29-c410-11ea-8124-a4bf01001a4c</Id>
<Transit>0</Transit>
<Quantity>1</Quantity>
<DiscountSum>0</DiscountSum>
</Item>
<Item>
<Id>506a3a52-88b7-11eb-812d-a4bf01001a4b</Id>
<Transit>0</Transit>
<Quantity>2</Quantity>
<DiscountSum>0</DiscountSum>
</Item>
<Item>
<Id>506a3a54-88b7-11eb-812d-a4bf01001a4b</Id>
<Transit>0</Transit>
<Quantity>1</Quantity>
<DiscountSum>0</DiscountSum>
</Item>
<Item>
<Id>f6efb9e0-7639-11e9-80fb-a4bf01001a4c</Id>
<Transit>0</Transit>
<Quantity>2</Quantity>
<DiscountSum>0</DiscountSum>
</Item>
<Item>
<Id>ec6e53be-7639-11e9-80fb-a4bf01001a4c</Id>
<Transit>0</Transit>
<Quantity>2</Quantity>
<DiscountSum>0</DiscountSum>
</Item>
</Items>
23 Гений 1С
 
гуру
14.07.22
16:31
(11) примерно так и делаю, только соответствие пошустрее дерева будет и на клиенте тоже существует
24 Kassern
 
14.07.22
16:32
(22) ну так каждый блок <Item> это отдельное соответствие. А в Items массив соответствий
25 Kassern
 
14.07.22
16:33
А вот если будет условно:
<Item>
<Id>123</Id>
<Id>234</Id>
<Transit>0</Transit>
<Quantity>2</Quantity>
<DiscountSum>0</DiscountSum>
</Item>
То вроде не даст так записать xml, и в соответствие так же не прочитать. Вот что я имел под "на одном уровне"
26 Ненавижу 1С
 
гуру
14.07.22
16:34
(25) это одно и тоже и даст таки записать
27 Гений 1С
 
гуру
14.07.22
16:36
Подымал эту тему в Требуется обработать файл XML Enterprise Data (выгрузка из Мой склад) чем лучше?
(13) лучше тем, что XML может не соответствовать объекту XDTO, не нужна типизация.
(24) (17) Вот код, смотрите сами:


&НаКлиенте
Функция НайтиТегXML(Строки, Тег) Экспорт
    Для Каждого Строка ИЗ Строки Цикл
        Если Строка.Тег = Тег Тогда
            Возврат Строка;
        КонецЕсли;
    КонецЦикла;
КонецФункции

&НаКлиенте
Функция НайтиЗначениеТегаXML(Строки, Тег) Экспорт
    Для Каждого Строка ИЗ Строки Цикл
        Если Строка.Тег = Тег Тогда
            Возврат Строка.Тело;
        КонецЕсли;
    КонецЦикла;
КонецФункции

&НаКлиенте
Функция РазобратьXML(Ч, Строки = Неопределено, РодительскаяСтрока = Неопределено) Экспорт
    Если Строки = Неопределено Тогда
        Строки = Новый Массив();
    КонецЕсли;
    
    Пока Ч.Прочитать() Цикл
        //Сообщить(""+Ч.ТипУзла+Символы.Таб+Ч.Имя+Символы.Таб+Ч.Значение + Символы.Таб + Ч.КоличествоАтрибутов());
        Если Ч.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ТекСтрока = Новый Структура("Тег, Родитель, Тип, Тело, ", Ч.Имя, РодительскаяСтрока);
            ТекСтрока.Вставить("Атрибуты", Новый Соответствие());
            ТекСтрока.Вставить("Строки", Новый Массив());
            Строки.Добавить(ТекСтрока);
            //ТекСтрока.Тело = "";
            Если Ч.КоличествоАтрибутов() > 0 Тогда
                Пока Ч.ПрочитатьАтрибут() Цикл
                    ТекСтрока.Атрибуты.Вставить(Ч.Имя, Ч.Значение);
                КонецЦикла
            КонецЕсли;
            РазобратьXML(Ч, ТекСтрока.Строки, ТекСтрока);
        ИначеЕсли Ч.ТипУзла = ТипУзлаXML.Текст Тогда
            РодительскаяСтрока.Тело = Ч.Значение;
        ИначеЕсли Ч.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Возврат Неопределено;
        //ИначеЕсли Ч.ТипУзла = ТипУзлаXML.ОбъявлениеXML Тогда
        //    ТекСтрока = Новый Структура("Тег, Тело", Ч.Имя);
        //    ТекСтрока.Вставить("Атрибуты", Новый Структура());
        //    ТекСтрока.Вставить("Строки", Новый Массив());
        //    ТекСтрока.Вставить("Тип", ТипУзлаXML.ОбъявлениеXML);
        //    Строки.Добавить(ТекСтрока);
        ИначеЕсли Ч.ТипУзла = ТипУзлаXML.ИнструкцияОбработки Тогда
            РодительскаяСтрока.Тело = Ч.Значение;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Строки;
    
КонецФункции

&НаКлиенте
Функция СобратьXML(З, Строки)
    Для Каждого ТекСтрока ИЗ Строки Цикл
        Если ТекСтрока.Тип = Неопределено Тогда
            З.ЗаписатьНачалоЭлемента(ТекСтрока.Тег);
            Для Каждого ЭлАтрибут ИЗ ТекСтрока.Атрибуты Цикл
                З.ЗаписатьАтрибут(ЭлАтрибут.Ключ, ЭлАтрибут.Значение);
            КонецЦикла;
            
            Если ТекСтрока.Тело <> Неопределено Тогда
                З.ЗаписатьТекст(ТекСтрока.Тело);
            КонецЕсли;
            
            СобратьXML(З, ТекСтрока.Строки);
            
            З.ЗаписатьКонецЭлемента();
        //ИначеЕсли ТекСтрока.ТипУзла = ТипУзлаXML.ОбъявлениеXML Тогда
        //    З.ЗаписатьОбъявлениеXML();
        КонецЕсли;
    КонецЦикла;
КонецФункции




И пример применения, прозрачно на мой взгляд, можете переписать это все на XPATH, ггг....


    ТегСообщение = НайтиТегXML(Строки, "Message");
    ТегBody = НайтиТегXML(ТегСообщение.Строки, "Body");
    
    Для Каждого Строка ИЗ ТегBody.Строки Цикл
        
        Если Строка.Тег = "Справочник.Организации" Тогда
            
            ТекКлючевые = НайтиТегXML(Строка.Строки, "КлючевыеСвойства");
            ИДОрганизации = НайтиЗначениеТегаXML(ТекКлючевые.Строки, "Ссылка");
            ИНН = НайтиЗначениеТегаXML(ТекКлючевые.Строки, "ИНН");
            КПП = НайтиЗначениеТегаXML(ТекКлючевые.Строки, "КПП");
            
            Организация = НайтиОрганизацию(ИНН, КПП);
            Если Организация = Неопределено Тогда
                ВызватьИсключение "Не найдена организация с ИНН: " + ИНН + " и КПП: " + КПП;
            КонецЕсли;



Этот код проверен на больших файлах, 26 Мб.
28 Гений 1С
 
гуру
14.07.22
16:37
Соответствие юзаю только потому, что XML-теги могут не быть идентификаторами. ;-) так бы можно было юзать структуры.
29 Ненавижу 1С
 
гуру
14.07.22
16:39
(27) соответствие только атрибуты, а сам XML у тебя массив, учись выражать мысли
30 Гений 1С
 
гуру
14.07.22
16:40
(29) буквоедство болезнь мозга, падлечися Петровна
31 СеменовСемен
 
14.07.22
16:40
(27) фабрика умеет читать в объект без схемы. Все значения будут строками
32 Ненавижу 1С
 
гуру
14.07.22
16:42
(30) ты совсем уже с катушек съехал, если черное называешь белым и при этом говоришь, что это буквоедство
33 Гений 1С
 
гуру
14.07.22
16:43
(31) если нет схемы, тогда проще поднять DOM и не мучаться, не? Или там какие-то волшебные инструменты поиска, лучше чем XPath? ггг. Может с фабрикой код проще, не?
34 Kassern
 
14.07.22
16:44
(26) если будет несколько тегов с одним именем, то их можно под один ключ, а в значение массив значений.
35 Гений 1С
 
гуру
14.07.22
16:44
(32) еще раз напоминаю тебе про буквоедство. Мы не на научном симпозиуме, чтобы я в буквы попадал. Раз у тебя возникли сомнения, я тебе предоставил код. Не ной. Буквоедство - плохо.
36 Kassern
 
14.07.22
16:45
(34) примерно так делает ФабрикаXDTO
37 Гений 1С
 
гуру
14.07.22
16:45
(25) соответствие нельзя тут использовать, т.к. у него не гарантирован порядок обратного обхода.
т.е. если я взял XML, разобрал, я должен потом собрать 1:1 аналогичный XML. А соответствие шалит с порядком.
38 Гений 1С
 
гуру
14.07.22
16:47
(36) ну я кстати не против, надо как-нибудь поюзать. Вроде там ОбъектXDTO - это полу-коллекция и там есть простые инструменты для поиска тегов по имени (или нет)?
Но все это из-за того, что XPAth и XDTO не имеет должных методов поиска. Приходится обвязку из процедур писать, чтобы код был лаконичным.

Вот как у меня функции НайтиТегXML, НайтиЗначениеТегаXML
39 Kassern
 
14.07.22
16:47
(37) я не припомню случая, когда порядок нужен был в блоке item. Сколько я товаров не парсил, вообще пофиг, count в начале, или price
40 Kassern
 
14.07.22
16:48
да вообще не припомню, чтобы порядок важен был. Даже когда загружал структуру каталогов, всегда можно было создать объект с заданным гуидом, а потом его уже заполнить как надо.
41 Гений 1С
 
гуру
14.07.22
16:49
(39) в XDTO порядок важен, у меня как-то через универсальную выгрузку не грузились данные в другую базу, т.к. я реквизит добавил не в том порядке в эту базу. Увидел, что реквизита нет, добавил, но не в нужном порядке. Это понятно, что косяк реализации XDTO от 1С, но все же с тех пор я блюду порядок
42 Гений 1С
 
гуру
14.07.22
16:49
т.е. при десериализации из XML в объект 1С важен порядок реквизитов 1С, иначе пошлет в пешеэротическое
2 + 2 = 3.9999999999999999999999999999999...