Загрузка и анализ документа XML в Delphi

Обмен информацией в формате XML - это чрезвычайно удобный механизм, позволяющий свести к минимуму проблемы внутрифирменных форматов данных. Эти проблемы сводятся к сложностям при обмене информацией с контрагентами фирмы. Зачастую проблема стоит не только в невозможности других воспринимать предлагаемый вами формат (DBF, ASCII и т.п.), сколько в нежелании приспосабливаться к ним. Эти форматы не очень удобны. К тому же у вашего партнера наверняка уже есть наработки в этой области. Так почему бы вам не приспособится к его формату обмена данными?

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

Технология XML тоже не назовешь родной, однако ее возможности и универсальность при описании текстовых данных перекрывают все сложности, связанные с ее освоением.

Формировать документы в формате XML достаточно просто. Следует лишь познакомится с конкретным DTD и образцами корректных документов. А вот загрузка может быть достаточно трудна, если не прибегать к помощи готовых решений в виде XML парсеров. Их довольно много для разных платформ и при желании можно найти их описания в WWW. Одним из наиболее распространенным на платформе Windows является Microsoft XML Parser. Дело в том, что он входит в состав Microsoft Explorer 5.0 и более позние версии. Он доступен в виде объекта ActiveX. Данный парсер является верифицирующим, то есть проверяет не только синтаксическую проверку документа, но и семантическую корректность в соответствии с заданным DTD.

Для загрузки и анализа документа в Delphi рассмотрим следующий код.


procedure LoadOnixDoc(const FileName: string);  
var  
  XML: variant;  
  Node, mainNode, childNodes: variant;  
  i: integer;  
  TreeNode: TTreeNode;  
  
  procedure LoadItems(TreeNode: TTreeNode; Node: variant);  
  var i: integer;  
  begin  
    TreeNode := TV.Items.AddChild(TreeNode, Node.nodeName);  
    TreeNode.ImageIndex := TreeNode.Level;  
    TreeNode.SelectedIndex := TreeNode.ImageIndex;  
    if Node.nodeName = '#text' then  
    begin  
      TreeNode.Text := Node.nodeValue;  
      TV.SetNodeBoldState(TreeNode, true);  
    end;  
    for i:=0 to Node.childNodes.length-1 do  
     LoadItems(TreeNode, Node.childNodes.item[i]);  
  
  end;  
begin   
  XML := CreateOleObject('Microsoft.XMLDOM');  
  XML.load(FileName);  
  
  if XML.parseError.reason <> '' then  
  begin  
    ShowMessage( XML.parseError.reason );  
  end else  
  begin  
  
    mainNode := XML.documentElement;  
    childNodes := mainNode.childNodes;  
    LoadItems(nil, mainNode);  
    TreeNode := TV.Items[1];  
    while Assigned(TreeNode) do  
    begin  
      TreeNode.Expand(false);  
      TreeNode := TreeNode.GetNextSibling;  
    end;  
    if Assigned(TV.Items[0]) then TV.Items[0].Expand(false);  
  
  end;  
end; 

Пример документа XML Onix.


<?xml version="1.0" encoding="windows-1251"?>  
<!DOCTYPE ONIXMessage SYSTEM "onix-international.dtd">  
  
<ONIXMessage release="1.1">  
  
    <FromCompany>ТД Библио-Глобус</FromCompany>  
    <FromPerson>Kirillov Alexey kirillov@biblio-globus.u</FromPerson>  
    <ToCompany>EDItEUR</ToCompany>  
    <ToPerson>EDItEUR chief manager</ToPerson>  
    <MessageNumber>1</MessageNumber>  
    <SentDate>23.12.00</SentDate>  
    <DefaultLanguageOfText>rus</DefaultLanguageOfText>  
    <Product>  
        <RecordReference>247825</RecordReference>  
        <NotificationType>3</NotificationType>  
        <ISBN>966-7393-05-4</ISBN>  
        <ProductForm>BB</ProductForm>  
        <DistinctiveTitle>SQL энциклопедия пользователя</DistinctiveTitle>  
        <Contributor>  
            <ContributorSequenceNumber>0</ContributorSequenceNumber>  
            <ContributorRole>A01</ContributorRole>  
            <PersonName>Х. Ладани</PersonName>  
            <PersonNameInverted>Ладани, Х.</PersonNameInverted>  
            <BiographicalNote>Книга раскрывает темы, которые часто  
             не описываются или достаточно кратко представлены в  
             руководствах пользователя  
             - подзапросы, структуры данных, представления,  
             производительность, целостность и защита данных.  
            </BiographicalNote>  
        </Contributor>  
        <NumberOfPages>624</NumberOfPages>  
        <ImprintName>ДиаСофт</ImprintName>  
        <MediaFile>  
            <MediaFileTypeCode>04</MediaFileTypeCode>  
            <MediaFileFormatCode>03</MediaFileFormatCode>  
            <MediaFileLinkTypeCode>06</MediaFileLinkTypeCode>  
            <MediaFileLink>  
            http://shop.biblio-globus.ru/photos1/05/58983.jpg  
            </MediaFileLink>  
        </MediaFile>  
        <SupplyDetail>  
            <SupplierName></SupplierName>  
            <AvailabilityCode></AvailabilityCode>  
            <Price>  
                <PriceTypeCode>01</PriceTypeCode>  
                <PriceAmount>425</PriceAmount>  
                <CurrencyCode>RUB</CurrencyCode>  
            </Price>  
        </SupplyDetail>  
    </Product>  
  
</ONIXMessage>  

Для работы Вам понадобятся файлы DTD: ONIX INTERNATIONAL DTD
Теги:
XML
Добавлено: 30 Июля 2018 20:27:08 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...