Система и способ взаимного преобразования программных объектов и документов на базе элементов структурированного языка
Иллюстрации
Показать всеИзобретение относится к взаимному преобразованию документа (например, документа на языке XML) и программного объекта (например, объекта языка Java). Его использование позволяет эффективно реализовать создание структуры для такого преобразования с помощью стандартных инструментальных средств. В такой структуре используется обработчик, маскирующий метод получения свойств преобразования. За счет этого формируют код преобразования, имеющий общий вид для преобразования в обе стороны. Преобразователь преобразует документ на языке XML в программный объект при помощи анализатора 104. Для осуществления преобразования в другом направлении (из языка Java в язык XML) необходимо, чтобы элементы документа на языке XML были выстроены в определенном порядке с тем, чтобы обеспечить адекватность полученного документа 118 на языке XML. Для этого в настоящем изобретении создается документ-шаблон на языке XML с использованием, например, технологии JSP. Шаблоны, созданные на базе JSP, позволяют записывать теги документов в JSP с возможностью обратного вызова для получения значений элементов и атрибутов. Содержание может быть направлено в буфер или непосредственно в ответный поток сервлета. 4 н. и 18 з.п. ф-лы. 4 ил., 8 табл.
Реферат
Область техники
Настоящее изобретение относится к взаимному преобразованию или отображению программных объектов и документов на базе элементов структурированного языка, в частности взаимному преобразованию различных программных объектов, таких как объекты языка Java™ и документы на языке XML (расширяемый язык разметки).
Предпосылки создания изобретения
Язык XML является сокращенной версией стандартного обобщенного языка разметки (SGML), которая разработана специально для создания страниц WWW. Он позволяет разработчикам создавать собственные специальные теги, обеспечивающие функциональные возможности, недоступные в языке HTML.
Например, язык XML поддерживает ссылки, указывающие на множество документов, в отличие от языка HTML, в котором каждая ссылка может указывать только на один адрес.
Поскольку язык XML является формой самоописания данных (которые в настоящей заявке также именуются элементами структурированного языка), он используется для кодирования мощных по содержанию моделей данных. Таким образом, язык XML может использоваться в качестве средства обмена данными между разнородными системами. На языке XML могут быть представлены или опубликованы данные множества различных систем: существующих программ на языке программирования КОБОЛ, баз данных, программ на языке программирования C++ и подобных им программ. При этом часто возникает экономическая задача, которая заключается в том, каким образом отобразить информацию, содержащуюся в документе на языке XML, в других форматах данных и наоборот. Например, после осуществления обмена информацией между организациями путем передачи документа на языке XML может потребоваться преобразовать такую информацию в объект языка Java, который может быть использован при создании базы данных или осуществлении запроса транзакции.
В патенте US 6125391, выданном 26 сентября 2000 года на имя Meltzer'a и др., описан пример инструментального средства преобразования данных из языка XML в язык Java. Для такого преобразования в названном патенте осуществляют анализ документа на языке XML и обнаруживают события. В частности, один анализатор осуществляет разбор документа на языке XML и создает в памяти древовидное представление, к которому может быть обращен запрос, а другой анализатор осуществляет разбор документа на языке XML и обнаруживает события, содержащие информацию о документе (например, событие начала документа, событие начала элемента с именем элемента, содержанием элемента, событие окончания элемента, событие окончания документа и т.д.).
Для преобразования из языка Java в язык XML в патенте Meltzer'a и др. описано генерирование кода, имеющего аксессоры для каждого элемента. Аксессор элемента имеет цикл, периодически повторяющийся для каждого символа. Цикл содержит оператор-переключатель, выполняющий определенное действие в зависимости от того, что представляет собой символ. Задачей такого действия является создание строкового буфера, содержащего фрагмент элемента документа на языке XML. Решение по патенту Meltzer'a и др. не обеспечивает создание вспомогательной инфраструктуры для работы с кодом, осуществляющим преобразование из языка Java в язык XML. Код, используемый в решении по патенту Meltzer'a и др., полностью генерируется и неудобен для редактирования пользователем.
Следовательно, существует потребность в создании структуры взаимного преобразования программных объектов и документов на базе элементов структурированного языка (например, языка XML), которая может быть эффективно реализована с использованием стандартных инструментальных средств.
Краткое изложение сущности изобретения
Изложенные выше недостатки известного уровня техники отсутствуют в способе и системе по настоящему изобретению, в котором предложена единая интегрированная среда для взаимного преобразования документов (например, документа на языке XML) и программных объектов (например, объекта языка Java). В данной интегрированной среде используется обработчик, маскирующий способ получения свойства для преобразования. В результате формируется код преобразования, имеющий общий вид для преобразования в обе стороны. Взаимное преобразование элементов языка XML и свойств объекта языка Java происходит в преобразователе. Преобразователь осуществляет преобразование документа на языке XML в программный объект с использованием анализатора (такого как анализатор стандарта DOM (объектная модель документов) или простой интерфейс прикладного программирования (API-интерфейс) для языка XML (стандарт SAX)).
Для осуществления преобразования в другом направлении (из языка Java в язык XML) необходимо, чтобы элементы документа на языке XML были выстроены в определенном порядке с тем, чтобы обеспечить достоверность полученного документа на языке XML. Для обеспечения такой достоверности в примерном варианте осуществления настоящего изобретения создается документ-шаблон на языке XML с использованием, например, JavaServer Pages™ (JSP). Шаблоны, созданные на базе JSP, позволяют записывать теги документов в JSP с возможностью осуществления обратных вызовов для получения значений элементов и атрибутов. JSP имеет средства поддержки редактирования, что позволяет эффективно осуществлять создание шаблонов. Кроме того, содержание (содержимое) может быть направлено в буфер или непосредственно в ответный поток сервлета.
Соответственно, объектом настоящего изобретения является реализуемый в компьютере способ преобразования структуры данных, представляющей программный объект, в элементы структурированного языка документа. Предлагаемый в изобретении способ заключается в том, что (а) генерируют шаблон указанного документа, (б) считывают свойства программного объекта, которые взаимосвязаны с элементами структурированного языка документа, (в) с использованием считанных свойств получают образованные элементами структурированного языка конструкции на основе взаимосвязи между этими свойствами и элементами структурированного языка и посредством кода преобразования, обеспечивающего как преобразование программного объекта в документ на основе элементов структурированного языка, так и преобразование в обратном направлении, и (г) полученными конструкциями заполняют шаблон документа.
При осуществлении вышеописанного способа на шаге (в) может осуществляться непосредственный обратный вызов программного объекта для получения свойств, отображающих конструкции, определяющие структуру и содержание документа. Кроме того, на шаге (в) может создаваться объектная модель, отображающая структуру и содержание документа, а для обработки повторяющихся элементов структурированного языка на шаге (в) может быть предусмотрено создание в документе-шаблоне цикла. Элементы структурированного языка предпочтительно представляют собой конструкции языка XML (расширяемый язык разметки).
Объектом настоящего изобретения является также система для преобразования программного объекта, содержащего свойства, в документ, определяемый элементами структурированного языка, содержащая компьютер, имеющий процессор, соединенный посредством системной шины с памятью, в которой хранятся (а) шаблон документа, (б) интерфейс-обработчик, обеспечивающий отображение элементов структурированного языка документа на основе обратных вызовов, выполняемых шаблоном документа, (в) модуль преобразования, связанный с интерфейсом-обработчиком и преобразующий свойства программных объектов в элементы структурированного языка, распознаваемые документом, и (г) класс целевых выходных данных, связанный с модулем преобразования и служащий для записи элементов структурированного языка, сгенерированных модулем преобразования, в документ.
В предлагаемой системе модуль преобразования может содержать интерфейс преобразования, осуществляющий преобразование свойств программного объекта в элементы структурированного языка и задающий выходной целевой поток документа, а также класс преобразования, обеспечивающий методы, используемые интерфейсом преобразования. В этом случае выходной целевой поток может быть определен как буфер или ответный поток сервлета.
Еще одним объектом изобретения является система для преобразования документа, содержащего элементы структурированного языка, в программный объект, содержащая компьютер, имеющий процессор, соединенный посредством системной шины с памятью, в которой хранятся (а) анализатор для обнаружения событий, отображающих особенности документа, (б) класс источника входных данных для чтения документа, (в) класс обработчика содержания, связанный с классом источника входных данных и реализующий буфер для событий, обнаруженных анализатором, и (г) модуль преобразования, связанный с классом данных обработчика содержания и преобразующий события, обнаруженные анализатором, в свойства программного объекта.
В этой системе модуль преобразования может иметь интерфейс преобразования, осуществляющий преобразование событий документа в свойства объекта и задающий выходной целевой поток программного объекта, и класс, обеспечивающий методы, используемые интерфейсом преобразования.
Наконец, объектом настоящего изобретения является способ преобразования программного объекта, имеющего свойства, в документ, представленный элементами структурированного языка, взаимосвязанными со свойствами программного объекта, причем указанный способ реализуется в компьютере, в памяти которого хранятся интерфейс преобразования и контейнер. Предлагаемый в изобретении способ заключается в том, что (а) активизируют интерфейс преобразования и передают программный объект в экземпляр активизированного интерфейса преобразования, (б) активизируют контейнер и с использованием экземпляра активизированного контейнера компилируют и исполняют шаблон документа, (в) записывают документ в заданный выходной поток с использованием компилированного шаблона документа.
Для поддержания состояния обработки предложенный способ может предусматривать обратный вызов интерфейса преобразования. Определение необходимости генерирования выбранных частей документа через компилированный шаблон можно осуществлять посредством вызова методов isOptionalElementPresent или isOptionalAttributePresent.
При генерировании внутри документа сложных типов информационных объектов, выбираемых из группы, состоящей из массива данных, рекурсии и сложного типа, содержащегося внутри другого сложного типа, состояние обработки может поддерживаться с использованием стека. В этом случае состояние стека поддерживают путем выполнения обратных вызовов интерфейса преобразования из компилированного шаблона для указания начала и конца сложных типов.
Определение количества циклов, выполняемых шаблоном на выбранных участках документа, можно осуществлять посредством вызова метода getElementRepetitions.
Во всех вариантах осуществления изобретения элементы структурированного языка могут представлять собой конструкции языка XML (расширяемый язык разметки). В этом случае для создания документа-шаблона может использоваться технология JavaServer Pages (JSP).
Предлагаемые в изобретении способы могут быть реализованы в машинном программном продукте для преобразования структуры данных, представляющей программный объект, в элементы структурированного языка документа или для преобразования элементов структурированного языка документа в структуру данных, представляющую программный объект.
Другие особенности и признаки настоящего изобретения содержатся в приведенном ниже описании конкретных вариантов его осуществления со ссылкой на приложенные чертежи.
Краткое описание чертежей
Дополнительные признаки и преимущества настоящего изобретения раскрыты в подробном описании со ссылкой на приложенные чертежи, на которых:
на фиг.1 показана блок-схема вычислительной системы, которая может быть использована для реализации способа и устройства для осуществления изобретения,
на фиг.2 - блок-схема, иллюстрирующая структуру интегрированной среды для преобразования объектов языка XML в язык Java и наоборот,
на фиг.3 - схема последовательности операций, иллюстрирующая способ преобразования документа на языке XML в программный объект с использованием интегрированной среды, показанной на фиг.2,
на фиг.4 - схема последовательности операций, иллюстрирующая способ преобразования программного объекта в документ на языке XML с использованием интегрированной среды, показанной на фиг.2.
Подробное описание вариантов осуществления настоящего изобретения
На фиг.1 и в соответствующем ему описании показан пример применимой вычислительной среды, в которой может быть реализовано изобретение. Несмотря на то, что изобретение описано в общем контексте машиноисполняемых команд компьютерной программы, установленной на персональной ЭВМ, оно также может быть реализовано в сочетании с другими программными модулями.
В целом, программные модули содержат подпрограммы, программы, компоненты, структуры данных и аналогичные программы, выполняющие определенные задачи или реализующие определенные абстрактные типы данных. Кроме того, настоящее изобретение также может быть реализовано с использованием вычислительных систем, имеющих другие конфигурации, включая портативные устройства, многопроцессорные системы, микропроцессорную или программируемую бытовую электронику, мини-ЭВМ, универсальные ЭВМ и тому подобные устройства. Изобретение также может быть реализовано в распределенных вычислительных средах, в которых задачи выполняют удаленные процессоры, связанные сетью передачи данных.
Программные модули в распределенной вычислительной среде могут располагаться как в местных, так и удаленных запоминающих устройствах.
Как показано на фиг.1, типовая система 10 включает обычную персональную ЭВМ 20, имеющую процессор 22, системную память 24 и системную шину 26, связывающую различные компоненты системы, в том числе системную память 24 с процессором 22. Системная шина 26 имеет шинные структуры нескольких типов, включая шину памяти или контроллер памяти, периферийную шину и локальную шину, в которых используется любая из множества обычных шинных архитектур (например, PCI (локальная шина соединения периферийных устройств), VESA (Ассоциация по стандартам в области видеоэлектроники), ISA (промышленная стандартная архитектура), EISA (расширенный промышленный стандарт шинной архитектуры) и т.д.).
Системная память 24 имеет постоянное запоминающее устройство (ПЗУ) 28 и запоминающее устройство с произвольной выборкой (ЗУПВ) 30. В ПЗУ 28 хранится базовая система 32 ввода-вывода (BIOS), содержащая основные подпрограммы, способствующие обмену информацией между элементами внутри ЭВМ 20, например, во время запуска. ЭВМ 20 также имеет накопитель 34 на жестких магнитных дисках - НЖМД, накопитель 36 на гибких магнитных дисках - НГМД (для считывания и записи на съемный диск 38) и запоминающее устройство (ЗУ) 40 на компакт-дисках (для чтения компакт-дисков 42 или чтения или записи на другие оптические носители данных). Запоминающие устройства 34, 36 и 40 соединены с системной шиной 26 при помощи интерфейсов 44, 46 и 48, соответственно.
Накопители 34, 36 и 40 и соответствующие машиночитаемые носители (38, 42) обеспечивают энергонезависимое хранение данных, структур данных и команд для ЭВМ 20. Носители данных, показанные на фиг.1, являются лишь примерами, а специалистам в данной области техники известно применение иных типов носителей, считываемых ЭВМ (например, магнитных кассет, карт флэш-памяти, цифровых видеодисков и т.д.).
В накопителях 34, 36 и 40 и ЗУПВ 30 может храниться ряд программных модулей, включая операционную систему 50, одну или несколько прикладных программ 52, другие программные модули 54 и программные данные 56. Пользователь может вводить команды и информацию в ЭВМ 20 при помощи клавиатуры 58 и устройства 60 ввода (например, мыши, микрофона, джойстика, игровой сенсорной панели, спутниковой антенны, сканера и т.д.). Такие устройства (58 и 60) соединены с процессором 22 при помощи интерфейса 62 портов (например, последовательного порта, параллельного порта, игрового порта, универсальной последовательной шины (УПШ) и т.д.), который связан с шиной 26. С шиной 26 при помощи интерфейса 66 (например, видеоадаптера) также связан монитор 64 или устройство индикации иного типа.
ЭВМ 20 может работать в сетевой среде, в которой она логически связана с одним или несколькими удаленными ЭВМ, такими как удаленная ЭВМ 68. Удаленная ЭВМ 68 может являться сервером, маршрутизатором, равноправным устройством или иным обычным узлом сети и, как правило, имеет множество или все элементы, описанные применительно к ЭВМ 20, однако для упрощения показано лишь запоминающее устройство 70. Показанные на фиг.1 логические связи включают локальную сеть 72 и глобальную сеть 74. Такое сетевое окружение обычно используется в учреждениях, корпоративных сетях, интрасетях и сети Internet.
При использовании в условиях локального сетевого окружения ЭВМ 20 соединена с локальной сетью 72 посредством сетевого интерфейса или адаптера 76. При использовании в условиях глобального сетевого окружения ЭВМ 20 обычно имеет модем 78 или иное средство для поддержания связи по глобальной сети 74, такой как Internet. Модем 54, который может быть встроенным или внешним, посредством интерфейса 62 портов соединен с шиной 26. В условиях сетевого окружения программные модули, показанные применительно к ЭВМ 20, или их части, могут храниться в удаленном запоминающем устройстве 70.
Способ по настоящему изобретению описан на примере преобразования, или отображения, документов XML в объекты Java, а также объектов Java в документы XML. Возможна поддержка и других форматов данных. Например, множество существующих бизнес-приложений написаны на языках КОБОЛ, С и ПЛ/1. Такие приложения состоят из программ, хранящихся в информационных системах предприятия, таких как CICS™ (программное обеспечение общего назначения для оперативной обработки транзакций) или IMS™ (информационно-управляющая система). Язык КОБОЛ используется для ввода и вывода структур программы на языке КОБОЛ. Необходимо осуществлять преобразование из языка XML в язык КОБОЛ и из языка КОБОЛ в язык XML. Настоящее изобретение может применяться для таких преобразований, при этом в случае преобразования из языка XML в объект Х обработчик преобразования (описанный далее) заполняет структуру языка КОБОЛ данными из документа на языке XML, а в случае преобразования объекта Х в язык XML обработчик преобразования (описанный далее) извлекает данные из структуры языка КОБОЛ и пользуется шаблоном для заполнения документа на языке XML.
В способах преобразования по настоящему изобретению используется следующий процесс высокого уровня: (а) лексический анализатор группирует символы в слова или лексемы, распознаваемые определенной системой (условная разметка); (б) синтаксический анализатор анализирует группы лексем с тем, чтобы распознать допустимые языковые конструкции; и (в) генератор кода использует набор допустимых языковых конструкций и генерирует исполняемые коды. Шаги (а)-(в) могут выполняться в комбинированной форме. Например, в случае преобразования документа XML в объект Java осуществляется анализ каждого символа документа на языке XML с тем, чтобы распознать допустимые лексемы на языке XML, такие как начальные теги (открывающие), свойства, конечные (закрывающие) теги и разделы (секции) "CDATA". Затем лексемы необходимо верифицировать, чтобы определить, образуют ли они допустимые конструкции на языке XML. При верификации на самом нижнем уровне определяют, все ли тегирование имеет совпадающие начальные и конечные теги, и структурированы ли свойства в начальном теге должным образом. Если имеется описание документа в формате DTD (определение типа документа) или XML-схема, то возможно обеспечить, чтобы конструкции на языке XML, обнаруженные в процессе анализа, были допустимыми с точки зрения форматов DTD или XML-схема, а также представляли собой правильно сформулированный язык XML. Наконец, данные, содержащиеся в документе на языке XML, используются для выполнения какого-либо полезного действия (т.е. его преобразования в объект языка Java).
Некоторые из названных выше задач могут быть по меньшей мере частично решены при помощи легко доступных анализаторов документов XML. Анализаторы документов XML осуществляют лексический и синтаксический анализ. Примерами стандартов анализа являются стандарт SAX и стандарт DOM, реализованные в API-интерфейсе (SAX - простой интерфейс прикладного программирования (API-интерфейс) для языка XML; DOM - объектная модель документов).
SAX является стандартом на основе событий. Анализаторы документов XML, использующие стандарт SAX, генерируют события, соответствующие различным элементам, которые были обнаружены в подвергнутом анализу документе на языке XML. Стандарт DOM является простым интерфейсом прикладного программирования на основе объектного моделирования. Анализаторы документов XML на основе стандарта DOM создают в памяти групповую объектную модель, которая отображает содержание документа XML. По завершении анализа анализатором документа XML в памяти сохраняется древовидная структура объектов DOM, содержащая информацию о структуре и содержании документа XML.
На фиг.2 схематически показана интегрированная среда 100 согласно одному из вариантов осуществления настоящего изобретения. Интегрированная среда 100 показана на примере интегрального компонента 102, такого как сервлет, который может быть осуществлен в системе 10, показанной на фиг.1. В состав интегрального компонента 102 входит анализатор 104, реализованный с использованием, например, интерфейсов DOM или SAX, который взаимодействует с модулем 106 преобразования документа XML в программный объект. Для ясности при описании вариантов осуществления настоящего изобретения в качестве примера анализатора 104 использован анализатор с интерфейсом SAX.
Модуль 106 преобразования документа XML в программный объект принимает входной документ 108 на языке XML и генерирует выходной объект 110 на языке Java. Интегральный компонент 102 также имеет модуль документа-шаблона 112 на языке XML (например, на базе технологии JSP - JavaServer Pages™), который связан с модулем 114 преобразования программного объекта в документ XML. Модуль 114 преобразования программного объекта в документ XML принимает входной объект 116 на языке Java и генерирует выходной документ 118 на языке XML.
Преобразование документа XML в программный объект
Как показано на фиг.2, модуль 106 преобразования документа XML в программный объект имеет следующие компоненты:
(а) класс 106-1 источника входных данных (XML2xInputSource) для реализации входного документа 108 на языке XML;
(б) класс 106-2 обработчика буферизованного содержания (XML2xBufferedContentHandler) для реализации буфера событий стандарта SAX, генерированного анализатором 104;
(в) интерфейс 106-4 (XML2xMapping) преобразования для осуществления преобразования и определения входных и выходных целевых потоков; и
(г) класс 106-3 преобразования (XML2xMappingImpl), обеспечивающий методы преобразования входного документа 108 на языке XML в выходной объект 110 на языке Java.
Ниже подробно описаны различные интерфейсы и классы. Применительно к языку Java термины "класс" и "интерфейс" имеют особое значение. Класс языка Java (абстрактный, внутренний или окончательный) представляет собой совокупность компонентов данных и методов, характеризующих конкретный объект, а интерфейс Java используется для придания определенной функциональности реализующему их классу (т.е. интерфейсы определяют функции классов). Интерфейсы также служат для создания постоянных величин, используемых классами, реализующими интерфейс. Интерфейсы содержат постоянные параметры и описания методов, однако реализация методов зависит от классов, реализующих интерфейс. Один класс может реализовать любое число интерфейсов.
В таблице M106-1 приведены основные функции (т.е., не исчерпывающий перечень функций) класса 106-1 источника входных данных (XML2xInputSource).
Класс XML2xInputSource используется для того, чтобы обеспечить возможность чтения документа XML из байтового потока, потока символов или обработчика XML2xBufferedContentHandler 106-2.
Таблица M106-1 | |
Функция | Описание |
available() | Возврат числа байтов, которое может быть считано из входного потока без объединения в блоки |
getBufferedHandler() | Получение буферизованного обработчика событий стандарта SAX |
getByteStream() | Возврат байтового потока |
getCharacterStream() | Возврат считывателя потока символов |
read() | Считывание очередного байта данных из данного входного потока |
skip() | Пропуск байтов из данного входного потока |
В таблице M106-2 приведены основные функции (т.е. не исчерпывающий перечень функций) класса 106-2 обработчика буферизованного содержания (XML2xBufferedContentHandler). Класс M106-2 обработчика также включает обработчик содержания для буферизации событий стандарта SAX, поступающих из анализатора 104. Это позволяет воспроизводить события. Примером ситуации, в которой данная функция полезна, является случай, когда для различных частей документа XML используются различные обработчики преобразования. Примером реализации является упрощенный протокол доступа к объекту (SOAP).
Таблица M106-2 | |
Функция | Описание |
Characters (char[] ch, int start, int length); | Комментарий к методу, в котором ch - это символы документа 108 на языке XML; start - начальная позиция в массиве; length - число символов для считывания из массива |
parse() | Исполнение событий стандарта SAX в буфере |
SOAP является упрощенным протоколом обмена информацией в децентрализованной, распределенной среде. Он является протоколом на базе языка XML и состоит из трех частей: (1) конверта, образующего среду для описания содержания сообщения и способа его обработки; (2) набора правил кодирования для представления экземпляров, связанных с конкретным применением типов данных; и (3) условных обозначений для отображения удаленных вызовов и ответов на вызовы процедур. Сообщение SOAP является документом на языке XML, состоящим из обязательного конверта SOAP, необязательного заголовка SOAP и обязательного тела SOAP. В данном случае для обработки конверта и тела могут использоваться различные обработчики преобразования.
В таблице M106-3 приведены основные функции (т.е. неисчерпывающие) интерфейса преобразования 106-4 (XML2xMapping). Интерфейс XML2xMapping осуществляет преобразование и определяет конфигурацию входного потока.
Таблица M106-3 | |
Функция | Описание |
Execute() | Осуществление преобразования для создания формата входного документа 108 на языке XML. Полный пример функции execute() приведен ниже. |
SetInputStream() | Определение входного потока, т.е. источника входного документа 108 на языке XML, который подлежит преобразованию. |
В таблице M106-4 приведены основные функции (т.е. неисчерпывающий перечень функций) класса преобразования 106-3 (XML2xMappingImpl). Как указано выше при описании определений понятий "класс" и "интерфейс", класс XML2xMappingImpl не используют непосредственно, а выделяют в нем подклассы с добавлением содержания к соответствующим методам в зависимости от определений типа документа для входного документа 108 на языке XML, преобразованного из выходного объекта 110 на языке Java, в который осуществляется преобразование.
Таблица M106-4 | |
Функция | Описание |
EndElement() | Получение уведомления о конце элемента. Анализатор 104 активизирует данный метод в конце каждого элемента входного документа 108 на языке XML. Для каждого события endElement() существует соответствующее событие startElement(), даже если элемент является пустым. |
Execute() | Осуществление преобразования для создания формата входного документа 108 на языке XML. |
SetDocumentLocator() | Получение объекта для обнаружения источника событий документа стандарта SAX. |
SetInputStream() | Определение входного потока. Определение источника входного документа 108 на языке XML, который подлежит преобразованию. |
StartElement() | Получение уведомления о начале элемента. Анализатор 104 вызывает данный метод в начале каждого элемента входного документа 108 на языке XML. Для каждого события startElement() существует соответствующее событие endElement(), даже если элемент является пустым. Вся информация о содержании элемента передается до события окончания соответствующего элемента (endElement()). |
На фиг.3 показан способ 300 преобразования документа 108 на языке XML в программный объект 110 (например, объект Java Bean), в котором:
(а) получают экземпляр интерфейса 106-4 преобразования (XML2xMapping) для осуществления на шаге 302 преобразования документа XML в объект X;
(б) на шаге 304 активизируют интерфейс 106-4 преобразования и на шаге 306 вводят входной документ 108 на языке XML;
(в) на шаге 308 интерфейс 106-4 преобразования получает экземпляр анализатора событий (например, анализатора 104) и на шаге 310 регистрирует интерфейс 106-4 преобразования в качестве обработчика содержания (например, класса 106-2 обработчика буферизованного содержания);
(г) на шаге 312 активизируют анализатор 104 в отношении документа 108 на языке XML (т.е. анализатор начинает разбор документа);
(д) на шаге 314 при выполнении шага (г) в интерфейс 106-4 преобразования поступают обратные вызовы, вызывая различные методы (например, startDocument (начало документа), startElement (начало элемента), символы, endElement (конец элемента), endDocument (конец документа) и т.д.);
(е) на шаге 316 при выполнении методов startDocument и/или startElement интерфейс 106-4 преобразования создает программный объект 110; и
(ж) на шаге 318 при выполнении метода endElement интерфейс 106-4 преобразования помещает элемент в программный объект 110.
Описанный выше API-интерфейс SAX имеет множество известных из уровня техники спецификаций. Задачей настоящего изобретения является создание класса, реализующего интерфейс-обработчик содержания, представляющий собой интерфейс, построенный на механизме обратных вызовов и используемый анализаторами документов XML для уведомления программы о событиях SAX по мере их обнаружения в документе XML. Этот интерфейс используется с классом 106-2 обработчика буферизованного содержания (XML2xBufferedContentHandler) и классом 106-1 источника входных данных (XML2xInputSource). Применительно к интерфейсу-обработчику содержания API-интерфейс SAX также может быть реализован в виде интерфейса класса стандартного обработчика (DefaultHandler). Ниже в примере I "преобразование документа XML в пользовательский объект JAVA" подробно описано применение стандартного обработчика для генерирования пользовательского объекта Java Bean из пользовательского документа на языке XML.
Пример 1
Преобразование документа XML в пользовательский объект JAVA
В примере 1 использованы следующие компоненты (описанные ниже):
(A) customer.xml: образец входного документа 108 на языке XML;
(Б) XML2CustomerMapping.java: класс 106-2 обработчика, в который анализатор 104 направляет обратные вызовы. Содержит команды по конструированию пользовательского объекта и определению его параметров;
(B) executive.java: программа класса 106-3/интерфейса 106-4 преобразования, используемая для осуществления преобразования из языка XML в язык Java и из языка Java в язык XML (Пример II ниже);
(Г) customer.java: вывод пользовательского объекта 110 на языке Java Bean; и
(Д) CustomerSymbols.java: содержит целочисленные константы и схему хеширования. Схема хеширования служит для преобразования имен тегов в целочисленные константы, используемые в XML2CustomerMapping.java.
А. Ниже приведен входной документ на языке XML (customer.xml).
// START customer.xml
<?xml version="1.O"?>
<customer>
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
<CustId>xyz.123</CustId>
</customer>
// END customer.xml
Б. Ниже с некоторыми сокращениями для краткости приведена программа (XML2CustomerMapping.java), служащая для конструирования пользовательского объекта и задания его параметров (т.е., обработчик, в который анализатор событий направляет обратные вызовы).
// START XML2CustomerMapping.java
public class XML2CustomerMapping extends
corn.xxx.xml2xmapping.XML2xMappingImpl {
private StringBuffer fieldCurrentQualifiedElementName=
new StringBuffer("");
private Customer fieldCustomer;
private Stack elementStack;
* XMLCustomerInfo2RecordCustomerInfoMapper constructor comment.
public XML2CustomerMapping() {
super();
elementStack=new Stack();
}
* characters method comment.
public void characters(char[] ch, int start, int length) throws org.xrnl.sax.SAXException {
switch (this.fieldCurrentElementSymbol) {
case CustomerSymbols.CUSTOMER_FIRSTNAME:
case CustomerSymbols.CUSTOMER_LASTNAME:
case CustomerSymbols.CUSTOMER_ID:
((StringBuffer)elementStack.lastElement()).append(ch,start,length);
break;
}
}
* endElement method comment.
public void endElement(String namespaceURI, String localName, String rawName) throws org.xrnl.sax.SAXException {
String symbolName;
if(namespaceURI.equals("")) symbolName=rawName;
else symbolName=namespaceURI + "_" + localName;
this.fieldCurrentElementSymbol=CustomerSymbols.getSymbol(symbolName);
// Get the value
String value=, ((StringBuffer)elementStack.pop()).toString();
switch (this.fieldCurrentElementSymbol) {
case CustomerSymbols.CUSTOMER_FIRSTNAME: {
this.fieldCustomer.setFirstName(value);
break;
}
case CustomerSymbols.CUSTOMER_LASTNAME: {
this.fieldCustomer.setLastName(value);
break;
}
case CustomerSymbols.CUSTOMER_ID: {
this.fieldCustomer.setId(value);
break;
}
}
this.fieldCurrentElementSymbol=0;
}
* @return com.xxx.connector.mapping.xml.test.Customer public Customer getCustomer() {
return this.fieldCustomer;
}
* startElement method comment.
public void startElement(String namespaceURI, String localName, String rawName, org.xml.sax.Attributes atts) throws org.xrnl.sax.SAXException {
String symbolName;
if (namespaceURI.equals(""))symbolName=rawName;
else symbolName=namespaceURI + "_" + localName;
this.fieldCurrentElementSymbol=CustomerSymbols.getSymbol(symbolName);
elementStack.push(new StringBuffer());
switch (this.fieldCurrentElementSymbol) {
case CustomerSymbols.CUSTOMER: {
this.fieldCustomer=new Customer();
break;
}
}
}
}
// END XML2CustomerMapping.java
В. Ниже с некоторыми сокращениями для краткости приведена программа (execute.java) преобразования из языка XML в язык Java (и из языка Java в язык XML, как это подробно описано ниже в примере II).
// START execute.java
package com.xxx.xml2xmapping.sample.customer;
import Java.io.*;
import org.xml.sax.*;
public class Execute {
* Execute constructor comment.
public Execute() {
super();
}
* Starts the application.
* @param args an array of command-line arguments
public static void main(Java.lang.String[] args) {
int numlterations=1;
XML2CustomerMapping inMapping=new XML2CustomerMapping();
Customer2XMLMapping outEventBasedMapping=new
Customer2XMLMapping();
// Create the XML2 Customer handler and the Customer2XML handler XML2CustomerMapping in Mapping=new XML2CustomerMapping();
Customer2XMLMapping outEventBasedMapping=new
Customer2XMLMapping();
// read in the customer.xml file
ByteArrayInputStream inStream=null;
try {
FileInputStream fileInputStream=new
FileInputStream("customer.xml");
byte[] bytes=new byte[fileInputStream.available()];
fileInputStream.read(bytes, 0,
fileInputStream.available());
inStream=new ByteArrayInputStream(bytes);
} catch (Exception e) {
e.printStackTrace();
}
ByteArrayOutputStream outStream=new ByteArrayOutputStream();
try {
long ts=System.currentTimeMillis();
for (int i=0; i<numIterations; i++) {
// inbound mapping
// map from XML document to customer Java Bean inStream. reset();
inMapping.setInputStream(inStream);
inMapping.execute();
// some execution, here a connector would be called
// get the customer object and print its contents
Customer aCustomer=inMapping.getCustomer();
System.out.println("First name from XML document is
+aCustomer.getFirstName());
System.out.println("Last name from XML document is
"+aCustomer.getLastName());
System, out. println("Customer id from XML document is "+aCustomer.getId());
// Change the values on the customer object
aCustomer.setFirstName("James");
aCustomer.setLastName("Bond");
aCustomer.setId("007");
// outbound mapping
// map from Java to XML
outEventBasedMapping.setCustomer(aCustomer);
// outEventBasedMapping.setOutputStream(outStream);
outEventBasedMapping.setOutputStream(System.out);
outEventBasedMapping.execute();
}
long te=System.currentTimeMillis();
System.out.println("Average time"+(te-ts)/numlterations+"ms.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
//END execute.java
Г. Ниже описана пользовательская программа Java Bean (customer.java). Java Bean является многократно используемым компонентом, присоединенным к известной из уровня техники структуре стандартной конструкции. Bean является объектом класса, видимым или невидимым во время выполнения программы.
//START customer.java
package com.xxx.xml2xmapping. sample.customer;
public class Customer {
private Java.lang.String fieldFirstName=new String();
private Java.lang.String fieldLastName=new String();
private Java.lang.String fieldid=new String ();
* Customer constructor comment.
public Customer() {
super();
}
* Gets the firstName property (java.lang.String) value.
* @return The firstName property value.
* @see #setFirstName
public Java.lang.String getFirstName() {
return fieldFirstName;
}
* Gets the id property (Java.lang.String) value.
* @return The id property value.
* @see #setId
public Java.lang.String getId() {
return fieldId;
}
* Gets the lastName property (Java.lang.String) value.
* @return The lastName property value.
* @see #setLastName
public java.lang.String getLastName() {
return fieldLastName;
}
* Sets the firstName property (Java.lang.String) value.
* @param firstName The new value for the property.
* @see #getFirstName
public void setFirstName(java.lang.String firstName) {
fieldFirstName=firstName;
}
* Sets the id property (Java.lang.String) value.
* @param id The new value for the property.
* @see #getId
public void setId(Java.lang.String id) {
fieldId=id;
}
/**
* Sets the lastName property (Java.lang.String) value.
* @param lastName The new value for the property.
* @see #getLastName
public void setLastName(Java.lang.String lastName) {
fieldLastName=lastName;
}
}
//END customer.java
Как следует из примера I, преобразование документа XML в объект Java является эффективным, поскольку анализатор 104 осуществляет обработку событий примените