Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.07.2008, 13:11
Carlo Carlo вне форума
Прохожий
 
Регистрация: 10.07.2008
Сообщения: 2
Репутация: 10
Восклицание XML, реально не понятно....

Добрый, день!!! Ребят подскажите как загрузить XML -файл в StringGrig (но при этом: имя атрибута -заголовок столбца, а знгачение атрибута - запись в поле )??????
Ответить с цитированием
  #2  
Старый 10.07.2008, 13:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,037
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Carlo
Добрый, день!!! Ребят подскажите как загрузить XML -файл в StringGrig (но при этом: имя атрибута -заголовок столбца, а знгачение атрибута - запись в поле )??????

Руками, пользуясь TXMLDocument.

Пример из реального проекта, для доступа к атрибутам надо пользоваться соотв. свойствами:
Код:
procedure TUpdateInfo.Parse(ADoc: IXMLDocument);
var
  I : Integer;
  ANode : IXMLNode;
begin
    For I := 0 To ADoc.DocumentElement.ChildNodes.Count-1 Do
      Begin
        ANode := ADoc.DocumentElement.ChildNodes[i];
        If ANode.NodeName = 'VersionNumber' Then
          Begin
            VersionNumber.Major := StrToIntDef(ANode.ChildNodes.FindNode('Major').Text,0);
            VersionNumber.Minor := StrToIntDef(ANode.ChildNodes.FindNode('Minor').Text,0);
            VersionNumber.Release := StrToIntDef(ANode.ChildNodes.FindNode('Release').Text,0);
            VersionNumber.Build := StrToIntDef(ANode.ChildNodes.FindNode('Build').Text,0);
          End;
        If ANode.NodeName = 'ProgramName' Then
          Begin
            FProgramName := ANode.Text;
          End;
        If ANode.NodeName = 'ReleaseNotes' Then
          Begin
            FReleaseNotes.Text := ANode.Text;
          End;
        If ANode.NodeName = 'ModuleFileName' Then
          Begin
            FModuleFileName := ANode.Text;
          End;
      End;
end;

procedure TUpdateInfo.LoadFromStrings(AStrings: TStringList);
var
  ADoc : IXMLDocument;
begin
  ADoc := TXMLDocument.Create(Nil);
  ADoc.XML.Assign(AStrings);
  ADoc.Active := True;

  Try
    Parse(ADoc);
  Finally
    ADoc := Nil;
  End;
end;
Ответить с цитированием
  #3  
Старый 10.07.2008, 13:56
YERokez YERokez вне форума
Прохожий
 
Регистрация: 27.10.2007
Сообщения: 22
Репутация: 10
По умолчанию

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
    t_StrList:TStringList;
    i,t_pos:integer;
    t_Str:String;
begin
{
    <COL1 name="COL1">qqq1</COL1>
    <COL2 name="COL2">qqq2</COL2>
    <COL3 name="COL3">qqq3</COL3>
    <COL4 name="COL4">qqq4</COL4>
}
    Self.OpenDialog1.Execute;
    if Self.OpenDialog1.FileName='' then exit;

    t_StrList:=TStringList.Create;
    try
        t_StrList.LoadFromFile(Self.OpenDialog1.FileName);

        Self.StringGrid1.ColCount:=t_StrList.Count;
        Self.StringGrid1.RowCount:=2;

        For i:=0 to t_StrList.Count-1 do
        Begin
            t_Pos:=0;
            t_Pos:=POS('"',t_StrList[i]);
            if t_Pos<>0 then
            Begin
                t_Str:=copy(t_StrList[i],t_pos+1,length(t_StrList[i])-t_Pos);
                t_Pos:=POS('"',t_Str);
                Self.StringGrid1.Cells[i,0]:=copy(t_Str,1,t_pos-1);
                t_Str:=Copy(t_Str,t_pos+2,length(t_Str)-t_Pos-1);
                t_Pos:=POS('<',t_Str);
                Self.StringGrid1.Cells[i,1]:=copy(t_Str,1,t_pos-1);
            end;
        End;
    Finally
        t_StrList.Free;
    End;


end;

Вот работающий примечик. Только не стал заморачиваться с заголовками XML.
Ответить с цитированием
  #4  
Старый 10.07.2008, 13:59
YERokez YERokez вне форума
Прохожий
 
Регистрация: 27.10.2007
Сообщения: 22
Репутация: 10
По умолчанию

Imikle здорово! А я даже и не знал этого. Спасибо. А то все ручками,ручками. :-)
Ответить с цитированием
  #5  
Старый 10.07.2008, 18:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,037
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да пожалуйста.
Только обрати внимание - там есть одна хитрость.
Переменая для документа объявляется как интерфейс (IXMLDocument), а создается через дельфевую обертку (TXMLDocument).

Это задокументироваый обход проблемы автопомирания внутренего объекта. Вычитал на сайте CodeGear.
Ответить с цитированием
  #6  
Старый 10.07.2008, 18:54
Carlo Carlo вне форума
Прохожий
 
Регистрация: 10.07.2008
Сообщения: 2
Репутация: 10
По умолчанию

Спасибо, реально помогло
Ответить с цитированием
  #7  
Старый 11.10.2010, 18:35
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Цитата:
Сообщение от lmikle
Пример из реального проекта, для доступа к атрибутам надо...
Неплохой пример.
Сегодня тоже пришелся кстати.
Спс.
Ответить с цитированием
  #8  
Старый 11.10.2010, 22:38
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Это задокументироваый обход проблемы автопомирания внутренего объекта.
А поподробнее, что за автопомирание? Что-то не сталкивался с подобным.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 12.10.2010, 00:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,037
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да есть такой эффект. Если TXMLDocuemnt создается динамически, а не "бросается" на форму, то тот COM-объект, для которого компонент является оберткой, иногда "умирает" до момента обращения к нему. Наступил на эти грабли сам.
Ответить с цитированием
  #10  
Старый 12.10.2010, 18:03
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Понятно, у меня такого не наблюдалось, но если помрет буду иметь ввиду. Спасибо.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter