Delphi → Использование XML в Delphi (msxml_tlb)

Авг 24, 2011


У многих программистов Delphi, сохранение настроек ассоциируется с использованием INI файлов в своих программах. Применение данного метода, в более менее серьезных проектах, необходимо избегать, так как это ограничивает в гибкости, что препятствует дальнейшему расширению программы. Стоит сказать, что такой подход достаточно популярен, в силу своей простоты использования и наличия встроенных средств в среду разработки.

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

В программе USearch, при клике по записи, появляется контекстное меню, в котором отображается список пунктов. Эти пункты являются командами, которые в свою очередь загружаются из файла настроек. В случае, если бы настройки хранились в INI файле, то программа могла бы сохранять и загружать определенное количество команд, например 10 или 50. Как только потребуется большее значение, придется заново переписывать код и соответственно повторно компилировать его.


Применяя подход с использованием XML файлов, у нас появится возможность загружать все параметры секции динамически. Ко всему этому, файл конфигурации станет более изящным, без избыточной нумерации параметров. Однако, стандартные средства для работы с XML в Delphi имеют множество недостатков, поэтому рекомендую использовать стандартную библиотеку MSXML. Обычно она по-умолчанию входит в состав операционных систем семейства Windows.


Для подключения MSXML, нам необходимо сформировать файл интерфейса со списком всех функций, импортировав его из COM-сервера. Как импортировать интерфейс написано не мало подробных статей, я же предлагаю вам скачать файл MSXML2_TLB.PAS уже готовый к использованию. После того, как файл будет скачан, разместите его рядом с вашим проектом, либо закиньте в папку lib среды Delphi. Таким образом, все создаваемые программы смогут использовать модуль MSXML, достаточно лишь дописать в uses строчку MSXML2_TLB.

Для наглядности, рассмотрим следующий пример применения этой библиотеки:

procedure LoadData;
var
  XMLDoc: DOMDocument;
  Root: IXMLDOMElement;
begin
  XMLDoc := CoDOMDocument.Create;
  XMLDoc.Load('settins.xml');
  Root := XMLDoc.DocumentElement;
  ShowMessage(Root.SelectSingleNode('size/width').Text);
  Root := nil;
  XMLDoc := nil;
end;

Сначала создается экземпляр класса DOMDocument, после чего в память загружается содержимое файла settings.xml. Так как по стандарту любой XML файл должен содержать корневой тэг (в данном случае config), то нам необходимо его получить, используя функцию DocumentElement. Затем происходит вывод содержимого между тэгами <width></width>, которые в свою очередь находятся между тэгами <size></size>. Таким образом из файла settings.xml, наш метод выведет в MessageBox текст "100px".

<?xml version="1.0" encoding="utf-8"?>
<config>
	<size>
		<height>500px</height>
		<width>100px</width>
	</size>
</config>

Здесь применен метод SelectSingleNode, который в качестве параметра принимает строку XPath. Рекомендую изучить язык запросов XPath, так как овладев им можно творить поистине удивительные вещи.

Скачать msxml2_tlb.zip (msxml_tlb.pas для Delphi)
Размер: 43.5 kB – Скачиваний: 75 – Скачан последний раз: 26.11.2011 13:32

Часто перемещаюсь по городу с нетбуком и поэтому мне необходим мобильный доступ в интернет. Однако, использовать 3G модемы, в данном случае, не самый удачный вариант, так как скорость соединения не всегда стабильна. Остается только надеяться на появление дешевого wimax провайдера в нашем городе. Эта технология может охватывать весь город и при этом давать высокую скорость мобильного интернета.

Post to Twitter

Похожие статьи:

  1. Компонент Antigate для Delphi
  2. Привязка к железу в Delphi
  3. Установка Indy на Portable Delphi
  4. Взаимодействие Oracle и Delphi
  5. Portable Delphi

Комментарии (4)

  1. avatar

    Алексей
    Август 25th, 2011 at 12:58 #

    Имхо лучше использовать TNativeXML

  2. avatar

    fcoder
    Август 25th, 2011 at 13:10 #

    Неудачный пример.
    Для любого количества пунктов можно сделать ini-файл вида:

    [MenuItems]
    ItemsCount = 100500 <— Количество пунктов меню
    Item1Name = Пинг
    Item1Command = ping 10.0.0.1
    Item2Name = Трейсроут
    Item2Command = tracert 10.0.0.1

    Item100500Name = arp-таблица
    Item100500Command = arp -a

    Таким образом можно разворачивать любые списки, включая вложенные:

    [main]
    subSectionCount = 5

    [main.1]

    [main.2]


    [main.5]

    INI-формат гораздо проще и на порядок быстрее парсится. Тогда как для xml существует куча парсеров разных производителей различной степени скорости обработки документов и глючности.

    Мне в моих проектах всегда хватало INI. A xml стараюсь использовать только там где без него не обойтись.

  3. avatar

    GlooK
    Август 25th, 2011 at 13:18 #

    Item2Name = Трейсроут
    Item2Command = tracert 10.0.0.1

    Item100500Name = arp-таблица
    Item100500Command = arp -a

    Хорошо. Например, у вас есть 1000 параметров. Вам нужно между 47 и 48 добавить еще одну команду (положение имеет значение). Как быть тут? Переименовывать 950 элементов?

    Пример с 100500 пронумерованных элементов и подсекциями – это пример, простите, говнокодига. Для студента первокурсника сойдет, но не более.

  4. avatar

    fcoder
    Август 26th, 2011 at 12:29 #

    Если судить с точки зрения файлового ввода-вывода (наиболее узкое место по производительности), то разницы нет – файл и там и там после 47-го элемента полностью перезаписывается.

    а порядковые номера хранить отдельно в памяти не надо (они и так хранятся в качестве порядкового номера элемента массива/списка). Они там просто чтобы не нарушать соглашения формата .ini

Ваш комментарий

Rambler's Top100 Яндекс.Метрика