Книга знаний

1С:Предприятие / v8 / Приемы программирования / Обмен данными, УРБД

v8: Пример чтения XML через XML DOM

Пример чтения XML через XML DOM. Для 77 или 80, без разницы.Автор статьи: Гений 1С | Редакторы: romix
Последняя редакция №2 от 16.02.06 | История
URL: http://kb.mista.ru/article.php?id=99

Ключевые слова: 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 – собственно говоря текст, содержащийся в элементе.

Код:

ФункцияПечатьУзлов(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;
КонецПроцедуры


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

title:Very Useful Journal
contacts:
address:sdsds
tel:8-3232-121212
tel:8-3232-121212
email:j@j.ru
url:http://www.j.ru" target="_blank">www.j.ru
issues-list:
issue:
title(index=2):XML today
date(index=2):12.09.98
about(index=2):XML
home-url(index=2):http://www.j.ru/issues/" target="_blank">www.j.ru/issues/
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):sidor@r.ru
Закладка

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2011 | Mista.ru

Яндекс.Метрика