![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый, день!!! Ребят подскажите как загрузить XML -файл в StringGrig (но при этом: имя атрибута -заголовок столбца, а знгачение атрибута - запись в поле )??????
|
|
#2
|
|||
|
|||
|
Цитата:
Руками, пользуясь 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
|
|||
|
|||
|
Код:
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
|
|||
|
|||
|
Imikle здорово! А я даже и не знал этого. Спасибо. А то все ручками,ручками. :-)
|
|
#5
|
|||
|
|||
|
Да пожалуйста.
Только обрати внимание - там есть одна хитрость. Переменая для документа объявляется как интерфейс (IXMLDocument), а создается через дельфевую обертку (TXMLDocument). Это задокументироваый обход проблемы автопомирания внутренего объекта. Вычитал на сайте CodeGear. |
|
#6
|
|||
|
|||
|
Спасибо, реально помогло
|
|
#7
|
|||
|
|||
|
Цитата:
Сегодня тоже пришелся кстати. Спс. |
|
#8
|
||||
|
||||
|
Цитата:
|
|
#9
|
|||
|
|||
|
Да есть такой эффект. Если TXMLDocuemnt создается динамически, а не "бросается" на форму, то тот COM-объект, для которого компонент является оберткой, иногда "умирает" до момента обращения к нему. Наступил на эти грабли сам.
|
|
#10
|
||||
|
||||
|
Понятно, у меня такого не наблюдалось, но если помрет буду иметь ввиду. Спасибо.
|