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

Обмен информацией в формате 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

В итоге мы сформируем следующее дерево документа:


Демонстрационный пример с исходным текстом на Delphi вы можете скачать здесь.

Дополнительные материалы по теме: