Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2011, 14:21   #1
Gauss
Форумчанин
 
Аватар для Gauss
 
Регистрация: 26.11.2007
Сообщений: 235
По умолчанию Юникод при парсировке XML, пользуюсь TNTUnicode, SYNAPSE и библиотекой JCL

Создал парсер для ХМЛ. Вот код:

Код:
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, в нем не отображаются наши буквы (ö,ü,ə,ğ). По смыслу в тнт должно это отображатся, но на сколько я понимаю во время парсировки он берет их как стринг. Подскажите пож-та, как исправить такую проблему?
Gauss вне форума Ответить с цитированием
Старый 13.01.2011, 15:58   #2
Gauss
Форумчанин
 
Аватар для Gauss
 
Регистрация: 26.11.2007
Сообщений: 235
По умолчанию

Помогите пож-та, а то придется установить студио и на шарпе это делать, другого выхода нет((
Gauss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Jcl - получение локальных переменных AMaKc Компоненты Delphi 2 14.10.2010 08:36
Проблема при создании xml armagedon_atyrau Microsoft Office Excel 0 01.07.2010 10:40
Проблема при загрузке файла XML в TreeView artemavd Общие вопросы Delphi 1 20.06.2010 15:39
Jcl и Jvcl -> C++ Builder vaginoid2 C++ Builder 1 18.12.2009 19:30
Обработка XML строки при загрузке dbf в Delphi SereJa1020 БД в Delphi 1 18.12.2007 18:28