Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

Автор: Александр Календарев

Использование С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 сервер Поставщика В.

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

схема организации обмена с использованием XML технологии
Рисунок 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 документ был правильно сформирован, необходимо его две составные части "Заголовок" и "Запрос" обрамить тегами, например . Вид типового документа представлен ниже:

структура XMLдокумента структура Заголовка XML документа
Рисунок 4. Рисунок 5.

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

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

алгоритм анализа XML документа
Рисунок 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.

структура заголовка XMLдокумента
Рисунок 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-документа:

текст 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 Также на авторском сайте планируется разместить исходные тексты и примеры.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
54K
03 ноября 2009 года
vbilez
0 / / 03.11.2009
Мне нравитсяМне не нравится
3 ноября 2009, 14:45:40
работает, токо надо импортировать msxml_tlb и прописать в uses
2.
54K
03 ноября 2009 года
vbilez
0 / / 03.11.2009
Мне нравитсяМне не нравится
3 ноября 2009, 14:44:54
на делфи 6 надо импортировать msxml_tlb
project - import type library - microsoft xml 2.0 - create unit
3.
29K
18 мая 2007 года
SuperDed
0 / / 18.05.2007
+1 / -0
Мне нравитсяМне не нравится
18 мая 2007, 10:40:16
Попробовал пример по формированию заголовка.
Ошибка вылетала на строке из примера:
txt := Doc.createTextNode( 'ООО "Тайфун"');
Открыл библиотеку посмотрел и поменял обьявления:
было:
Var
.....
txt : IXMLDOMText;

надо :
Var
.....

txt : IXMLDOMCharacterData;

ну и все заработало
4.
23K
09 ноября 2006 года
Bas Taller
0 / / 09.11.2006
+1 / -0
Мне нравитсяМне не нравится
9 ноября 2006, 16:17:34
Ребят, я конечно понимаю, хочется всего и сразу...
А не судьба ещё по инету полазить - на Delphi Kingdom эта же, но уже переработанная статья. Итак, ближе к делу.
Ошибка у всех возникает вот из-за следующей неточности.
Нужно писать
Doc.LoadXML('<Header/>');
вместо
Doc.LoadXML('');
Логично, иначе документ пуст... -> nil.
Автору статьи - респект!
5.
Аноним
+1 / -0
Мне нравитсяМне не нравится
18 декабря 2005, 19:14:46
Да, код не компилируется. Лажа происходит с самого начала, т.е. после выполнения строки r:=Doc.Get_documentElement; переменная r всё равно остаётся nil.
6.
Аноним
Мне нравитсяМне не нравится
4 ноября 2005, 11:46:51
Я только что наткнулся на эту статью. Как только увидел иллюстрации к статье хотел было сразу уйти. Дело в том, что я читал предыдущую версию этой статьи, где половина кода не работала. Теперь попробую эту версию. :-)
7.
Аноним
Мне нравитсяМне не нравится
20 июля 2005, 12:48:58
На Delphi 6 приведённый выше код не работает,
то несовместимоть типов, то эксепшины, может я что-нибудь не так делаю?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог