Delphi → Использование XML в Delphi (msxml_tlb)
У многих программистов Delphi, сохранение настроек ассоциируется с использованием INI файлов в своих программах. Применение данного метода, в более менее серьезных проектах, необходимо избегать, так как это ограничивает в гибкости, что препятствует дальнейшему расширению программы. Стоит сказать, что такой подход достаточно популярен, в силу своей простоты использования и наличия встроенных средств в среду разработки.
Тем не менее, идеальным вариантом для хранения настроек программы являются структурированные XML файлы. Их преимущество заключается в том, что количество параметров может быть не фиксированным. Чтобы лучше это понять, рассмотрим конкретный пример.
В программе USearch, при клике по записи, появляется
Применяя подход с использованием 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
, который в качестве параметра принимает строку
Размер: 43.5 kB – Скачиваний: 75 – Скачан последний раз: 26.11.2011 13:32
Похожие статьи:
Алексей
Август 25th, 2011 at 12:58 #
Имхо лучше использовать TNativeXML
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 стараюсь использовать только там где без него не обойтись.
GlooK
Август 25th, 2011 at 13:18 #
Item2Name = Трейсроут
Item2Command = tracert 10.0.0.1
…
Item100500Name = arp-таблица
Item100500Command = arp -a
Хорошо. Например, у вас есть 1000 параметров. Вам нужно между 47 и 48 добавить еще одну команду (положение имеет значение). Как быть тут? Переименовывать 950 элементов?
Пример с 100500 пронумерованных элементов и подсекциями – это пример, простите, говнокодига. Для студента первокурсника сойдет, но не более.
fcoder
Август 26th, 2011 at 12:29 #
Если судить с точки зрения файлового ввода-вывода (наиболее узкое место по производительности), то разницы нет – файл и там и там после 47-го элемента полностью перезаписывается.
а порядковые номера хранить отдельно в памяти не надо (они и так хранятся в качестве порядкового номера элемента массива/списка). Они там просто чтобы не нарушать соглашения формата .ini