gifts2017

XML-парсер "от О-Планета"

Опубликовал Олег Пономаренко (O-Planet) в раздел Программирование - Практика программирования

Парсер реализован средствами языка. Поставляется в виде внешней обработки. Может использоваться, как обработка, к методам которой можно обращаться из программы. Также модуль парсера может быть вставлен отдельно в конфигурацию, в качестве общего модуля. Реализованные методы поддерживают объектно-ориентированный принцип работы и предоставляют интуитивно понятный механизм.

Не спрашивайте, чем плохи стандартные методы работы с XML, реализованные в восьмерке. Просто разные парсеры и компиляторы - это моя слабость. Ну а потом, не видел (но, может, и ошибаюсь), чтобы стандартный парсер сразу выплевывал на форму дерево структуры XML-документа, позволял его редактировать, а потом снова сохранял в xml-документ.

В общем, эта обработка поможет тем, кто по каким-либо причинам не хочет (не может, боится) использовать типовые функции работы с XML. С "парсером от планета" XML - это просто! :)

Берите, тестируйте, пользуйтесь. Разработка снабжена подробной инструкцией.

Буду очень рад комментариям.

 


Отвечая на вопрос Чебуратора: "... а сабж - это что???", приведу небольшие примеры кода. Парсер позволяет читать, разбирать и создавать XML-файлы на интуитивном уровне.

Примеры создания xml:

ХМЛ = ХМЛСоздать();
Параметры = Новый Соответствие;
Параметры.Вставить("Название","Рога и копыта");
ХМЛДобавить(ХМЛ,"Организация",Параметры);
ХМЛДобавить(ХМЛ,"Сотрудник",, "Иванов", Истина);
ХМЛДобавить(ХМЛ,"Сотрудник",, "Петров", Истина);
ХМЛДобавить(ХМЛ,"Сотрудник",, "Сидоров", Истина);
Параметры.Вставить("Название","Бананы и ананасы");
ХМЛДобавить(ХМЛ,"Организация",Параметры);
ХМЛДобавить(ХМЛ,"Сотрудник",, "Дарт Вейдер", Истина);
ХМЛДобавить(ХМЛ,"Сотрудник",, "Джа-джа Бинг", Истина);
ХМЛДобавить(ХМЛ,"Сотрудник",, "Скайвокер", Истина);
ХМЛДобавить(ХМЛ,"Сотрудник",, "Чебурашка", Истина);
ХМЛЗаписать(ХМЛ,"c:\mydoc.xml");
ХМЛЗакрыть(ХМЛ);

Примеры чтения XML:

ХМЛ = ХМЛОткрыть("c:\mydoc1.xml");
Если ХМЛПрочитать(ХМЛ,"Сотрудник",Возвр) Тогда
    Сообщить(СтрокуИзВеб(Возвр["Содержание"]));
КонецЕсли;
ХМЛЗакрыть(ХМЛ);

ХМЛ = ХМЛОткрыть("c:\mydoc.xml");
Если ХМЛПрочитать(ХМЛ,"Организация",Возвр) Тогда
    СтрокаСотрудники = Возвр["Содержание"];
    Пока Истина Цикл
        Тег = Неопределено;
        Если ХМЛПрочитатьИзСтроки(СтрокаСотрудники,Тег,Возвр) Тогда
            Сообщить(Тег + ": " + СтрокуИзВеб(Возвр["Содержание"]));
        КонецЕсли;
    КонецЦикла;
КонецЕсли;
ХМЛЗакрыть(ХМЛ);

Пример построения дерева:

ХМЛ = ХМЛОткрыть("c:\mydoc.xml");
ХМЛРазобрать(ХМЛ,ДеревоОбработки);
ЭлементыФормы.ДеревоОбработки.СоздатьКолонки();
ХМЛЗакрыть(ХМЛ);

 


Обновил обработку. Добавил возможность выбора кодировки при чтении и записи файла. Также нашел примеры нестандартных XML, которые тоже теперь отрабатываются корректно.

Не отрабатывались XML без отдельного закрывающего тега. Такие XML - не есть канон. Но теперь и они нормально воспринимаются парсером.

***

Посмотрел-посмотрел на это чудо, добавил на форму командную панельку, привязал ее к дереву, а в состав методов прописал формирование XML-файла по структуре дерева. Вот и получился редактор. Теперь можно загрузить любой XML-файл, изменить в нем что-то в таблице дерева и сохранить снова в XML. При этом, можно перекодировать. Думаю, особо одаренные, кому эта тема интересна, могут добавить кучу разных полезностей. Например, чтобы можно было сразу добавлять что-то по данным из документов, реквизитов элементов справочника... Да мало ли что можно сделать, чтобы работать было быстро и удобно.

Обновление:

30.09.09 18:42 - Появилась полоса загрузки и парсится при построении дерева теперь в десятки тысяч раз быстрее. Исправил ошибку с кодировкой при записи.

30.09.09 19:17 - Исправил некорректную отработку специальных символов при парсинге

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

Наименование Файл Версия Размер
ХМЛ-Парсер 665
.zip 27,92Kb
05.10.09
665
.zip 27,92Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Василий Сидоров (Bambrlog) 29.09.09 08:53
2. Игорь <...> (I_G_O_R) 29.09.09 09:17
ну раз такая любовь, жду компилятор ;)
3. Игорь Белышев (biv75) 29.09.09 14:10
Отличная вещь, на этапе отладки не заменима, поддерживаю (2)
4. Serg Eli (elizarovs) 29.09.09 15:01
С собственно парсером понятно. Вопрос по форме, в смысле по ее функционалу. По скриншоту, вроде, при выборе файла в рабочем поле должна была раскрыться структура выбранного файла. С кодом подробно не разбирался пока, но несколько наугад выбранных файлов XML, в том числе выгруженный из 1С для обмена "по правилам", оставили окно пустым.
В модуле объекта в функции ХМЛПрочитать() (стр.183) при проверке
Если ХМЛ["Поз"]>ХМЛ["Текст"].КоличествоСтрок() Тогда
сразу оказывается, что ушли за конец документа
:cry:
5. Андрей Пастухов (Minotavrik) 29.09.09 17:21
Как раз нужно, а то глаза режет уже xml теги глазками смотреть ;)
6. Сергей (Che) Коцюра (CheBurator) 29.09.09 18:11
эээ не понял... народ угается на тормознутость мелкомягкого парсера, а парсер на 8-ке - он что БЫСТРЕЕ БУДЕТ??? или я не в теме?
7. Сергей (Che) Коцюра (CheBurator) 29.09.09 18:12
или это просто смотрелка очередная..???
8. Сергей Ожерельев (Поручик) 29.09.09 18:47
Автор, а обработка-то рабочая? Перепробовал несколько разных файликов xml, окно тэгов пустое. Или ей какие-то особые файлы нужны?
9. Валерий Агеев (awa) 29.09.09 18:56
Странно не хотеть (не мочь, бояться) использовать типовые функции работы с xml (проверенные и оттестированные тысячами программистов), но при этом хотеть (мочь, не бояться) использовать "парсер от планета"...
Беглый взгляд на код, говорит о том, что обрабатываются только файлы в кодировке "windows-1251". Означает это только одно, что "парсер" очень сырой, и лично я боюсь его использовать.
10. Сергей (Che) Коцюра (CheBurator) 29.09.09 19:12
есть хороший нормальный быстрый редактор эксемеля, написанный 1сником, есть разработки позволяющие посмотреть структуру иксемеля - то есть построить дерево используемых тегов
.
- а сабж - это что???
11. Олег Пономаренко (O-Planet) 29.09.09 21:31
Отвечаю. Не тестировал на "неправильных" xml. Не знаю, какие "неправильные" xml бываю. Свой парсер использую при разных выгрузках/загрузках, когда нужно быстро сохранить в файл параметры настройки и потом их прочитать. Парсит документы следующей структуры:

<?xml ... ?>
<тег>
<тег>
...
</тег>
</тег>
<тег>
<тег>
...
</тег>
</тег>
...

Про windows-1251 не загружался. Выбор кодировки можно добавить парой строк. Но, думаю, не нужно. Если у кого-то что-то не отпарсило, то буду признателен за примеры xml в личку.

12. Олег Пономаренко (O-Planet) 29.09.09 21:31
О как!!! Порезались теги ))
13. Олег Пономаренко (O-Planet) 30.09.09 01:37
Обновил обработку. Добавил возможность выбора кодировки при чтении и записи файла. Также нашелпримеры нестандартных xml, которые тоже теперь отрабатываются корректно.

Не отрабатывались xml без отдельного закрывающего тега. Такие xml - не есть канон. Но теперь и они нормально воспринимаются парсером. Качайте.
14. Олег Пономаренко (O-Planet) 30.09.09 04:50
Чой-то мну осенило... Добавил командную панельку на форму, привязал ее к дереву и получился xml-редактор. Разумеется, все, что наредактировано, можно снова записать в xml-файл.
15. Сергей Ожерельев (Поручик) 30.09.09 11:14
Лажа какая-то. Опять попробовал разные файлы, хрен эффекта.
16. Олег Пономаренко (O-Planet) 30.09.09 13:50
(15) Действительно, лажа. Вышли хоть один. У меня все летает.
17. Сергей Ожерельев (Поручик) 30.09.09 14:20
Куда выслать? Напиши в приват.
18. Saw (Re:аниматор) 30.09.09 17:34
Создал в обработке файл, сохранил. кодировка UTF8 !
открываю через IE

Не удается отобразить страницу XML
Не удается просмотреть ввод XML с использованием списка стилей . Исправьте ошибку и затем нажмите кнопку "Обновить"или повторите попытку позднее.


--------------------------------------------------------------------------------

Переключение с текущей кодировки на указанную не поддерживается. Ошибка при обработке ресурса ''file:///C:/OBMEN/2.xml''. ...

<?xml version="1.0" encoding="windows-1251" ?>

19. Олег Пономаренко (O-Planet) 30.09.09 18:35
(17) Твой файл просто грузится жутко медленно. И он - в UTF-8. Т.е., нужно выбирать кодировку. Вобщем, подумал немного, и кое-что там подправил. xml теперь парсится в ... десятки тысяч раз быстрее. (Видишь, как ты реально помог :) ) Качай, проверяй. Не забудь выбрать правильную кодировку. Смотри скрин. Там как раз твой файл с правилами.

Кстати, отключил автозагрузку файла при выборе. Нужно теперь жать кнопку в меню.

(18) Исправил.
20. Олег Пономаренко (O-Planet) 30.09.09 18:40
Всем, кто скачал до этого момента, рекомендую скачать обновление.
21. Сергей Ожерельев (Поручик) 30.09.09 18:47
(19) вот теперь зачёт. :D
Особенно за скрин с названием нашей конторы. Пусть мои "друзья" знают, откуда я что беру.
22. Олег Пономаренко (O-Planet) 30.09.09 19:13
+ еще поймал ошибку, связанную со специальными символами. Теперь полностью файл Поручика читает.
23. Олег Пономаренко (O-Planet) 30.09.09 19:13
(21) Убрать скрин с названием конторы? ))
24. Сергей Ожерельев (Поручик) 30.09.09 20:26
зачем, пусть будет. бояться мне нечего.
25. Олег Пономаренко (O-Planet) 01.10.09 17:10
Ы. А я убрал.

Хотел бы спросить тех, кто с аналогичными парсерами работал. Как оно по скорости? Удобству? Приемлемо?
26. Сергей Ожерельев (Поручик) 01.10.09 17:39
Я некоторое время плотно работал с
http://infostart.ru/public/15835/ - (вогнал в базу во внешние обработки)
http://infostart.ru/public/15464/

Эти быстрее, но с закрытым кодом. А по удобству почему-то ни один не устроил, постоянно переключался между ними.
27. Олег Пономаренко (O-Planet) 02.10.09 04:55
(26) Ага. Посмотрел первый. Хороший. По ходу, использует функции среды, а не собственные.
28. Serg Eli (elizarovs) 02.10.09 09:08
(20) Ну, слава Богу! +. А то уж минусовать собирался )
29. Сергей (strange2007) 03.10.09 13:36
Что-то ошибка при удалении элемента
{Форма.Форма(77)}: Ошибка при установке значения атрибута контекста (Теги): Выполнение операции невозможно, т.к. строка была удалена.
БылаСтрока["Теги"]=Редактор;
по причине:
Выполнение операции невозможно, т.к. строка была удалена.

Может что не так делаю?
30. Олег Пономаренко (O-Planet) 05.10.09 01:13
31. Серьгу Алтунь (Паро цёра) 06.10.09 11:08
// Открыть ХМЛ файл для чтения
// Возвращает переменную открытого файла (соответствие)
Функция ХМЛОткрыть(ИмяФайла,Знач Кодировка=Истина) Экспорт
	Если ТипЗнч(Кодировка)=Тип("Булево") Тогда
		Кодировка=КодировкаТекста.ANSI;
	КонецЕсли;	
	Текст=Новый ТекстовыйДокумент;
	Попытка
		Текст.Прочитать(ИмяФайла,Кодировка);
	Исключение
	    Возврат Неопределено;
	КонецПопытки;
	
	Кол		= Текст.КоличествоСтрок();
	П		= 0;
	Стр		= "";
	Ост		= "";
	Найд	= Ложь;
	Пока П < Кол Цикл
		П	= П + 1;
		Стр	= НРег(СокрЛП(Текст.ПолучитьСтроку(П)));
		Если Найти(Стр,"<?xml") <> 0 Тогда
			Найд	= Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;	
	Если Найд Тогда
		ПП=Найти(Стр,"?>");
		Если ПП>0 Тогда
			Ост=Сред(Стр,ПП+2);
		Иначе
			Ост="";
		КонецЕсли;
	Иначе
		П = 0;//в выгрузках правил из КД 2.0 например именно этот случай
	КонецЕсли;	
	
	ХМЛ=Новый Соответствие;
	ХМЛ.Вставить("Текст",Текст);
	ХМЛ.Вставить("КоличествоСтрок",Текст.КоличествоСтрок());
	ХМЛ.Вставить("Режим","Чтение");
	ХМЛ.Вставить("КонецФайла",Ложь);
	ХМЛ.Вставить("Поз",П);
	ХМЛ.Вставить("__ОстатокСтроки",Ост);
	ХМЛ.Вставить("__Читать",(П<=Кол));
	Возврат ХМЛ;
КонецФункции	
...Показать Скрыть


так лучше
32. Сергей Старых (tormozit) 08.10.09 14:20
А че на файл то все заточено? А ежели у меня строка?)
33. Павел Б (lame) 15.10.09 04:09
ну у меня не хотит разбирать мой хмл ... вот структура

<?xml version="1.0" encoding="windows-1251"?>
<jcanswer>
<message>
<result >SUCCESS</result >
Код
N0407_BILLING_SUCCESS
Показать полностью

<action >detail</action >
<group id="billing" area="none"><![CDATA[Обработка данных биллинга]]></group >
<datetime >2009-10-14 18:05:44</datetime >
<text ><![CDATA[Данные о возможности проведения операции получены]]></text >
<techinfo >
<summary>
<parts>
<free>
<count>0</count >
<atom_cost>0</atom_cost >
<cost>0</cost >
</free>
<cash>
<count>100</count >
<atom_cost>0.525</atom_cost >
<cost>52.5</cost >
</cash>
</parts>
</summary>
<result>1</result >
<posible>yes</posible >
<cost>52.5</cost >
<currency_id>4</currency_id >
</techinfo >
</message>
</jcanswer>
34. Серьгу Алтунь (Паро цёра) 16.10.09 16:04
CDATA, Comment, Processing Instruction - не обрабатывает.
35. Модератор раздела Артур Аюханов (artbear) 19.02.12 18:12
Подниму тему.
С ХМЛ работаю редко, поэтому единого кода нет :(
Для текущей задачи решил воспользоваться сабжем и на некоторых файлах получил ошибки.
Например, для файлов со слешем внутри значения (пример)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<N P="1/2">
</N>
будет выдано значение P, равное 12, т.е. неверное, должно быть 1/2
или для другого файла (пример)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<L>
<M>
<N P="1/2">
</N>
</M>
</L>
вообще узел N не будет показан.
Я показал упрощенные простейшие файлы, в реальности пришлось разбираться с большими файлами, отсекая лишнее и получая простейшие тестовые файлы.
Внес исправления в обработку для исправления последнего бага.
Если кому-нибудь нужно, могу выложить свою версию.

ЗЫ а вообще кто какими-программными средствами пользуется для программного разбора хмл-файлов?
есть ли еще какие-то обработки с открытым кодом, которые собирают дерево 1С из хмл-файла?
36. sbv2005 (sbv2005) 15.06.12 11:22
Файл так и не показывается в поле ... (( Почти минус
37. Алекс Ю (AlexO) 15.06.12 11:38
(35) artbear,
есть ли еще какие-то обработки с открытым кодом, которые собирают дерево 1С из хмл-файла?

есть.
У гения1С есть разработка "Сборка-разборка XML", собирает в дерево - но она не работает с большими файлами.
Вообще, на инфострате нет даже "просто посмотреть XML" достаточно законченных разработок по XML - все сыроваты.
Сам пользуюсь разработкой с другого ресурса.
Но все это - никак не работает с данными, содержащимся в XML, поэтому для поиска (а во многих и поиска-то никакого нет) и обработки ошибок все эти вьюверы бесполезны.
38. Алекс Ю (AlexO) 15.06.12 11:40
(36) sbv2005,
по-моему, это вы рекомендовали там что-то из SQL использовать для обоработки XML... из IBM разработок...
так что - ждем подробного отчета :)
39. sbv2005 (sbv2005) 16.06.12 12:23
(38) Или вы меня с кем то путаете, или можно поподробней.
40. юрий гулидов (gull22) 22.01.15 14:16
Конвертировал под 8.2.Запустил в Комплексной конфигурации,попытался исправить значение. Поправить то поправил,но вот сохранить не удалось.Значок записи изменений не активен.