ityouth.ru Четверг, 2012-02-09, 1:37 AM
Привет Посетитель | RSS | Feedburner
Главная | Каталог статей | Регистрация | Вход
» Меню сайта

» Категории раздела
SYS | Программирование [2]
Web | Программирование [4]
XP | Vista | Server [8]
Linux | Unix | FreeBSD [2]
Веб мастер | БД [19]
Internet | LAN | Протоколы [14]
Хакинг | Защита [19]
Службы | Сервисы [4]
SEO | Продвижение [14]
Hardware | News [5]
Невероятно | Факты [3]
Другое | ETC [2]

» Теги
windows Galaxy apple Sony смартфон nod32 AMD nokia LG LTE продвижение сайта Office NVIDIA microsoft HTC CES 2012 MSI APU HP взлом Toshiba OLED Acer планшет ViewSonic хакинг SSD Samsung ноутбук Intel Lenovo Canon Мультимедиа ультрабук asus GIGABYTE Android 4.0 windows xp USB 3.0 Sandy Bridge-E антивирус eset безопасность SEO Драйверы конвертер DVD браузер Android laptop his Android 2.3 Radeon HD 7900 монитор Thermaltake google корпус вебмастеру защита Dell

» Архив новостей
2005 год 2006 год 2007 год 2008 год 2009 год

» Категории файлов
Antivirus and Spyware [22]
Антивирусы и Антитрояны
Firewalls and Security [6]
Фаерволы и Защита
Cleaning and Tweaking [13]
Реестр и Чистка
Compression and Restore [7]
Архивация и Восстановление
File Transfer and P2P [4]
Передача фалов и Пиринг
CD and DVD Tools [8]
Работа с CD и DVD
Messaging and Chat [12]
Мессенжеры и Чаты
Browsers and Plugins [12]
Браузеры и Плагины
Desktop and Interface [3]
Рабочий стол и Интерфейс
Programming and Tools [4]
Программирование и Плагины
Hack and Frick [14]
Хакинг и Фрикинг
Audio and Video [25]
Аудио и Видео
Drivers [4]
Драйверы
Webmaster and Designer [27]
Вебмастер и Дизайнер
Bisness and Books [14]
Бизнес и Книги
Office and PDF [5]
Офис и PDF
Operation System [9]
Операционные Системы
Utilities and Other [19]
Утилиты и Прочее

» Категории статей
SYS | Программирование [2]
Web | Программирование [4]
XP | Vista | Server [8]
Linux | Unix | FreeBSD [2]
Веб мастер | БД [19]
Internet | LAN | Протоколы [14]
Хакинг | Защита [19]
Службы | Сервисы [4]
SEO | Продвижение [14]
Hardware | News [5]
Невероятно | Факты [3]
Другое | ETC [2]

» Фото

» --

Главная » Статьи » SYS | Программирование

Использование СOM в среде Delphi

Последнее время много внимания уделяется построение систем электронного бизнеса, или как их еще называют - B2B (business to business). Учитывая рекомендации по построению обменных потоковых систем координирующего интернет-технологий органа - WWW Consortium: акцент сделан в сторону XML-технологий и построение систем обмена XML-документами.

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

Независимость представления информации в виде XML документов позволяет разным, участвующим в электронном бизнесе, фирмам производить независимое друг от друга ПО.

Во всех системах обмен, как правило, строится по одинаковой схеме, с использованием HTTP запросов. В качестве протокола защиты информации применяется протокол SSL (но это отдельная тема).

Один из возможных вариантов обработки XML сообщения является построение BIN/CGI (ISAPI)-приложений или COM (серверных) компонент, формирующих или обрабатывающих XML-документы.

С одной стороны, приложение выступает в качестве клиента, которое в режиме POST выдает HTTP запрос, с другой стороны, находится WEB сервер на стороне которого осуществляется обработка запроса и выдача ответа. В информационном обмене используются XML-документы.

Один из наиболее эффективных вариантов реализации - использование существующего XML-парсера, поддерживающего DOM модель. Такой парсер является дистрибутивной поставкой Win`98 или составной частью IE 4,7 и выше (для Win`95) и представляет COM сервер, находящийся в библиотеке msxml.dll.

Модель компонентных объектов (COM) - представляет инкапсулированные данные и методы в единую сущность и способ доступа к ним через систему интерфейсов. Средствами Delphi достаточно просто осуществить доступ к классам COM-объекта (в одном COM-сервере может быть включено несколько классов). Доступ к объектам осуществляется путем инициализации экземпляра класса через систему интерфейсов. Описание интерфейсов осуществляется языком определения интерфейсов (IDL), которое возможно осуществить средствами среды автоматически.

Средствами Delphi осуществляется импорт из COM-сервера msxml.dll, строится файлы описания интерфейса IDL и файл бинарного описания типов библиотеки - TLB. Данная операция осуществляется через системное меню: Project | Type Library Import: (рисунок 1). Далее появляется диалоговое окно (рисунок 2), в котором необходимо выбрать COM-объект (в нашем случае объект зарегистрирован под именем "Microsoft.XMLDom (Version 2.0)" ) и создать TLB-файл (кнопка Create Unit). Используя TLB-файл, среда генерирует "паскалевский" файл описания COM-сервера - MSXML_TLB.pas

В файле MSXML_TLB.pas описаны все интерфейсы, константы и соклассы COM-сервера.

Для доступа к объектам COM-элемента, необходимо в директиве USES добавить имя файла описания библиотеки (MSXML_TLB.pas). Ниже представлена простейшая программа, использующая DOM стандартный анализатор msxml.dll, которая загружает XML-документ и отображает его в элементе текстового поля Memo1.

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OleServer, MSXML_TLB, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

Procedure TForm1.Button1Click(Sender: Tobject);
// объявление сокласса объекта DOMDocument;
var coDoc : CoDOMDocument;
// класс, согласованный с интерфейсом IDOMDocument;
var Doc: IXMLDOMDocument;

begin
// создание экземпляра объекта DOMDocument;
Doc := coDoc.Create;
// вызов метода Load экземпляра объекта DOMDocument;
Doc.load('data.xml');
// доступ к свойстве xml экземпляра объекта DOMDocument;
Memo1.Text:=Doc.xml;
end;

end.

Концепция DOM - объектная модель документа

Каждый XML документ представляется в виде набора множества объектов (классов), с помощью которых возможен доступ к отдельным элементам (полям объекта). DOM - интерфейс описывает доступ как к простым объектам типа DOMString или CharacterData, так и к частям или отдельным элементам XML документа: DOMFragmentElement, DOMNode, DOMElement.

Ниже приведены самые важные свойства и методы объектов XMLDOMDocument, XMLDOMNode, XMLDOMNodeList. Необходимо отметить, что представленные ниже методы и функции объектов DOM модели (Document Object Model) используются Microsoft XML-анализатором msxml.dll и несколько шире, чем утвержденная W3C Консорциумом DOM модель.

Более полное описание интерфейса DOM объектов можно найти на http://msdn.microsoft.com/xml/

Объект XMLDOMDocument
Представляет верхний уровень объектной иерархии и содержит методы для работы с документом: его загрузки, анализа, создания в нем элементов, атрибутов, комментариев и т.д. .
Свойства
AsyncСвойство идентифицирующее текущий режим обработки
ParseError Возвращает ссылку на объект обработки ошибки XMLDOMParseError
Включение - выключение верификации документа.  
url Возвращает URL документа
documentElement Содержит ссылку на корневой элемент документа в виде объекта XMLDOMElement.
Методы
load(url)
loadXML(xmlString)
Загружает XML документ,
save(objTarget)Сохраняет XML документ в файле
abort Прерывание процесса загрузки и обработки документа.
createAttribute (name)Создает для текущего элемента новый атрибут с указанным именем.
createNode(Type, name, nameSpaceURI)Создает узел указанного типа и названия
createElement(tagName) Создает элемент документа с указанным названием.
createTextNode(data) Создает текст внутри документа
getElementsByTagName(tagname)Возвращает ссылку на коллекцию элементов документа с заданным именем
nodeFromID(idString)Поиск элемента по идентификатору

Объект XMLDOMNode
Объект XMLDOMNode, реализующий базовый DOM интерфейс Node, предназначен для манипулирования с отдельным узлом дерева документа. Его свойства и методы позволяют получать и изменять полную информацию о текущем узле - его тип, название, полное название, его содержимое, список дочерних элементов и т.д.
Свойства
nodeName, baseName Возвращает название текущего узла.
prefixВозвращает Namespace префикс.
dataType Определяет тип содержимого текущего узла
nodeType, nodeTypeStringВозвращает тип текущего узла:
attributes Возвращает список атрибутов текущего узла в виде коллекции XMLDOMNamedNodeMap.
textВозвращает содержимое текущего поддерева в виде текста
xmlВозвращает XML-представление текущего поддерева.
nodeValue Возвращает содержимое текущего узла.
childNodes Возвращает список дочерних элементов в виде XMLDOMNodeList.
firstChild, lastChild Возвращает первый/последний дочерний элемент
previousSibling ,nextSibling Возвращает предыдущий /следующий сестринский элемент.
parentNode Содержит ссылку на родительский элемент.
ownerDocument Возвращает указатель на документ, в котором находится текущий узел.
Методы
appendChild(newChild)Добавляет текущему узлу новый дочерний элемент.
insertBefore(newChild, refChild) Вставляет дочерний узел, располагая его в текущем поддереве "левее" узла, указанного параметром refChild.
cloneNode (deep)Создание копии текущего элемента.
getAttribute(name)
getAttributeNode (name)
setAttribute(name, value)
setAttributeNode(XMLDOMAttribute)
Доступ к атрибутам (создание, чтение, запись) объекта. Name - имя атрибута, value - его значение. Возращает значение объект XMLDOMAttribute.
replaceChild(newChild, oldChild) removeChild(oldChild)Замена объекта oldChild текущего списка дочерних объектов на newChild. Удаление объекта oldChild
selectNodes(patternString) selectSingleNode(patternString)Возвращает объект XMLDOMNodeList, выбранное по шаблону поиска или первый узел
transformNode(stylesheet)
transformNodeToObject(stylesheet, outputObject)
Назначает стилевую таблицу для поддерева текущего узла и возвращает строку - результат обработки. В качестве параметра передается ссылка на объект DOMDocument, в котором находятся XSL инструкции.

Объект XMLDOMNodeList
Представляет собой список узлов - поддеревья и содержит методы, при помощи которых можно организовать процедуру обхода дерева.
lengthчисло элементов списка узлов
item(i) Выбор i-того элемента из списка. Возвращает объект XMLDOMNode
nextNode() Выбор следующего элемента в списке.

Использование XML в бизнесе.

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

При построении B2B или корпоративной ERP системы, при организации информационного обмена XML-документами между предприятиями или филиалами пр-я, используются эффективно себя зарекомендовавшая система передачи информации на основе имеющихся WEB серверов по HTTP протоколам.

С одной стороны, приложение выступает в качестве клиента, которое в режиме POST выдает HTTP запрос, с другой стороны, находится WEB сервер, на стороне которого осуществляется обработка запроса и выдача ответа. В качестве обмена используются XML-документы.

Например, в простой корпоративной ERP системе бухгалтерской программе (АСУ Бухучет) необходимо сформировать некий запрос на выписку накладной и передать его в филиал, который имеет склад (АСУ Склад). АРМ Аналогичная постановка задачи при создании В2В системы, когда Предприятие А запрашивает наличие продукции (делает заказ на приобретение) у Поставщика В.

Предприятие А и его программа выступает в качестве клиента. Склад обслуживает Поставщик В, у которого находится складской комплекс БД на SQL сервере. Обмен осуществляется через корпоративный WEB сервер Поставщика В.

Ниже представлен следующий типовой алгоритм обмена:


Рисунок 3.
  1. Предприятие А инициирует процесс А (заказ продукции), который выступает в качестве WEB-клиента.

  2. Процесс А формирует XML документ (например запрос- накладная) и передает его как POST запрос http на WEB сервер Поставщика В. В качестве URI - используется идентификатор ресурса обрабатывающего приложения. URI может быть одинаковым как для всех типов документов, либо индивидуальным для каждого типа. Все зависит от структуры B2B (WEB) сервера.

  3. WEB сервер анализирует запрос и порождает серверный Процесс В, передавая в качестве параметра тело XML документа.

    Процессе В запускается WEB-сервером и обрабатывается либо как ASP страница,CGI (ISAPI) - приложение или JAVA севрлет (серверное приложение)

  4. Процесс В - формирует запрос на SQL-сервер базы данных.

  5. SQL-сервер производит необходимые операции в БД, формирует ответ и возвращает его Процессу В.

  6. По ответу от SQL-сервера Процесс В формирует XML документ (ответ) и возращает его как на ответ на http запрос клиентскому приложению.

  7. Далее, в зависимости от ситуации на стороне клиента формируется либо новый http запрос, либо заканчивается сеанс.

Несколько слов об организации документооборота.

Общим правилом разработки системы обмена XML документами является:

  • во-первых - разработка схемы потоков электронных документов и их структуры;

  • во-вторых - разработка таблиц функций процессов (подпроцессов) т.е. какую функцию по отношению к какому XML-документу будет реализовывать каждый процесс.

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



Рисунок 4.

Рисунок 5.

Заголовок (Рисунок 4), в отличие HTML документа, должен содержать разного рода служебную информацию, в том числе информацию о типе передаваемого документа и процессе его обработки. В информационную обработку поступает тело документа, т.е. содержательная часть обрамленная тагами . Следует отметить, что структуру заголовков должна быть единой для всех типов документов.

Для запущенного сервером Процесса, алгоритм обработки предпочтительно (но не обязательно) строить следующим образом:


Рисунок 6.

Некоторые принципиальные моменты при создании клиентской части

Как уже пояснялось, при создание XML-документа используется его представление в виде DOM модели. Ниже приведен пример части текста Delphi программы создания заголовка xml сообщения.

procedure TThread1.HeaderCreate(Sender: Tobject);
var
// объявление сокласса, необходим для создания
coDoc : CoDomDocument ;
// объекта XMLDomDocument
Doc : DomDocument ;
// объявление объектов DOMElement
r : IXMLDOMElement;
Node : IXMLDOMElement;
// DOMText
txt : IXMLDOMText;
// DOMAttribute
attr : IXMLDOMAttribute;
begin

// создание документа DOM
Doc:=coDoc.Create;
// установка синхронного режима обработки
Doc.Set_async(false);
// начальная инициация DOM документа
Doc.LoadXML('<Header/>');
// получение адреса корневого элемента
r:=Doc.Get_documentElement;

// создание DOMElement (таг <Sender>)
Node := Doc.createElement ( 'Sender');
// создание текстового узла 'ООО "Тайфун"'
txt := Doc.createTextNode( 'ООО "Тайфун"');
// присвоение узлу <Sender> значение
// текстового узла 'ООО "Тайфун"'
Node.appendChild(txt);

// добавление элемента <Sender> в корень документа как дочернего
r.appendChild(Node);

// аналогичные операции для тага <From>
Node := Doc.createElement ( 'From');

txt := Doc.createTextNode( 'http://tayfun.ru/xml/default.asp');
Node.appendChild(txt);
r.appendChild(Node);

// аналогичные операции для тага <To>
Node := Doc.createElement ( 'To');
txt := Doc.createTextNode( 'http://irbis.ru');
Node.appendChild(txt);
r.appendChild(Node);

// создание DOMElement ()
Node := Doc.createElement ( 'TypeDocument');
// создание узла XMLDOMAttribute
Att := Doc.createAttribute ( 'Id ', ' Order');
// <TypeDocument Id="Order"/>
Node.appendChild(Att);
r.appendChild(Node);

end;

Следует отметить, что объявление переменной coDoc : CoDomDocument и Doc : DomDocument , а также ее создание методом Create ( Doc:=coDoc.Create;) осуществляется один раз. Объявление переменной находится в секции описания глобальных переменных, а не в локальной процедуре, как было продемонстрировано для наглядности в данном примере (т.е. одна глобальная переменная типа DomDocument на один программный модуль).

Результатом работы вышеприведенной программы будет созданный заголовок , применительно к нашему примеру xml-документа: изображен на рисунке 5.


Рисунок 5.


Рисунок 6.

Основное преимущество передачи информации в виде XML-документов в том, что существует возможно формировать сообщение, используя независимые структуры таблиц в СУБД как на принимаемой, так и на передаваемой стороне. Используя наш пример, пусть требуется передать информацию об инвойсах Предприятия А, из СУБД имеющий структуру, изображенную на рисунке 6

Для формирования xml-документа, содержащего инвойс первоначально строится SQL-запрос (запрос А) с информацией о самом инвойсе:

 SELECT * FROM Invoice_General
WHERE InvoiceNum = :num
// :num - параметр, который задает номер инвойса.

и далее строится SQL-запрос (запрос В) информация о товарах, описываемых в
инвойсе (детальная спецификация):

SELECT Goods,Qulity,Price, HZ_cod
FROM Goods
WHERE InvoiceNum = :num
// :num - параметр, который задает номер инвойса.

Ниже представлена часть программы, формирующей тело xml-документа:

procedure TThread1.DataBodyCreate(Sender: Tobject);
var
// объявление сокласса и объекта XMLDomDocument
//coDoc : CoDomDocument ;
// должно быть глобальным, для всего модуля.
//Doc : DomDocument ;

// объявление объектов DOMElement
r : IXMLDOMElement;
// DOMElement;
Node, Node2 : IXMLDOMElement;
Node3, Node4 : IXMLDOMElement;
// DOMText
txt : IXMLDOMText;
str : String;

// InvoiceNumber: integer; - глобальная переменная -
// имеет значение 987654
// queryA, queryB : String; - глобальная переменная,
// имеет значение,соответствующее запросу
// queryA - запрос А генеральная информацией об инвойсе
// queryB - запрос B информация о товарах, описываемых в
// инвойсе (см. текст)

begin

// закрывает запрос для доступа
Query.Close;
// см. по тексту "запрос А"
Query.Text := queryA;

// присваивание значения параметров
Query.Params[0].AsInteger := InvoiceNumber;
// выполнение запроса
Query.ExecSQL;
// открытие доступа к данным запроса
Query.Open;

// получение адреса корневого элемента
r:=Doc.Get_documentElement;

// создание DOMElement (таг )
Node2 := Doc.createElement ( ' Request ');
// создание DOMElement (таг )
Node := Doc.createElement ( 'Invoice');
// добавление элемента в корень
r.appendChild(Node2);
// добавление элемента в
Node2. appendChild(Node);

// создание DOMElement (таг )
Node3 := Doc.createElement ( 'Depurture') ;
// добавление элемента в
Node. appendChild(Node3);

// обращение к полю 'Depurture' запроса
str:= Query.FieldByName('Depurture').AsString;
// создание текстового узла = значению поля
txt := Doc.createTextNode( str);
// присвоение узлу значение
// текстового узла, переменной str
Node.appendChild(txt);


// аналогичные операции для тага <Destination>, <DataSend>,
// <DataDepurture>, <Currency>
// <DestinationCompany> (поле DB "Consignee" )

Node := Doc.createElement ( 'Destination');
// имя поля БД может и не совпадать с именем
str:= Query.FieldByName('Consignee ').AsString;
// тага, в этом преимущество использования
txt := Doc.createTextNode( str);
// DOM интерфейса перед СУБД, имеющим поддержку XML-интерфейса,
// типа ORACLE 8i или Ms SQL 2000
Node.appendChild(txt);

...
// формирование запроса на спецификацию по товарам

// закрывает запрос для доступа
Query.Close;
// см. по тексту "запрос В", информац. О товарах
Query.Text := queryВ;

// присваивание значения параметров
Query.Params[0].AsInteger := InvoiceNumber;
// выполнение запроса
Query2.ExecSQL;
// открытие доступа к данным запроса
Query.Open;

// создание DOMElement (таг )
Node3 := Doc.createElement ( ' Imems') ;
// добавление элемента в
Node. appendChild(Node3);

// цикл по всем строкам запроса
while not Eof.Query do begin
Node4 := Doc.createElement ( 'Imem');
// добавление элемента в
Node3.appendChild(Node4);

// формирование данных для тага
str:= Query.FieldByName('Price').AsString;
txt := Doc.createTextNode( str);
Node.appendChild(txt);
...
// аналогичные операции для тагов <HZ_Cod>, <Quality>, <GoodName>
end;
end;


В результате выполнения данной процедуры формируется следующий текст XML-документа:


Для формирования запроса используется метод Open объекта IXMLHttpRequest:

procedure Open(const bstrMethod, - тип метода ="POST"
bstrUrl, - Url адрес сервера
varAsync, - режим связи асинхронный/синхронный = true
bstrUser, - имя пользователя для аутентификации
bstrPassword) - пароль

Создании серверной части обработки документа

Как было отмечено ранее, обработка HTTP запроса может осуществляться либо CGI-приложениями, либо Java-сервлетами. Возможен и вариант написания ASP-страниц. Но в этом случае передача данных возможна только методом "GET" через строку запроса. Хотя, обработка HTTP запроса ASP-страниц работает более эффективнее, чем CGI-приложением. Однако, на мой взгляд, без разницы, как обрабатывать, а важнее решить вопрос - как построить программу обработки, а не какими средствами.

Если из предыдущей главы мы рассмотрели варианты формирования XML-документ, то задача серверного приложения обратная - разбор XML-документов. Ниже представлена часть программы, осуществляющей разбор xml-документа:

procedure Tthread1.DataParser(Sender: Tobject);
var

// объявление объектов DOMElement
r,FNode : IXMLDOMElement;
Str,Filename : String;
parm : String;

// объявление сокласса и
CoDocXML, CoDocXSL, CoDocResult : CoDomDocument ;
// объекта XMLDomDocument
XMLDoc, XSLDoc, ResultDoc : DomDocument ;

// HttpStr : String; - глобальная переменная, содержащая строку HTTP запроса

Begin

// создание документа XMLDoc
XMLDoc:=coDocXML.Create;
// установка синхронного режима обработки
XMLDoc.Set_async(false);
// загрузка DOM документа из строки HttpStr
XMLDoc.LoadXML(HttpStr);

// получение адреса корневого элемента
r:=Doc.Get_documentElement;
// получение значения элемента
FNode:= r.SelectSingleNode("//TypeDocument");
// получение значения атрибута id="Order"
FileName:= FNode.GetAttibute("id");
// и формирование имени файла Order.xsl
FileName:= FileName+".xsl";

// создание документа XSLDoc
XSLDoc:=coDocXSL.Create;
// установка синхронного режима обработки
XSLDoc.Set_async(false);
// загрузка DOM документа из файла Order.xsl
XSLDoc.LoadXML(FileName);

// создание документа XMLDoc
ResultDoc:=coDocResult.Create;
// установка синхронного режима обработки
ResultDoc.Set_async(false);
// установка проверки разбора
ResultDoc.validateOnParse := true;

// разбор XMLDoc по XSL-шаблону
XMLDoc.transformNodeToObject(XSLDoc, ResultDoc);

// переменной Str присваивается текстовое значение
// результирующего документа.
Str:= ResultDoc.text;

// поиск элемента
FNode:= r.SelectSingleNode("//InvoiceNumber");
// и получение значения элемента
parm:= FNode.text;

// закрывает запрос для доступа
Query.Close;
Query.Text := Str;
// присваивание значения параметра
Query.Params[0].AsString := parm;
// выполнение запроса
Query.ExecSQL;
end;

Вся изюминка разбора заключается в применении XSL-шаблона, который сформирован для каждого типа документа индивидуально. Результатом разбора является строка SQL-запроса. В последствие выполнение сформированной строки SQL-запроса осуществит необходимые изменения данных в СУБД.

Преимущество использования разбора через шаблон еще и в том, что получается некая гибкость данных, и получается полная независимость работы алгоритма от программного кода. Ниже приведен используемый для обработки документа типа ORDER текст XSL-шаблона:

<!-- файл Order.xsl -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<xsl:for-each select="//header">
INSERT into TABREG ( FROM, TO, TYPEDOC,body) VALUES( '
<xsl:value-of select="from" />',
'<xsl:value-of select="to" />',
'<xsl:value-of select="TypeDocument/@id" />' )
</xsl:for-each>

<xsl:for-each select="//item">
INSERT into GOODS ( invoiceNumber, name, price, quality) VALUES( ' :num',
'<xsl:value-of select="name" />',
'<xsl:value-of select="price" />',
'<xsl:value-of select="quality" />
' )
</xsl:for-each>

</xsl:template>
</xsl:stylesheet>

Поясняя вышеприведенный пример, надо отметить, что использование пары тагов и носит формальный характер, т.к. после разбора в результирующем XML-документе формально должен присутствовать хотя бы один узел. Метод ResultDoc.text присваивает текстовое значение полученного в ходе разбора XML-документа ResultDoc. В этом случае значением является все то, что обрамлено пары тегов и , т.е. сформированный нами SQL-запрос.

Другой особенностью написания программы надо отметить возможность использования SQL-параметра :num. Использование параметра позволяет упростить текст xsl-шаблона. Определение значение соответствующих элементов узлов XML-документа определяется первоначально выбора по имени соответствующего узла, например:

// поиск элемента и далее использование свойства text:
FNode:= r.SelectSingleNode("//InvoiceNumber");
// и получение значения элемента
parm:= FNode.text;

Коротко об XSL

Аббревиатура XSL происходит от eXtensible Stylesheet Language - язык форматирования таблиц стилей (XML данных). Как понятно из заголовка eXtensible Stylesheet Language (XSL) используется для форматирования XML данных. По определению W3C XSL состоит из двух частей:

  • XSLT - XSL Transformation. Язык, используемый для преобразования или форматирования (трансформирования) XML документов. Таким образом, при помощи XSLT мы можем получить разные разрезы множества данных и формы представления данных.

  • Элементы форматирования. К этим элементам относятся все элементы типографического оформления данных, после их обработки их при помощи XSL. Используется только для формирования HTML страниц.

При помощи XSLT мы можем отобрать нужные нам данные из XML файла, и оформить их в виде для предоставления пользователю. Например, в нашем случае мы преобразовали XML данные в виде SQL запроса. Классическое применение XSL - это, как правило форматирование данных в виде HTML страниц или более редкое представление в виде RTF файлов.

XSL файл описывает шаблон (template), согласно которому будет совершаться преобразование XML данных. Возвращаясь к xsl-шаблонам, в XSLT можно выделить следующие элементы (директивы):

XSL-директивы
описание
xsl:apply-templatesДиректива, указывающая на применение соответствующих шаблонов атрибуту select="имя шаблона"
xsl:attributeсоздает дерево атрибутов и добавляет его в выходной элемент, параметр name="имя атрибута", namespace - URI на пространство имен (префикс пространства имен)
xsl:call-templateвызывает шаблон, атрибуту name=" URI на шаблон"
xsl:choose
xsl:when
xsl:otherwise
осуществление выбора по условию xsl:when expr="вычисление выражения на script ",
language="language-name"
test= "вычисляемое выражение"
xsl:commentгенерирует комментарий в выходной документ
xsl:copy
xsl:copy-of
копирует текущей узел в выходной источник или вставляет фрагмент документа в узел, где атрибут select="имя узла источника"
xsl:elementсоздает выходной элемент по имени, атрибут name="имя элемента", namespace="uri ссылка на пространство имен"
xsl:for-eachповторно применяет шаблон ко всем узлам списка узлов, атрибут select задает список узлов
xsl:ifпроверка условия, задается атрибутом test в виде выражения
xsl:includeвключает внешний шаблон, атрибут href = "URI reference"
xsl:outputспецифицирует выходной результат, атрибут method может иметь значения "xml", "html" или "text"
xsl:paramспецифицирует значение параметров, атрибут name="имя параметра", select = "значение"
xsl:processing-instructionсоздает инструкцию обработки, атрибут name="имя процесс инструкции"
xsl:sortсортирует множество узлов, атрибуты select = "имя узла", data-type = тип данных {"text" | "number" | Qname}, order = направление сортировки {"ascending" | "descending"}
xsl:stylesheetопределяет документ xsl-шаблонов, является корневым элементом для XSLT
xsl:templateопределяет xsl-шаблон, атрибут name= " URI префикс на имя шаблона", match= "указание на узел, к которому применяется шаблон"
xsl:textгенерирует текст в выходной поток, атрибут disable-output-escaping = "yes" или "no", указывает на возможность генерации символов ESC
xsl:value-ofвставляет значение выбранного узла как текст, атрибут select= "указатель на узел" из которого берут значение
xsl:variableспецифицирует значение границ переменных, атрибут name = "имя переменной", select = "вычисление значения переменной"
xsl:with-paramприменяет параметр к шаблону, атрибут name ="имя параметра", select = выражение для вычисления текущего контекста, значение по умолчанию "."

Заключение

В заключение, необходимо отметить, что использование стандартного XML-парсера msxml.dll является не единственным средством разбора и создания XML-документов. Например, для создание XML документов эффективно использовать компоненты TPageProduser и TТableProduser. Но, данная статья лишь подчеркивает широту и возможность применения на практике DOM модели .

Автор будет очень благодарен за отзывы об актуальности темы, общем содержании, стиле изложения, а также всем остальным комментариям, которые помогут в дальнейшем улучшить качество написания сборника статей и выпуску книги, освещающую тему практической стороны использования XML-документов в электронной коммерции. Более подробную информацию о практической стороне применения электронных документов можно почерпнуть на авторском сайте www.eDocs.al.ru Также на авторском сайте планируется разместить исходные тексты и примеры.





Похожие материалы:


Материал входит в категории: SYS | Программирование, Web | Программирование



Источник: http://www.codenet.ru/progr/delphi/stat/Using-XML/
Категория: SYS | Программирование | Добавил: Дофин (2009-09-08) | Автор: Александр Календарев
Просмотров: 2812 | Теги: программирование, XML, DELPHI, COM | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
» Форма входа
Логин:
Пароль:

» Поиск


» Игры

» Окажи помощь

» Реклама
Мебель на заказ - Гардеробные системы. Мебель на заказ в Москве.

» Почта
Логин:
@ityouth.ru
Пароль:
Не удается войти в аккаунт?

» Подписаться на новости
Подписаться через RSS2Email

ИТ новости и ПО




» Всего материалов
Comments: 2502
Forum: 441/5119
Photo: 118
Blog: 18
News: 1525
Downloads: 193
Publisher: 78
Directory: 13534
Ad-board: 14
Games: 218
FAQ: 15
Guestbook: 140
Tests: 34

» Статьи

» Файлы

» Кнопка сайта

ИТ молодежь


» Статистика

Онлайн всего: 6
Гостей: 5
Пользователей: 1
timatron

» Корзина
Ваша корзина пуста



имхо | ссылки | киса

Copyright © 2008 [ ityouth.ru ]

Техническая поддержка: icq [263-504]
Пишите нам: [ Обратная связь ]
Используются технологии uCoz