Пример чтения XML через XML DOM. Для 77 или 80, без разницы. Автор статьи: Гений 1С | Редакторы: romix
Последняя редакция №2 от 16.02.06


Ключевые слова: XML,DOM,парсинг


Так уж получилось, что ко мне в аську прет много народа, которые интересуются XML-парсингом. Видимо клиент созрел.
Я был испорчен компонентой v7plus.dll для 77, у которой был свой XML-парсинг, но после некоторых ее глюков понял, что все это от лукавого и обратился к чистому XMLDOM.
На mista.ru есть также собственный движок по парсингу XML, возможно он работает и быстрее, но не уверен, что он поддерживает все кодировки да и зачем изобретать велосипед, лучше один раз изучить XML DOM и использовать его и в 1С, и в VBA и в Delphi и в PHP.

Вот пример, как можно разбирать XML код.
Пример написан на использовании стандартной компоненты Windows XMLDOM.
В 1С 8.0 имеется собственный парсер (разборщик) XML (объект ЧтениеXML), но он слишком специфический и обеспечивает только последовательное чтение файла от начала к концу. Пользоваться им не очень удобно, но парсит файлы он очень быстро. Однако начинать рекомендуется все-таки с XMLDOM.
Обратите внимание, что в отладчике 80 можно посмотреть все свойства COM-объекта, так что если чего-то не знаете, смотрите в отладчике.
Тип 1 – обычный элемент, содержащий в себе другие узлы или текст, тип 3 – собственно говоря текст, содержащийся в элементе.

Код:

Код 1c:
ФункцияПечатьУзлов(xmlDoc, Узел, Уровень=0)
Состояние(Уровень);
ЧислоДетей=Узел.childNodes.length;
Для Инд=1 По ЧислоДетей Цикл
ОбработкаПрерыванияПользователя();
ТекУзел= Узел.childNodes.item(Инд-1);
Если ТекУзел.nodeType<>1 Тогда
Продолжить;
КонецЕсли;
 
Стр="";
Для Инд1=1 По Уровень Цикл
Стр=Стр+" ";
КонецЦикла;
СтрАтрибуты="";
Для Инд2=1 По Узел.attributes.length Цикл
Атрибут=Узел.attributes.item(Инд2-1);
СтрАтрибуты=СтрАтрибуты+?(СтрАтрибуты="","",";")+Атрибут.nodename+"="+Атрибут.value;
КонецЦикла;
Текст="";
Если ТекУзел.childNodes.length=1 and ТекУзел.childNodes.item(0).nodetype=3 Тогда 
Текст=ТекУзел.childNodes.item(0).text;
КонецЕсли;
Стр=Стр+ТекУзел.tagName+?(СтрАтрибуты="","","("+СтрАтрибуты+")" ) + ":" +Текст;
Сообщить(Стр);
ПечатьУзлов(xmlDoc, ТекУзел, Уровень+1);
КонецЦикла;
КонецФункции
 
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика.
xmlDoc = Новый COMОбъект("Microsoft.XMLDOM");
xmlDoc.Load(ИмяФайла);
RootNode = xmlDoc.DocumentElement;
 
ПечатьУзлов(xmlDoc, RootNode, 0);
 
 
//MsgBox currNode.xml
xmlDoc=0;
КонецПроцедуры

Пример результата работы кода:

Код 1c:
title:Very Useful Journal
contacts:
address:sdsds
tel:8-3232-121212
tel:8-3232-121212
email:j@j.ru
url:[URL="http://www.kb.mista.ru/%3Cspan%20class="]http://www.j.ru" target="_blank">www.j.ru[/URL]
issues-list:
issue:
title(index=2):XML today
date(index=2):12.09.98
about(index=2):XML
home-url(index=2):[URL="http://www.kb.mista.ru/%3Cspan%20class="]http://www.j.ru/issues/" target="_blank">www.j.ru/issues/[/URL]
articles(index=2):
article:
title(ID=3):Issue overview
url(ID=3):/article1
hotkeys(ID=3):
hotkey:language
hotkey:marckup
hotkey:hypertext
article-finished(ID=3):
article:
title:Latest reviews
url:/article2
author:
hotkeys:
hotkey:
article:
title(ID=4):
url(ID=4):
hotkeys(ID=4):
authors-list:
author:
firstname(ID=1):Ivan
lastname(ID=1):Petrov
email(ID=1):vanya@r.ru
author:
firstname(ID=3):Petr
lastname(ID=3):Ivanov
email(ID=3):petr@r.ru
author:
firstname(ID=4):Sidor
lastname(ID=4):Sidorov
email(ID=4):Для просмотра ссылки необходимо зарегистрироваться (и подтвердить адрес электронной почты)