Создал парсер для ХМЛ. Вот код:
Код:
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, ComCtrls, StdCtrls, Db, MSXML_TLB, ComObj, DBTables,
DataModUnit, HttpSend, SSL_OpenSSL, TntDBGrids, JclUnicode, JclWideStrings;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
TntDBGrid1: TTntDBGrid;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure travelChildren(nlist1:IXMLDOMNodeList);
function insertintotable(stpt:TWideStringList):Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
DataList:TWideStringList;
doc:IXMLDOMDocument;
root,child,child1:IXMLDomElement;
text1,text2:IXMLDOMText;
nlist:IXMLDOMNodelist;
dataRecord:WideString;
ms:TmemoryStream;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i,ret_val,count:Integer;
strData:WideString;
begin
try
ms:=TMemoryStream.Create;
HttpGetBinary('https://........................php?id=1', ms);//ссылка XML-ла
ms.SaveToFile('items.xml');
except
ms.Free;
end;
try
count:=1;
DataList:=TWideStringList.Create;
memo1.Clear;
doc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument;
doc.load('items.xml');
nlist:=doc.getElementsByTagName('item');
memo1.lines.append('Table Name :XMLTable');
memo1.lines.append('---------------------');
DataMod.Table1.EmptyTable;
for i:=0 to nlist.Get_length-1 do
begin
travelChildren(nlist.Get_item(i).Get_childNodes);
strData:=copy(dataRecord,2,length(dataRecord));
// memo1.lines.append(strData);
dataRecord:='';
ret_val:=insertintotable(Datalist);
{ if ret_val=1 then
memo1.lines.append('Data inserted successfully.............!')
else if ret_val=-1 then
memo1.lines.append('Error while updating.....Try again.....!');
memo1.lines.append('============================================='
+'==(Record no. :'+inttostr(count)+')'); }
DataList.Clear;
count:=count+1;
end;
except
on e:Exception do
Showmessage(e.message);
end;
end;
procedure TForm1.travelChildren(nlist1:IXMLDOMNodeList);
var
j:Integer;
temp:WideString;
begin
for j:=0 to nlist1.Get_length-1 do
begin
//node type 1 means an entity and node type 5 means EntityRef
if((nlist1.Get_item(j).Get_nodeType= 1) or (nlist1.Get_item(j).Get_nodeType=5)) then
travelChildren(nlist1.Get_item(j).Get_childNodes)
//node Type 3 means a text node,ie you find the data
else if(nlist1.Get_item(j).Get_nodeType=3) then
begin
temp:= trim(nlist1.Get_item(j).Get_nodeValue);
dataRecord:=dataRecord+','+temp;
DataList.Add(temp);
end
end;
end;
function TForm1.insertintotable(stpt:TWideStringList):Integer;
var
I:Integer;
begin
DataMod.Table1.close;
DataMod.Table1.open;
DataMod.Table1.Insert;
for I := 0 to stpt.Count - 1 do
begin
DataMod.Table1.Fields[I].AsVariant:= stpt[I];
end;
try
DataMod.Table1.post;
result:=1;
except
on E:Exception do
result:=-1;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DataMod.Table1.Active:=True;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DataMod.Table1.Active:=False;
end;
end.
Все нормально работает, сохраняет ХМЛ в своей директории, парсит и сохраняет как ДБ, только вот TNTDBGrid, в нем не отображаются наши буквы (ö,ü,ə,ğ). По смыслу в тнт должно это отображатся, но на сколько я понимаю во время парсировки он берет их как стринг. Подскажите пож-та, как исправить такую проблему?