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

Ваш аккаунт

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

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

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

Загрузка и анализ документа 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 вы можете скачать здесь.

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

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

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

Комментарии

1.
9.0K
03 декабря 2006 года
mr_smit
64 / / 03.12.2006
+1 / -0
Мне нравитсяМне не нравится
18 февраля 2008, 10:45:56
Демонстрационный пример не грузится. Ссылка умерла. Обновите ссылки!
2.
13K
24 января 2006 года
zxspectrum128k
9 / / 24.01.2006
Мне нравитсяМне не нравится
28 мая 2007, 01:23:23
Конечно же Руками =)
3.
Аноним
Мне нравитсяМне не нравится
3 февраля 2005, 12:19:54
Re: Renegade
Не пишут, т.к. написать его можно с помощью любого текстового редактора. Кое-какие полуавтоматические редакторы есть, но без них это делать проще.
4.
Аноним
Мне нравитсяМне не нравится
23 сентября 2004, 12:15:26
Блах! Везде пишут как прочитать xml с помощью MSXML и никто не пишет про то, чем можно его написать =(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог