XML у Delphi та недійсні простори імен (xmlns)

xmlns
Здавалося б, така дрібниця - видалити з вузла IXMLNode порожній аттрибут xmlns, а нервів витратив :) . Що в принципі нам надає Delphi для роботи з XML? Можу перерахувати тільки те, з чим я працював – це модулі xmldoc, xmldom, xmlIntf, msxml…начебто зі стандартних усі модулі. Можна ще довго перераховувати сторонні компоненти та модулі типу simpleXML і т.д., але мені необхідно було реалізувати задуманетільки з використанням модулів, що входять до складу Delphi за умовчанням. А завдання було досить просте - відправити запит, який містить певний XML-документ, на сервер (Googl'у) і створити новий Календар. Тобто скористатись можливостями API Google Celendar.

Формат документа – простіше нікуди:

Створити такий документ – справа п'яти хвилин. Єдиний момент, який слід враховувати – це оголосити простору імен (xmlns) у кореневому вузлі, інакше Google не приймає такий документ і виникає помилка. У своїй роботі я найчастіше використовую для роботи з інтерфейсом XMLIXMLDocument. На цей раз вирішив вчинити також. Ось як виглядав код на самому початку:

Аналогічно додавалися і вузлиgCal:. У результаті отримуємо такий документ:

Зверніть увагу на порожні атрибути xmlns у перших двох вузлів. Відправляючи такий документ Googl'у отримуємо помилку "Календар, що додається, не має назви", тобто. якраз вузла title.

Якщо прибираємо з кореневого елемента:

То вузли title і summary записуються нормально, але знову ж таки Google посилає такий документ у піч. Щоб хтось із Вас, шановні читачі, не робив теж “танці з бубном” при роботі з XML (все-таки цей пост я пишу більше для новачків у ледве роботи з XML) я перерахуюте, що робитимарно. Отже, при використанніIXMLDocument Вине позбавитеся порожніх атрибутів xmls у вузлі, якщо:

1. Спробуйте додати простору імен після того, як згенеруєте всі вузли. Як тільки ви впишіть простір імен у кореневий елемент, Ви автоматично отримаєте той самий порожній xmlns=””;

2. Спробуйте видалити атрибут із вузла. Цей варіант, на простоту, що здається, теж не проходить. Приклад видалення атрибуту з вузла:

Під час виконання цього коду функція Remove поверне Вам 1, тобто. як би атрибут видалений ... а документ отримаємо знову "кострубатий".

3. Не допомогли маніпуляції з набором властивостей Options у документа.

Якщо Ви мали намір використати якийсь варіант із запропонованих вище – не використовуйте. Все одно не допоможе. Зачаток вирішення проблеми нагуглився на одному з буржуазних форумах, присвячених роботі з MSXML в C++. У Delphi вирішення проблеми з порожніми xmlns вирішується так (на прикладі того ж документа):

Якщо виконати цей код, отримаємо нормальний правильний XML-документ, без порожніх xmlns. Як виявилося, цей варіант роботи з вузлами є єдино правильним, коли в документі використовуються простори імен. Сподіваюся ця нотатка допоможе комусь уникнути зайвих проблем при роботі з XML у Delphi.