![]() |
|
Сравнить два XML с разной сортировкой | ☑ | ||
---|---|---|---|---|
0
RomaH
naïve
03.07.17
✎
11:31
|
Суть - ТФОМС раз 20 в год выкладывает файл XML с нормативно-справочной
что изменили - нам не рассказывают соответственно - берем предыдущий файл текущий и сравниваем как текст - KDiff3 но ТФОМС разгадал наш хитрый план - и теперь каждый раз пересортировывает таблицы перед выгрузкой в XML теперь что там реально изменилось с первого раза не видно хотелось бы этот файл как-то преобразовать в произвольные коллекции, отсортировать и сохранить обратно в текст - дабы просто сравнить два текстовых файла с одинаковой сортировкой ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(Объект.ТекстФайла); Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); в данных имеем структуру типа ОбъектХДТО - СписокХДТО но СписокХДТО не сортируется Подскажите? |
|||
1
Кирпич
03.07.17
✎
11:33
|
вытягивай из обоих файлов важные данные, сортируй как тебе надо и сравнивай.
|
|||
2
RomaH
naïve
03.07.17
✎
11:33
|
можно рекурсией все списки выгрузить в ТЗ с генерируемой структурой колонок по свойствам...
|
|||
3
RomaH
naïve
03.07.17
✎
11:34
|
(1) для этого надо четко описывать структуру важных данных
там порядка 70 таблиц при этом структура может неожиданно менятся мне нужна универсальность |
|||
4
trdm
03.07.17
✎
11:35
|
А выложить можно куда-нить файло?
|
|||
5
RomaH
naïve
03.07.17
✎
11:36
|
||||
6
Кирпич
03.07.17
✎
11:44
|
(3) т.е. вас не волнует в какой из 70 таблиц, что изменилось. А что же вас тогда волнует.
|
|||
7
Mihenius
03.07.17
✎
11:45
|
(0) Мы пробовали ругаться. Писали им грозные письма.
Потом плюнули, создали в sql отдельные временные базы. Грузим туда и спокойно сравниваем. А так да, с форматом xml в ФОМС-ах видимо еще до сих пор не разобрались ) Особенно радует могут 1 код удалить вначале года, в конце года по этому же коду добавить совсем другой элемент. Или период действия гонять туда сюда. |
|||
8
trdm
03.07.17
✎
11:47
|
Пересортировывай перед сравнением.
|
|||
9
trdm
03.07.17
✎
11:48
|
Не смысла ругаться. Все равно не отреагируют.
|
|||
10
RomaH
naïve
03.07.17
✎
11:50
|
(8) так и вопрос - как пересортировать?
|
|||
11
Cyberhawk
03.07.17
✎
11:50
|
ПреобразованиеXSL
|
|||
12
Mihenius
03.07.17
✎
11:51
|
(7) Еще из приколов Федеральный и Местный фонды со структурой разобраться не могут друг с другом. И бессистемно и бессмысленно дублируют поля по таблицам.
И сидишь постоянно репу чешешь. Чего же они в этом месяце нового придумают ) Из последних приколов. Введен новый порядок с 1 мая. (изменена структура, добавлено/изменена куча полей) И вот, о чудо, 30 апреля сообщают, что ПО еще не готово и изменения начнут действовать с июня ) А мы уже все сделали ) Пришлось за 1 день возвращать назад. Короче бардак там полный. |
|||
13
Mihenius
03.07.17
✎
11:54
|
(10) В связи с тем что они не понимают что ключевое поле должно быть уникальным, хотя бы в пределах года - делали свой ключ "Код+Начало действия", иначе потом не разберешься.
|
|||
14
trdm
03.07.17
✎
11:56
|
(10) Обычным XML мелкософтовским.
Открываешь 2 файла, один на чтение, другой на запись, выдираешь baseName из узлов 3-го уровня - это и будут ключи сортировки. Пихаешь их в список, сортируешь список, потом идя по отсортированному списку выгружаешь во второй файл. Его и сравниваешь. |
|||
15
trdm
03.07.17
✎
12:01
|
+(14) для веток 4-го уровня можно завести словарь уникальных полей.
LPUs->code fed_department_mo->IDOTD И т.п. |
|||
16
RomaH
naïve
03.07.17
✎
12:08
|
(11) уверен?
|
|||
17
Cyberhawk
03.07.17
✎
12:15
|
(16) Нет, конечно - тут ведь пишут, что выкладывают файл с расширением xml, но стандартам XML он не отвечает
|
|||
18
RomaH
naïve
03.07.17
✎
12:15
|
(14) что такое обычный XML мелкосовтовский?
|
|||
19
Mihenius
03.07.17
✎
12:21
|
||||
20
trdm
03.07.17
✎
13:31
|
||||
21
Lama12
03.07.17
✎
13:58
|
(0) Возможно не в тему.
Если открыть в екселе и там отсортировать и сравнить, результат устроит? Или там структура такая что ексель не переваривает? |
|||
22
1dvd
03.07.17
✎
14:12
|
Когда-то давно-давно делал сравнилавку xml файлов, которая бы тебе помогла. Но, она для клюшек :)
http://catalog.mista.ru/public/60322/ |
|||
23
RomaH
naïve
03.07.17
✎
14:22
|
(22) сортировку написал
сильно не помогла в этом случае KDiff3 - не видит вставленные и убранные куски https://screenpresso.com/=HNPNf |
|||
24
RomaH
naïve
03.07.17
✎
14:23
|
&НаКлиенте
Процедура ВыполнитьСортировку(Команда) ВыполнитьСортировкуНаСервере(); КонецПроцедуры &НаСервере Процедура ВыполнитьСортировкуНаСервере() ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(Объект.ТекстФайла); Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); ПройтисьПоВеткеДерева(Данные.body); ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку("windows-1251"); ЗаписьXML.ЗаписатьОбъявлениеXML(); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Данные); Объект.ТекстВыгрузки = ЗаписьXML.Закрыть(); КонецПроцедуры Процедура ПройтисьПоВеткеДерева(ЗначениеВетки) //Свойства = ЗначениеВетки.Свойства(); Для Каждого Свойство Из ЗначениеВетки.Свойства() Цикл ЗначениеСвойства = ЗначениеВетки[Свойство.ЛокальноеИмя]; Если ТипЗнч(ЗначениеСвойства) = Тип("СписокXDTO") Тогда ОтсортироватьСписок(ЗначениеСвойства); ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("ОбъектXDTO") Тогда ПройтисьПоВеткеДерева(ЗначениеСвойства); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ОтсортироватьСписок(ЗначениеСвойства) //ЗначениеСвойства - СписокXDTO //Создадим ТЗ со структурой колонок как у Списка ТаблицаСписка = Новый ТаблицаЗначений; МассивСортировки = Новый Массив; КолонокСортировки = 0; СтрокаСортировки = СтрСоединить(МассивСортировки,","); Для Каждого СтрокаСписка Из ЗначениеСвойства Цикл Для Каждого Свойство Из СтрокаСписка.Свойства() Цикл Если ТаблицаСписка.Колонки.Найти(Свойство.ЛокальноеИмя) = Неопределено Тогда ТаблицаСписка.Колонки.Добавить(Свойство.ЛокальноеИмя); Если КолонокСортировки <= 3 И ТипЗнч(СтрокаСписка[Свойство.ЛокальноеИмя]) = Тип("Строка") Тогда МассивСортировки.Добавить(Свойство.ЛокальноеИмя); КолонокСортировки = КолонокСортировки + 1; КонецЕсли; КонецЕсли; Если ТипЗнч(СтрокаСписка[Свойство.ЛокальноеИмя]) = Тип("СписокXDTO") Тогда ОтсортироватьСписок(СтрокаСписка[Свойство.ЛокальноеИмя]); ИначеЕсли ТипЗнч(СтрокаСписка[Свойство.ЛокальноеИмя]) = Тип("ОбъектXDTO") Тогда ПройтисьПоВеткеДерева(СтрокаСписка[Свойство.ЛокальноеИмя]); КонецЕсли; КонецЦикла; СтрокаТЗ = ТаблицаСписка.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТЗ,СтрокаСписка); КонецЦикла; Если Не ПустаяСтрока(СтрокаСортировки) Тогда ТаблицаСписка.Сортировать(СтрокаСортировки); КонецЕсли; ИндексСтроки = 0; Для Каждого СтрокаСписка Из ЗначениеСвойства Цикл ЗаполнитьЗначенияСвойств(СтрокаСписка,ТаблицаСписка[ИндексСтроки]); ИндексСтроки = ИндексСтроки + 1; КонецЦикла; //ФабрикаXDTO.Создать(ЗначениеСвойства.ПолучитьXDTO(0).Тип(),ЗначениеСвойства.ПолучитьXDTO(0)) КонецПроцедуры |
|||
25
RomaH
naïve
03.07.17
✎
14:28
|
Для Каждого СтрокаСписка Из ЗначениеСвойства Цикл
ЗаполнитьЗначенияСвойств(СтрокаСписка,ТаблицаСписка[ИндексСтроки]); ИндексСтроки = ИндексСтроки + 1; КонецЦикла; вот это, конечно, в корне не верно но как создать ОбъектXDTO не имея схемы? |
|||
26
trdm
03.07.17
✎
15:15
|
(23) ну дык сортируй подветки дальше. Я вроде намекал в (15)
|
|||
27
EugeniaK
03.07.17
✎
15:19
|
(0) Утилитка ExamDIFF. Отлично сравнивает XML с учетом имен элементов, а не порядка расположения.
|
|||
28
EugeniaK
03.07.17
✎
15:22
|
(27) Перепутала название. Правильно ExamXML. Для постоянного использования стоит символических денег, первые 30 дней бесплатно.
|
|||
29
RomaH
naïve
03.07.17
✎
15:44
|
(28) оно виснет на таких файлах 26 метров, похоже для него не подъемно)
|
|||
30
Вафель
03.07.17
✎
15:48
|
Чтение XML в дерево - задача решенная много-много лет назад
|
|||
31
RomaH
naïve
04.07.17
✎
07:28
|
а как, все-таки, создать новый объектХДТО с определенным набором свойств?
|
|||
32
Garykom
гуру
04.07.17
✎
08:21
|
(0) Там же в заголовке XML указано https://ru.wikipedia.org/wiki/XMLSpy
|
|||
33
Garykom
гуру
04.07.17
✎
08:21
|
(32)+ Это такой DBF Navigator для "программистов"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |