gifts2017

Разборка-сборка XML

Опубликовал Осипов Сергей (fixin) в раздел Программирование - Практика программирования

Используя эту разработку, можно обрабатывать XML как  дерево значений 1С, даже не умея читать или записывать XML.

Если вам лень заниматься чтением и записью XML, то используя эту разработку, вы можете обрабатывать XML как обычное дерево значений.

Сразу предупреждаю, что ЧтениеXML был задуман как объект, не нагружающий память, поэтому для сверхбольших XML файлов я бы рекомендовал использовать прямое ЧтениеXML.

Но если файлы средних размеров, метод имеет право на жизнь.

Для разбора XML вы должны использовать код вида:

Ч = Новый ЧтениеXML();

Ч.ОткрытьФайл(ИмяГлавногоФайла);

П = ___обРазобратьXML(Ч);

Ч.Закрыть();

 

Все, XML файл прочитается, и запишется в структуру с полями:

Дерево - дерево разбора

Кодировка - кодировка XML

Дерево - это дерево с колонками:

Тег - имя тега

Тело - тело тега

Атрибуты – соответствие: в ключах - имена атрибутов, в значениях - значения атрибутов.

Тип - пустая колонка, зарезервирована

Вы можете обработать дерево и записать полученный результат в файл.

А можно просто создать структуру с такой же структурой и программно заполнить дерево нужной структурой XML:

П = Новый Структура();

П.Вставить("Кодировка", Ч.КодировкаИсточника);

Дерево = Новый ДеревоЗначений();

Дерево.Колонки.Добавить("Тег");

Дерево.Колонки.Добавить("Тело");

Дерево.Колонки.Добавить("Атрибуты");

Дерево.Колонки.Добавить("Тип");

П.Вставить("Дерево", Дерево);

 

Чтобы записать дерево в XML строку, используется код вида:

З = Новый ЗаписьXML;

З.УстановитьСтроку(П.Кодировка);

___обСобратьXML(П, З);

РезСтрока = З.Закрыть();

 

Чтобы записать дерево в XML файл, используется код вида:

З = Новый ЗаписьXML;

З.ОткрытьФайл(ИмяФайла);

___обСобратьXML(П, З);

З.Закрыть();

 

В обработке для примера файл разбирается, а затем собирается. Можно посмотреть на различия после разборки-сборки.

Скачать файлы

Наименование Файл Версия Размер
down.zip 222
.zip 89,08Kb
09.02.12
222
.zip 89,08Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. stormtg stormtg (stormtg) 13.02.12 14:38
Хм, интересный взгляд, спасибо посмотрим
2. Осипов Сергей (fixin) 13.02.12 15:34
(1) ну что вы, это хит... взлетит еще...
3. Александр (Aragorn) 14.02.12 12:50
надо будет попробовать, только жалко инфорублей нет
4. Сергей (necropunk) 15.02.12 11:56
Хм... Потестируем. Писал похожую вещь когда-то, интересно будет сравнить.
5. fzt fzt (fzt) 15.02.12 12:41
Хм, а подключить через ActiveX готовый скрипт на VBS было бы проще.
Работу посмотрел - понравилось. Но её действительно было возможно избежать.
6. Осипов Сергей (fixin) 15.02.12 16:30
(5) смысл? суть этой разработки - работать с XML через привычный объект дерево. Т.е. тупой 1сник может ничего не знать об XML и тем не менее, с ним работать. Особенно актуально для тех, кто до сих пор использует DBF.
7. fzt fzt (fzt) 20.02.12 10:02
Солидарен, в такой форме постановки вопроса я тоже думаю что актуально =)
За offtopом можно оставить актуальность самого мм.. специалиста - как пользователя.
8. Алексей Новиков (Новиков) 20.02.12 10:07
мне не понятно, зачем использовать это, вместо того, что используется в типовых как де-факто?
9. Осипов Сергей (fixin) 20.02.12 10:37
(8) а что именно используется в типовых де-факто?
Моя разработка - для упрощения разбора XML для тех, кто там ни в зуб ногой. Но кто хорошо знает саму 1С и работу с деревом значений.
Да и сам я юзал эту функцию, когда юзал HTTP запросы. Там ответы приходили в виде небольшого XML и мне было проще кинуть ответ в дерево значений, чем писать парсингъ XML.


(7) че то я не понял о чем вы.
10. Алексей Новиков (Новиков) 20.02.12 11:47
(9) fixin, а что мешает открыть и взглянуть? :) Мне кажется, у вас - велосипед. Я не говорю, что это плохо. Просто хотелось понять - а зачем он, если можно утащить сие из типовой, с аналогичной функциональностью? :)
11. Осипов Сергей (fixin) 20.02.12 15:28
(10) я работаю с типовыми. Но до сих пор не могу понять, о чем вы собственно, ведете речь. Может это и велосипед, но это именно инструмент для тех, кому неохота париться с ХМЛ. Бац-бац и вместо ХМЛ уже дерево значений.
А вы о чем речь ведете? Что-то я никак не пойму ваших намеков.
12. amorhis (iotkin) 29.02.12 11:44
Большое спасибо за обработку. С удовольствием плюсую!!!
13. Владимир Клименко (KliMich) 13.03.12 15:36
Спасибо! Интересный подход
14. Максим *** (premier) 13.03.12 16:01
Минус - только за стиль программирования. Чтобы использовать этот код в своих целях, его придётся полностью переписывать! Важно не только то, ЧТО ты написал, но ещё и КАК ты это написал. Народ, как такой код читается, легко?
Кстати, на ИТС есть рекомендации по оформлению кода от 1С. Советую ознакомиться!
Seneka7608; fixin; +2 Ответить 1
15. Осипов Сергей (fixin) 13.03.12 16:36
(14) код писал давно, возможно форматирование еще старое. Я потом перешел на нормальное.
Но чтобы юзать, достаточно только вызывать нужную функцию. Не вижу проблем.
16. Алекс Ю (AlexO) 17.03.12 13:59
Загружал файл более 10Мб - зависла обработка.
Пробовал несколько раз.
и нет поиска.
17. Алекс Ю (AlexO) 17.03.12 16:49
Сергей, если интересно - могу сбросить xml
18. Осипов Сергей (fixin) 17.03.12 16:49
(16) а что вы хотели. Это тулза для чтения небольших XML. Она ведь разбирает XML в дерево. А размер коллекций в 1С ограничен. Для чтения больших ХМЛ юзайте ЧтениеХМЛ.
19. Алекс Ю (AlexO) 17.03.12 16:52
(18) fixin,
тогда печально все....
ЧТо за обработка "ЧтениеХМЛ"? что вы под ней подразумеваете?
20. Алекс Ю (AlexO) 17.03.12 16:54
И данная обработка - только для файлов до 5МБ?
21. Осипов Сергей (fixin) 17.03.12 23:07
(19)(20)
ничего печального нет. Часто надо парсить маленькие XML.
А большие XML в любом случае надо читать через последовательное чтение. В 1с для этого есть объект ЧтениеXML.
Вообще существуют два способа разбора XML - или вы его целиком загружаете в память (как в моем методе) или последовательно читаете из файла.
Чудес не бывает.
22. Misha ⁠ (Magister) 17.03.12 23:30
Делал относительно недавно что-то наподобии, но ещё и с автоматическим преобразованием типов - как простых, так и ссылочных.
Соответствие типов задается через макет, так же контроль заполненности реквизитов.
Стоит публиковать?
23. Осипов Сергей (fixin) 18.03.12 00:31
(22) если ты не заново изобрел XDTO, то публикуй
24. Алекс Ю (AlexO) 22.03.12 11:17
Кстати, а ведь есть XML_парсеры, которые прекрасно и быстро грузят много мегабайтные xml-ки в дерево...
25. Осипов Сергей (fixin) 22.03.12 11:53
(24) проблема не в том, что у меня плохой парсер (у меня как раз последовательный парсер Чтение XML, который память не напрягает). Проблема в том, что коллекции в 1С (дерево, например) большого размера не выживают.
26. Алекс Ю (AlexO) 22.03.12 12:03
(25) fixin,
т.е. с коллекцией Дерево в 1с какие-то проблемы?
ведь в тех, других, парсерах тоже в дереве все выводится...
насчет памяти не скажу, но очень быстро.
27. Осипов Сергей (fixin) 22.03.12 12:27
(26) у меня тоже в дерево все очень быстро выводится. Но огромное дерево просто тупо вешает 1с. Проблема была именно в этом. ;-) Кстати, большие XML файлы поэтому и не читаются через парсеры а-ля DOM, что памяти не хватает. Только последовательно!
28. Алекс Ю (AlexO) 22.03.12 14:50
(27) fixin,
ну хотите, поделюсь парсером - и не вешает, и открывает большие файлы ))
внутри еще не копался - не скажу, DOM там, или не DOM...
29. Осипов Сергей (fixin) 22.03.12 16:28
(28) делитесь, но смотреть некогда. ;-)
30. Алекс Ю (AlexO) 22.03.12 17:32
(29) fixin,
с сайта MyKoD.info:
Прикрепленные файлы:
XML редактор v1.epf
31. Алекс Ю (AlexO) 22.03.12 17:35
(29) fixin,
или вот, разработала некая девушка Маша, доработал o-Planet:
парсер XML
32. Осипов Сергей (fixin) 22.03.12 17:56
(30)(31) и какие файлы ты туда пробовал заливать по размеру? 10-мбайтовый файл пробовал загружать?