Поиск по блогу

Показаны сообщения с ярлыком XMLDocument. Показать все сообщения
Показаны сообщения с ярлыком XMLDocument. Показать все сообщения

среда, 27 августа 2008 г.

Парсинг XML на Delphi

Начнем с самого простого — с синтаксического анализа документа формата XML. Этот документ имеет четкую структуру и как нельзя лучше подходит для начала изучения парсинга. Еще один приятный момент — для парсинга XML нам пока даже не пригодится умение составлять регулярные выражения (это не значит, что их не надо знать :) ).

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

Итак, прочитали? Проверим, понимаем ли мы друг друга. Вот скрин ссылки http://newyorg.myminicity.com/xml, как ее видит Firefox (вставляю рисунком, так как блоггер что-то не очень любит подобного рода код).


City — корневой элемент. Элементы: host, name, region, ranking и т.д.. Атрибуты: code (у элемента region, значение атрибута — "RU"), com, env, ind, sec, tra (атрибуты элемента bases, каждый атрибут имеет числовое значение). Обратите внимание, что bases — пустой элемент. Сходится с теорией?

Рассмотрим стандартный компонент Delphi, позволяющий работать с XML. Это TXMLDocument с вкладки Internet, с которой нам в будущем придется еще поработать.



Компонент можно положить на форму, а можно создавать динамически по мере надобности.

Итак, создаем форму, помещаем на нее компонент и 5 компонентов TEdit. В первый мы запишем содержимое элемента population, в 4 остальных — значения атрибутов ind, tra, sec, env. Все это делается чрезвычайно просто. В обработчике нажатия кнопки, например, пишем:


XMLDocument1.LoadFromFile('http://newyorg.myminicity.com/xml');
XMLDocument1.Active := true;
Edit1.Text := XMLDocument1.DocumentElement.ChildNodes['population'].Text;
Edit2.Text := VarToStr(XMLDocument1.DocumentElement.ChildNodes['bases'].Attributes['ind']);
Edit3.Text := VarToStr(XMLDocument1.DocumentElement.ChildNodes['bases'].Attributes['tra']);
Edit4.Text := VarToStr(XMLDocument1.DocumentElement.ChildNodes['bases'].Attributes['sec']);
Edit5.Text := VarToStr(XMLDocument1.DocumentElement.ChildNodes['bases'].Attributes['env']);
XMLDocument1.Active := false;

Подведем итоги.

Чтение атрибута узла можно произвести так:
Root.GetAttribute(WideString('NodeName'));
(где Root — элемент)

Так работать можно, естественно, не только с корневым элементом, но и с его дочерними узлами:
Root.ChildNodes.Nodes[i].GetAttribute(WideString('NodeName'));

Запись атрибута:
Root.SetAttribute(WideString('NodeName'),'NodeValue');

Количество дочерних узлов определяем:
Root.ChildNodes.Count;

Вот и все. Мы получили все, что хотели, плюс начальные навыки работы с компонентом TXMLDocument.

Поделиться