Використання xml в delphi (msxml_tlb)


У багатьох програмістів Delphi, збереження налаштувань асоціюється з використанням INI файлів в своїх програмах. Застосування даного методу, в більш менш серйозних проектах, необхідно уникати, так як це обмежує в гнучкості, що перешкоджає подальшому розширенню програми. Варто сказати, що такий підхід досить популярний, в силу своєї простоти використання і наявності вбудованих засобів в середу розробки.

Проте, ідеальним варіантом для зберігання налаштувань програми є структуровані XML файли. Їх перевага полягає в тому, що кількість параметрів може бути не фіксованим. Щоб краще це зрозуміти, розглянемо конкретний приклад.

У програмі USearch. при кліці по запису, з'являється контекстне меню. в якому відображається список пунктів. Ці пункти є командами, які в свою чергу завантажуються з файлу налаштувань. У разі, якби настройки зберігалися в INI файлі, то програма могла б зберігати і завантажувати певну кількість команд, наприклад 10 або 50. Як тільки буде потрібно більше значення, доведеться заново переписувати код і відповідно повторно компілювати його.

Використання xml в delphi (msxml_tlb)

Застосовуючи підхід з використанням XML файлів, у нас з'явиться можливість завантажувати всі параметри секції динамічно. До всього цього, файл конфігурації стане більш витонченим, без надмірної нумерації параметрів. Однак, стандартні засоби для роботи з XML в Delphi мають безліч недоліків, тому рекомендую використовувати стандартну бібліотеку MSXML. Зазвичай вона за замовчуванням входить до складу операційних систем сімейства Windows.


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

Для наочності, розглянемо наступний приклад застосування цієї бібліотеки:

Спочатку створюється екземпляр класу DOMDocument. після чого в пам'ять завантажується вміст файлу settings.xml. Так як за стандартом будь XML файл повинен містити кореневої тег (в даному випадку config), то нам необхідно його отримати, використовуючи функцію DocumentElement. Потім відбувається виведення вмісту між тегами . які в свою чергу знаходяться між тегами . Таким чином з файлу settings.xml. наш метод виведе в MessageBox текст "100px".

Тут застосований метод SelectSingleNode. який в якості параметра приймає рядок XPath. Рекомендую вивчити мову запитів XPath, так як опанувавши їм можна творити воістину дивні речі.

Часто переміщаюся по місту з нетбуком і тому мені необхідний мобільний доступ в інтернет. Однак, використовувати 3G модеми, в даному випадку, не найвдаліший варіант, так як швидкість з'єднання не завжди стабільна. Залишається тільки сподіватися на появу дешевого wimax провайдера в нашому місті. Ця технологія може охоплювати все місто і при цьому давати високу швидкість мобільного інтернету.

Невдалий приклад.
Для будь-якої кількості пунктів можна зробити 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 намагаюся використовувати тільки там де без нього не обійтися.

Item2Name = Трейсроут
Item2Command = tracert 10.0.0.1
...
Item100500Name = arp-таблиця
Item100500Command = arp -a

Добре. Наприклад, у вас є 1000 параметрів. Вам потрібно між 47 і 48 додати ще одну команду (положення має значення). Як бути тут? Перейменовувати 950 елементів?

Приклад з 100500 пронумерованих елементів і підсекціями - це приклад, вибачте, говнокодіга. Для студента першокурсника зійде, але не більше.

Якщо судити з точки зору файлового введення-виведення (найбільш вузьке місце по продуктивності), то різниці немає - файл і там і там після 47-го елемента повністю перезаписується.

а порядкові номери зберігати окремо в пам'яті не треба (вони і так зберігаються в якості порядкового номера елемента масиву / списку). Вони там просто щоб не порушувати угоди формату .ini