ColdFusion MX и XML: Анализ XML

 

Получение файла

Технологии анализа XML могут быть разделены на 2 категории:

  1. обработчик (парсер) по элементам (SAX - Simple API for XML)
  2. обработчик (парсер) структуры дерева (DOM – Document Object Model - и JDOM).
Инструменты CFMX используют вторую категорию. С помощью парсера весь XML файл анализируется и помещается в память. Затем текстовая версия XML преобразуется в объектную модель, которую можно просматривать с помощью структуры объекта парсера. Большинство парсеров структуры дерева требуют изучения имен и методов различных объектов программ, чтобы находить и считывать данные. В CFMX XML документ распознается и ведет себя в большинстве случаев как переменная. Если вы знаете, как использовать структуры и массивы, то вы уже знаете, большинство из того, что вам понадобиться в работе с XML.

Первым шагом следует прочесть содержимое XML файла в переменную. Для этого мы используем уже знакомые инструменты. Если файл доступен через локальную файловую систему, прочитаем его тегом <cffile>:

Если файл на удаленном сервере, то используем тег <cfhttp>:
Используемый в этой статье XML файл такой:

 

Объект XML документа

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

Вот и все. Теперь мы готовы считывать данные. Если вы хотите посмотреть полученную структуру XML объекта, то выведите ее на экран с помощью тега <cfdump>:
Примерную структуры мы можем посмотреть на рисунке 1.

Краткий вид XML объекта
Рисунок 1. Краткий вид XML объекта.

Обратите внимание, что тег <cfdump> пишет в заголовке "xml document [short version]". Существует два вида предоставления содержимого XML. По-умолчанию, тег <cfdump> предоставляет укороченный вариант (называемый "Основная" структура), которые интересен нам в большинстве случаев. Чтобы посмотреть более подробную версию (или DOM), то щелкните мышкой по заголовку.

 

Считывание данных

Существует два способа обращаться к частям XML объекта. Первый способ – подход через DOM. При этом подходе XML документ содержит вложенный элемент XMLRoot, который относится к корневому элементу XML файла. Этот и любой другой элементы имеют набор вложенных объектов с фиксированными именами. Наиболее часто используемые вложенные объекты это:

XMLName Имя элемента
XMLText Вложенный в элемент текст и ветви CDATA
XMLComment Вложенный в элемент комментарий
XMLAttributes Структура, содержащая атрибуты элементов
XMLChildren Массив вложенных элементов

Просмотрите простой фрагмент XML:

Чтобы получить значение элемента "ColdFusion", длинная форма обращения будет такой:
xmlDoc.XmlRoot.XmlChildren[1].XmlText
Чтобы получить значение атрибута "version", код будет такой:
xmlDoc.XmlRoot.XmlChildren[1].XmlAttributes.version
Такой синтаксис немного труден к восприятию и порождает некоторые проблемы. Например, если массив XML Children содержит элементы с разными именами, то придется циклически проходить по всем элементам в поиске нужного элемента. Поэтому CFMX предоставляет упрощенную систему обращения к элементам. Упрощенный синтаксис похож на тот, который мы используем в работе со структурами или массивами.

К каждому уникальному элементу можно обращаться по его имени, как к элементу структуры. Если вы хотите получить значение текста в уникальном элементе "ColdFusion" и вы знаете имя элемента заранее, то код будет такой:

xmlDoc.Software.ColdFusion.XmlText
А чтение значения атрибута будет таким:
xmlDoc.Software.ColdFusion.XmlAttributes.version
Если вы не знаете имена элементов или атрибутов заранее, то вместо точечного синтаксиса используйте синтаксис массивов:
xmlDoc.Software[softwarename].XmlAttributes[attributename]
Обратите внимание: Поскольку технология XML чувствительна к регистру, то и ColdFusion обращается к именам элементов и атрибутов с учетом их регистра.

 

Циклический проход по элементам

Если в элементе присутствуют более одного вложенного элемента с одним и тем же именем, то мы можем обращаться к ним как к массиву элементов, где имя массива совпадает с именем этих элементов.

Для файла Beans.xml вывод списка имен кофейных зерен будет таким:
Более красивый вывод информации из XML объекта может быть таким:
Результат выполнения этого кода приведен на рисунке 2.

Отображение XML данных в виде HTML
Рисунок 2. Отображение XML данных в виде HTML.

 

Поиск XML данных

Также как и в реляционных базах данных, мы можем делать запрос к определенным элементам или наборам элементов. Для этого в CFMX есть функция XMLSearch(), которая принимает два аргумента: XML объект и выражение XPath. XPath – это мощный язык запросов к XML структурам, который представлен во многих XML технологиях, включая XSLT, XPointer, и XML базах данных.

Вот пример XPath запроса, который возвращает одни элемент Bean иза нашего файла Bean.xml, основываясь на атрибуте ID в элементе BEAN:
Этот образец XPath означает: найти элементы с именем BEAN, где атрибут ID равен 1. Двойной слэш ("//") означает, что элемент BEAN может быть в любом месте XML иерархии. XMLSearch() возвращает массив элементов, которые соответствуют образцу. В этом примере, предполагая, что каждый ID у BEAN уникален, мы получим массив с одним значением: элемент Bean с ID равным 1.

В XPath есть гораздо больше команд и этот язык достоин того, чтобы его изучать.

Получив массив, у нас есть только один простой способ обращаться к элементу:
#aBeans[1].Bean_Name.XmlText#
Более наглядный пример поиска и отображения данных показан в этом коде:

 

Завершаем приложение

Описанные выше два файла: bean_list.cfm и bean_detail.cfm – отображают, соответственно, списко всех XML элементов и детальную информацию об одном конкретном элементе. Последним контрольным файлом будет beans.cfm, который будет вызывать список или детали, в зависимости от полученного ID через URL.

 

Ограничения

ColdFusion инструменты анализа XML имеют некоторые ограничения:

 


Источник: ColdFusion MX and XML: Parsing XML Part 1

 


Hosted by uCoz