XML технологии и средства разработки Gupta Team Developer: XML и CTD. Часть 2С.А. Большаков
Оглавление
В первой части статьи мы рассмотрели вопросы XML технологий, связанные организацией документов и основных механизмов их преобразования. Данные технологические процессы выполняются стандартными средствами (интернет броузерами, XSL процессорами и т.д.) и не требуют вмешательства программиста. Во второй части мы рассмотрим аспекты программной обработки XML документов. Принципиально нужно отметить, что все то, что доступно в стандартных средствах обработки (даже более) становиться доступным с использованием Microsoft XML SDK. Думаю, что данный инструментарий не является единственным в своем роде и квалифицированный программист может без особого труда создать и свои средства для поддержки XML, однако в данной статье мы остановимся именно на возможностях этих компонент, которые автоматически поставляются совместно с MS IE, начиная с версии 5.0. Версия, на которую мы будем опираться в данной статье XML SDK 3.0, можно с успехом использовать и более ранние версии (1,0, 2.0, 2.5 и 2.6), однако они ограничены по возможностям и содержат недочеты, которые исправлены в новых версиях. Последняя версия XML SDK - 4.0 уже анонсирована, но мне пока недоступна, однако перечень тех вопросов, которые мы будем рассматривать, вполне укладываются в предлагаемую для знакомства версию средств программных разработок. XML SDK 3.0 представляет собой совокупность CОМ объектов, которые устанавливаются в среде WIN32, доступ к этим объектам осуществляется на основе AX механизмов. Доступ к этим средствам осуществляется в любых языках и системах программирования, поддерживающих АХ: VBScript, Jscript, JAVA,C++ всех версий, Delphi, Centura Team Developer/TD и многих других. XML SDK представляет собой совокупность классов, содержащих свойства и методы для обработки XML документов. Кроме того, современные СУБД ориентируются на использование XML форматов данных: ORACLE, MS SQL, предполагается включение возможности обработки XML в SQLBase 8.0. Основные классы , предлагаемые в SDK, имеют следующее назначение:
Охарактеризуем некоторые из этих классов более подробно, чтобы можно было составить представление о них и понять приводимые ниже примеры использования XML. Класс DOMDocument2 - основной класс для работы с XML документами. Является наследником классов IXMLDOMNode и класса IXMLDOMDocument2. С помощью этого класса создаются объекты в CTD. Класс IXMLDOMDocument2 - базовый класс для обработки XML документов. Поддерживает обработку схем данных, контроля документа, преобразования документов. Основные методы класса DOMDocument2:
Основные свойства класса DOMDocument2:
Как видно из описания свойств и методов класса IXMLDOMDocument2 объекты, создаваемые на его основе работают непосредственно с XML документами (load, save и др.) и обеспечивают их преобразование (appendChild, removeChild и др.). Класс IXMLDOMElement - описывает объект элементов для XML документа, используется для доступа к элементам. Основные методы класса IXMLDOMElement:
Основные свойства класса IXMLDOMElement:
Класс IXMLDOMElement имеет сходные методы и свойства, как следует из определений XML: документ это тоже элемент. Классы IXMLDOMNode и IXMLDOMNodeList - описывают элементы списка дерева документа XML и сам список. Понятие документа является вложенным, поэтому почти все свойства также совпадают. Основные методы класса IXMLDOMNode:
Основные свойства класса IXMLDOMNode:
Эти классы обеспечивают доступ к элементам их выборку из списков, доступ к атрибутам. Доступ обеспечивается как через листание (nextNode), так и через выборку по типам (selectNodes). Этот класс обеспечивает преобразование документов на основе XSLT с помощью специальных методов (transformNode и transformNodeToObject). Класс IXMLDOMAttribute - описывает атрибуты элементов и документов, которые описывают свойства элементов и документов. Основные методы класса IXMLDOMAttribute: appendChild, hasChildNodes, getAttribute, removeChild, createElement, selectNodes, transformNode, transformNodeToObject и другие методы. Основные свойства класса IXMLDOMAttribute:
Классы IXSLTemplate и IXSLProcessor - используются для выполнения преобразований XML документов на основе технологии XSLT. Основные методы классов IXSLTemplate и IXSLProcessor:
Основные свойства классов IXSLTemplate и IXSLProcessor:
Данные классы обеспечивают преобразование документов в другие документы, в частности HTML и XML. Основной метод преобразования - transform. Класс IXMLDOMParseError - описывает данные, характеризующие вид и место ошибки при ее обнаружении при проверке XML документа. Основные свойства класса IXMLDOMParseError:
Объекты данного класса используются при возникновении ошибок, либо правильности текста XML, либо при проверках на DTD, либо схем данных, либо при преобразованиях данных. Вся необходимая информация о типе ошибки, ее месте и причине возникновения включается в свойства объектов класса IXMLDOMParseError. Теперь рассмотрим, что необходимо сделать, чтобы получить доступ и работать с XML документами в Centura Team Developer (TD). Для подключения возможности работы с объектами XML в приложениях на Team Developer первоначально необходимо использовать ActiveX Explorer, вызываемый из оболочки Team Developer. В списке подключаемых компонент необходимо найти Microsoft XML 3.0 (2.6, 2.0) и выполнить полную генерацию классов и событий. В результате в приложение подключиться (и запомниться в каталоге centura\AXlibs) библиотека "Microsoft XML, v3.0.apl". Эта библиотека содержит все классы и механизмы подключения к СОМ объектам XML. Генерацию данной библиотеки нужно выполнить однократно. После этого вы можете использовать данные классы в своих приложениях на CTD.
1. Для нормальной работы с методом PropGetchildren в классе MSXML2_IXMLElement2 его параметры заменяются с MSXML2_IXMLElementCollection на MSXML2_IXMLDOMNodeList. Будет выглядеть так после комментирования неверного варианта и добавления правильного:
2. Для нормальной работы с методом PropSetstylesheetByRef в классе MSXML2_IXSLTemplate нужно заменить его параметры с MSXML2_IXMLDOMNode на MSXML2_FreeThreadedDOMDocument30. Будет выглядеть так после комментирования:
Потом результат нужно сохранить, обновить библиотеку в приложении (Refresh) и все будет нормально работать в приложениях. Описание объектов XML в Team Developer На рисунке 1 приведены описания объектов в CTD, которые необходимы для работы с XML в среде средств разработки. В приведенном примере описываются следующие объекты: один объект mdoc1 для работы с XML документом, в дальнейшем он будет использован для загрузки документа из файла или из строки; определены элементы списка elNode и myElem для доступа к элементам документа; переменная ERRobj, для обработки ошибок; а также вспомогательные переменные типа Variant - attVar и String - strName, для передачи параметров в СОМ объекты.
Рис. 1. Описание объектов XML Для создания пустого документа используется метод Create(), как показано на рисунке 2:
Рис. 2. Создание объекта XML документа. В данном примере после создания и проверки на доступ к СОМ объектам выполняется вспомогательная трассировка в файл (SalFilePutStr). Загрузка документа из файла и строки После создания документа его можно загрузить из внешнего файла (см. рисунок 3), и одновременно проверить на правильность (проверка булевской переменной nRet). Для этого используется метод load.
Рис. 3. Загрузка документа из файла. При загрузке документа из строки
Рис. 4. Загрузка документа из строки При возникновении ошибки (неправильная организация XML документа), возвращаемая переменная nRet примет значение FALSE. Проверка правильности: простая, на основе DTD и схем данных Для доступа к элементам и атрибутам созданного и загруженного документа используются специальные методы, некоторые из них показаны на рисунках 7, 8. На рисунке 7 показан цикл доступа к атрибутам элемента elChild. Проверка правильности документа всегда выполняется при его загрузке. Смотрите рисунок ниже. Причем, если в документе определены DTD или схемы (см. часть 1 статьи), то проверка будет автоматически выполнена с их учетом.
Рис. 5. Проверка документа XML. В тех случаях, когда нужно выполнить дополнительную проверку правильности документа XML, например, после его модификации, могут быть вызваны методы - mdoc1.PropGetvalidateOnParse или mdoc1.validate, которые возвратят значение валидности (правильности) документа. Для изменения, динамического создания и модификации документа могут быть использованы различные методы классов. Покажем применение простейших.
Рис. 6. Изменение документа XML. В данном примере используется метод cloneNode для клонирования элемента (новый называется myElem, создается на основе текущего у родителя elNode), затем ему присваивается новое содержание (текст) с помощью метода PropSettext, а затем в качестве дочернего методом appendChild он добавляется к родительскому elNode. Второй элемент добавляется аналогично. Затем для иллюстрации возможностей у корневого элемента elNode1 все содержание заменяется одним текстом - "Новый текст всего документа". Доступ к элементам и их атрибутам Для доступа к элементам и атрибутам созданного и загруженного документа используются специальные методы, некоторые из них показаны на рисунках 7, 8. На рисунке 7 показан цикл доступа к атрибутам элемента elChild.
Рис. 7. Доступ к атрибутам элемента для документа XML. Первоначально формируется объект списка атрибутов Attrib. Он описывается на основе класса - MSXML2_IXMLDOMNamedNodeMap (для упрощения описание не показано). Далее с помощью метода PropGetlength получено число атрибутов - nAttrib. А затем организован простой цикл по атрибутам с помощью метода выборки - PropGetitem. Текущий атрибут выбирается в объект ndAttr, который описан на основе класса - MSXML2_IXMLDOMNode. В данном цикле читаются: имя атрибута (PropGetnodeName) и его значение (PropGettext). Второй цикл по элементам похож на первый. Первоначально с помощью метода PropGetchildNodes формируется список элементов - ListNode. Определяется его длина nCount (методом PropGetlength) и первый дочерний элемент elChild. Далее организуется цикл по элементам с помощью метода ListNode.nextNode.
Рис. 8. Доступ к элементам для документа XML. В цикле выполняется выборка: имени элемента (PropGetnodeName), его типа (PropGetnodeType) и текста (PropGettext), если этот элемент текст содержит. Далее вызывается функция проверки наличия дочерних элементов (hasChildNodes). При необходимости функция вызывается рекурсивно. Это простой пример организации доступа к вложенным элементам XML документа Изменение и сохранение документа Пример сохранения документа дан на рисунке 9. Для сохранения используется метод save и специальная переменная типа Variant - attVar, которая запоминает строку имени файла для сохранения. Сохраняются два документа DOMObject и DOMXML.
Рис. 9. Сохранение документа XML в файл. При выполнении операции сохранения создается новый файл или перезаписывается существующий. Преобразование документа XML на базе XSL Для преобразования документа на базе XSL необходимо описать три документа типа XML: исходный документ (DOMObject), шаблон XSL (StyleSheet) и выходной документ (DOMXML). Описание дано на рисунке 10. Кроме того, описываются процессор - Processor и шаблон - Template. Описываются также и вспомогательные переменные, назначение которых было пояснено выше.
Рис. 10. Описание объектов для XSL. Загрузка исходного документа для преобразования выполняется, как обычного документа с проверкой на правильность (здесь могут быть также и DTD и схемы данных).
Для начала работы новые объекты создаются с помощью метода Create.
Рис. 12. Создание объектов для XSL. После завершения преобразования необходимо освободить созданные объекты.
При загрузке шаблона XSL должны быть выполнены два метода: PropSetasync и PropSetvalidateOnParse для шаблона StyleSheet. Они обеспечивают правильность преобразования с помощью процессора или на основе метода XML документа.
Рис. 14. Загрузка шаблона для XSL. Преобразование может быть выполнено двумя способами: с помощью процессора (класс MSXML2_IXSLProcessor), который создается для шаблона и с помощью методов transformNode и transformNodeToObject, которые включены в класс основного документа. Так сложилось исторически в развитии XML. Первый способ более универсален. Ниже приводятся примеры для первого и второго случая. При использовании методов transformNode и transformNodeToObject, после создания документа и шаблона для него выполняются эти методы с указанием самого шаблона. Таким образом, можно для преобразования использовать различные шаблоны. В случае с методом transformNodeToObject результат получается в виде нового документа, а в случае transformNode в виде длинной строки. И в том и в другом случае документ можно сохранить в виде внешнего файла, как показано в тексте программыgif При использовании процессора XSL мы должны создать шаблон (Template) и процессор для него: Template.createProcessor. Далее преобразование может быть выполнено с помощью процессора и его метода: Processor.transform. Выход результата может быть назначен с помощью метода Processor.PropSetoutput. А входной файл - Processor.PropSetinput. Далее в этом примере, приведенном на рисунке 16, все аналогично предыдущим случаям. Рис. 16. Преобразование с помощью процессора XSLT и файла XML. В данном примере выгрузка выполняется в длинную строку с помощью метода Processor.PropGetoutput. Вся информация для преобразования поступает из внешних файлов (шаблон - sample.xsl и исходный файл - data.xml). И шаблон и исходный XML файл мы можем сформировать в программе. Процедуры изменения и построения документов мы рассмотрели выше, а простейший пример задания файла XML для преобразования из строки приведен на рисунке 17. Преобразование выполняется с помощью процессора, которому в том числе задается дополнительная строка с методом вида: Processor.addObjeсt, который обеспечивает правильность преобразования документа. Все остальное там также похоже на рассмотренные выше программные фрагменты на CTD. Рис. 17. Преобразование с помощью процессора XSLT и строки XML. Выше было указано, что для обработки ошибок создается специальный объект для фиксации ошибок (в нашем случае - ERRobj). При ошибке и использование метода validate для документа он создается. Далее с помощью методов для доступа к свойствам объекта (PropGet…) можно прочитать всю необходимую информацию и ее сохранить. На рисунке 18 информация выводится в окно сообщений. Рис. 18. Обработка ошибок в программе на CTD. На рисунке 19 показан результат выполнения процедуры, рассмотренной выше при возникновении ошибки при проверке XML документа. Рис. 19. Вывод результата обработки ошибок в окно сообщений. Данный пример иллюстрирует случай отсутствия описания атрибута элемента в схеме данных, но в исходном тексте XML документа он появился.. XML при построении WEB приложений в Team Developer Кроме стандартных возможностей работы с SDK XML в CTD/TD предоставляются специальные объекты для WEB разработок, использующие XML. Эти объекты могут быть визуально настроены программистом, а их обработка выполняется встроенными в скрипты процедурами. В результате генерируются документы, выводимые в броузере. Предусмотрены XML таблицы и XML колонки для вывода в HTML и другие классы. Основные классы TD:
Классы TD, используемые скрытым способом:
Данные используются при работе WEB приложений при обработке XML таблиц. В заключение необходимо отметить, что работа с XML SDK в Team Developer значительно нагляднее по сравнению с вариантом использования языка СИ++ и других, так как не приходится иметь дело ни с указателями, ни с глобальными идентификаторами объектов (GUID), а это, несомненно, уменьшает число ошибок. |