ColdFusion MX и XML: Создание и сохранение XML объекта

Представьте, что есть таблица в базе данных, где хранится информация о сотрудниках, которую нужно сохранить в XML формате. В этой статье будет использована база данных CFSnippets, которую можно установить вместе с ColdFusion.

Для создания и публикации XML документа CFMX предлагает два метода:

  1. "Текстовый" метод использует тег <cfxml> и позволяет моделировать XML дерево как текст также, как мы используем тег <cfoutput> для моделирования HTML вывода.
  2. "Объектная" модель подразумевает использование специальных функций ColdFusion для моделирования XML объекта.
Текстовый метод использовать значительно легче, но вам будет предложено оба метода, чтобы вы сами смогли сделать выбор.

 

Моделирование XML как текст

Текстовый метод строит XML структуру как текст, а затем конвертирует его в XML документ, сохраняя его в переменной. Сначала создадим модель XML структуру внутри пары тегов <cfxml>:

В приведенном примере тег <cfxml> создает новый XML документ и помещает его в переменную xmlDoc. Структуру созданного XML объекта можно легко просмотреть с помощью тега <cfdump>:

Структура XML объекта

 

Добавляем данные

Предполагая, что информация находится в базе данных, то перед вызовов <cfxml> следует добавить <cfquery>. Содержимое полученного запроса можно добавить в XML документ с помощью тега <cfoutput>:

Если в данных могут встретиться такие зарезервированные символы, как амперсанд (&), кавычки (") или квадратные скобки ("<" или ">"), то данные следует предварительно обработать функцией XMLFormat(). Эта функция заменяет такие символы на их эквиваленты и гарантирует, что XML оформлен правильно:
Обратите внимание, что теги элементов не выделены с помощью пробелов или табуляции. Добавление таких отступов для удобства чтения кода допустимо в HTML, т.к. браузер их не учитывает. В XML это значит, что вы изменяете данные.

Итак, XML документ создан. Полный код, создающий и сохраняющий XML документ будет выглядеть так:

И созданный XML файл будет выглядеть так:

 

Функция toString()

Чтобы сохранить данные, нам следует конвертировать XML документ в текст. Для этого весь XML объект следует поместить в функцию toString(). Например, чтобы опубликовать XML документ в текстовый файл, используйте код:

Функция toString() всегда добавляет в начале строки объявление и кодировку XML документа.

 

Моделирование XML как объекты

Объектный метод создания XML файлов использует две XML функции:

  1. XMLNew() – создает новый XML документ;
  2. XMLElemNew() – создает новый XML элемент.
Начнем с XMLNew(). Эта функция возвращает пустой XML документ:
Документ первоначально не хорошо оформлен, т.к. не содержит каких-либо элементов. Поэтому далее мы создадим вложенный элемент. Функция XMLElemNew() принимает два аргумента: XML документ, где следует создать элемент, и имя создаваемого элемента.

Документ содержит встроенный корневой вложенный элемент под именем xmlRoot. Обозначая новый элемент как корневой, следует создать корневой элемент документа:

По мере того, как XML иерархия становится глубже, то синтаксис для обращения к определенным элементам может стать неуправляемым. Поэтому теперь мы создадим переменную, которая будет указывать на только что созданный нами корневой элемент:
Каждый сотрудник имеет свой ID, который мы сохраним как XML атрибут. Каждый элемент имеет свою встроенную структуру, называемую XMLAttributes. Добавляя запись в структуру, мы добавляем атрибут в элемент:
Каждый сотрудник имеет набор значений, которые мы сохраним как вложенные элементы. Мы снова используем функцию XMLElemNew(), чтобы создать новый элемент, а затем значению встроенного свойства XMLText присвоим значение из запроса. Для правильного форматирования данных здесь не нужно использовать XMLFormat(), т.к. объектный метод делает это за нас:
Повторите этот шаг для каждого вложенного элемента, который нужно опубликовать. Когда мы запустим код, то получи XML документ, наполненный данными.

На этот раз, вместо сохранения файла на диск, мы опубликуем XML через HTTP соединение. Перед выводом данных в браузере используем тег <cfcontent>, чтобы установить выводимый тип данных как XML. Это позволит всем пользователям знать, что они получают правильный тип информации.

Код для объектного метода выглядит так:

 

Отступы между XML тегами

Возможно, вы заметили, что при использовании тега <cfxml> между тегами элементов гораздо больше отступов. Это нормально, поскольку XML анализатор не делает различия между большим и маленьким количествами отступов.

Впрочем, при использовании объектной версии мы получаем результат в одну строку, что затруднительно воспринимается человеческим глазом:
Для преобразования этой строки в более наглядный вид, использована функция xmlIndent(), которая находится в файле xmlUtilities.cfm:
Функция XMLIndent() пропускает XML документ через XSLT (Extensible Stylesheet Language Transformation) шаблон, который возвращает XML документ как есть, но с добавлением отступов, что делает код более читабельным. Функция XMLIndent() в качестве аргумента принимает XML документ и возвращает строковое представление объекта:

 

Ограничения

Оба представленных здесь метода имеют два ограничения:

  1. Только кодировка UTF-8: Функция toString() имеет атрибут "encoding", но он не применяется к XML документам. Тег <cffile> имеет атрибут "charset", чтобы считывать файл в разных кодировках, но он не учитывает кодировку, объявленную в XML файле;
  2. Нет объявлений типа документа: Нет встроенного метода для обозначения DTD (Document Type Definition) в получаемом XML документе. Добавление DTD в теге <cfxml> не порождает ошибку и игнорируется.

 


Источник: ColdFusion MX and XML: Creating XML Part 2

 


Hosted by uCoz