Webbrowser, XML in shrani "source"

Vse kar se tiče programiranja za internet.
Primoz
Prispevkov: 285
Pridružen: 15.06.2001 08:52:14

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a Primoz » 06.12.2007 10:54:43

Pozdravljeni!

Trenutno se ukvarjam z uvozom XML podatkov in prikazom XML datoteke v webbrowserju, a se kar naprej vrtim v krogu in verjetno, da ne vidim očitne rešitve. Prosil bi za malce pomoči.

Stvar pa je naslednja: ena od borznih hiš daje podatke o opravljenih borzih transakcijah v XML datoteki, ki že vsebuje tudi podatke o oblikovanju (xslt).

To je dobro, ker lahko to stran odprem v Webbrowserju in uporabnik vidi pred seboj izpisek, ki je identičen papirnemu.
Slabost pa je v tem, da bi moral zdaj točno to vsebino (ki jo vidim, če izberem View Source) posneti na disk, odstraniti prvo vrstico, ki vsebuje podatke, kje se nahaja xslt datoteka) in potem shraniti. Edino tako mi uspe uporabiti komponento XMLTransformProvider, s katerim potem odprem ta XML, da ven dobim podatke.

Če želim z XMLTransformProviderjem odpreti kar XML na internetnem naslovu (torej da ni lokalno shranjen), dobim le podatke o stolpcih, ampak noter pa nobene vrednosti...

Kakšen nasvet bi bil nadvse cenjen :)

LP.
Primož.

kutulu
Prispevkov: 60
Pridružen: 17.08.2004 19:42:23

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a kutulu » 08.12.2007 16:09:39

Pozdrav,

če prav zastopim situacijo, bi rad na nek način spremenil header v XMLju, pravzaprav samo referenco na XSLT fajl. Oba fajla sta na oddaljeni lokaciji.
Če ti ne dela XMLTransformProvider na tak način, kot ga uporabljaš, uporabi workaround :) . Predvidevam, da nastaviš XMLDataFile in TransformRead->TransformationFile lastnosti kar direktno na URL. vendar kot rezultat dobiš le ColumnNames-e iz XMLja?

Uporabi TXMLDocument komponento, nastavi FileName = URL, postaviš Active na True, napišeš modifikacijo stringa znotraj vsebine XMLja v eventu AfterOpen, preko XML lastnosti (tipa TStrings). Torej prvo vrstico odstraniš, nadomestiš s pravilno referenco na XSLT datoteko in podatke pošlješ dalje na XMLTransformProvider.
(presnameš samo XSLT datoteko lokalno k sebi, XML bereš direktno z naslova, nadaljuješ z uvozom v bazo)

LP,
Rok
Circumstances are in control. You are just ONE of them.

Primoz
Prispevkov: 285
Pridružen: 15.06.2001 08:52:14

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a Primoz » 09.12.2007 10:42:47

Ja, iz headerja bi rad vrgel ven prvo vrstico - referenco na XSLT, in da, obe datoteki sta na oddaljeni lokaciji. Poleg tega pa bi rad tako popravljen XML posnel na lokalni disk.

Problem je točno v tem, kot si ugotovil - če delam na lokalni datoteki (da ročno v IE posnamem source na svoj disk) potem dobim kot rezultat tudi vrednost, če pa dostopam do oddaljene datoteke, pa je rezultat kot že prej omenjeno - le prazni stolpci.

Če želim uporabiti komponento TXMLDocument komponento in nastavim FileName na pravi URL in nato nastavim Active na True pa žal dobim sporočilo o napaki:

---------------------------
Error
---------------------------
Cannot open file "C:\Delphi\Delnice\Delnice za Delphi2006-IB\https:\stranke.certius.com\obracunxml.asp?KDD=XXXX&invoice_id=YYYYYYYYY. The filename, directory name, or volume label syntax is incorrect.
---------------------------
OK Details >>
---------------------------

Očitno skupaj kot URL skombinira lokalno pot do programa (C:\Delphi\Delnice\Delnice za Delphi2006-IB) in naslov URL, ki sem ga vpisal v polje FileName.

Zato iščem pot, kako iz komponente TWebbrowser shraniti source (dejanski XML source in ne HTML oblikovano stran - to kar naredijo vse rešitve, ki sem jih našel tudi na forumu...
lp.
Primož.
Zadnjič spremenil Primoz, dne 09.12.2007 10:44:44, skupaj popravljeno 1 krat.

Uporabniški avatar
Lee_Nover
Prispevkov: 3653
Pridružen: 20.05.2001 14:31:55

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a Lee_Nover » 09.12.2007 13:14:24

naredi navaden HTTP GET (ne rabs browser komponente, lahko z WinHttp/Inet al pa Indy), potem pa odstrani processing instruction (xml-stylesheet)
mi je pa cudno, da stylesheet vpliva na transform providerja ...
.. my 2 c ..
- I hate noobs -

Primoz
Prispevkov: 285
Pridružen: 15.06.2001 08:52:14

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a Primoz » 09.12.2007 13:48:45

naredi navaden HTTP GET (ne rabs browser komponente, lahko z WinHttp/Inet al pa Indy), potem pa odstrani processing instruction (xml-stylesheet)
mi je pa cudno, da stylesheet vpliva na transform providerja ...
Poizkusil sem takole:

fs := TFileStream.Create('c:\delphi\test.html', fmCreate);
IdHTTP1.Get(URL, fs);
fs.Free;

pa dobim sporočilo o napaki : Unknown protocol...

lp.
Primož.

Uporabniški avatar
Lee_Nover
Prispevkov: 3653
Pridružen: 20.05.2001 14:31:55

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a Lee_Nover » 09.12.2007 14:43:32

ker rabis za Indy dodat SSL IOHandler in OpenSSL knjiznice .. po pravic povedan s tem nisem se delu .. zato rajs uporabljam Winhttp in dela BP :)
.. my 2 c ..
- I hate noobs -

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a Runner » 09.12.2007 19:44:20

Trenutno ne najdem kode ki jo imam za ta namen, sem ti pa poiskal primer nečesa podobnega

Koda: Izberi vse

  
    uses WinInet;

    function GetInetFile (const fileURL, FileName: String): boolean;
    const
      BufferSize = 1024;
    var
      hSession, hURL: HInternet;
      Buffer: array[1..BufferSize] of Byte;
      BufferLen: DWORD;
      f: File;
      sAppName: string;
    begin
      result := false;
      sAppName := ExtractFileName(Application.ExeName) ;
      hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0) ;
      try
        hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0) ;
        try
          AssignFile(f, FileName) ;
          Rewrite(f,1) ;
          
          repeat
            InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen) ;
            BlockWrite(f, Buffer, BufferLen)
          until BufferLen = 0;

          CloseFile(f) ;
          result := True;
        finally
          InternetCloseHandle(hURL)
        end
      finally
        InternetCloseHandle(hSession)
      end
    end; 
ali pa (tega drugega nisem še probal v praksi)

Koda: Izberi vse

uses ExtActns.pas...;

function Download_HTM(const sURL, sLocalFileName : string): boolean;
begin
  Result := True;
  with TDownLoadURL.Create(nil) do
  try
    URL:=sURL;
    Filename:=sLocalFileName;
    try
      ExecuteTarget(nil) ;
    except
      Result:=False
    end;
  finally
    Free;
  end;
end;
BTW koda je z http://delphi.about.com/od/networking/a ... raping.htm
Zadnjič spremenil Runner, dne 09.12.2007 19:45:24, skupaj popravljeno 1 krat.

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a Runner » 09.12.2007 19:55:12

Eh se opravičujem, sem šele zdaj opazil da gre za SSL connection. Saj v osnovi sem ti pravo kodo podal, samo preberi si še tole zraven pa bo: http://support.microsoft.com/kb/168151

Primoz
Prispevkov: 285
Pridružen: 15.06.2001 08:52:14

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a Primoz » 10.12.2007 07:50:27

Eh se opravičujem, sem šele zdaj opazil da gre za SSL connection. Saj v osnovi sem ti pravo kodo podal, samo preberi si še tole zraven pa bo: http://support.microsoft.com/kb/168151
Hvala, bom preveril tudi tole. Trenutno sem se spravil preizkusiti WinHTTP komponente, ki jih je predlagal Lee_Nover, nato pa bom še tole kodo pretestiral.

LP.
Primož.

Uporabniški avatar
Lee_Nover
Prispevkov: 3653
Pridružen: 20.05.2001 14:31:55

Webbrowser, XML in shrani "source"

Odgovor Napisal/-a Lee_Nover » 10.12.2007 12:37:04

hm, verjetno si najdu winhttp od UtilMind ..jaz govorim o sistemski komponenti, ki jo uvozis preko Components/Import Type Library
Runner: ni lepsega kot koda, ki ne preverja rezultatov funkcij :)
.. my 2 c ..
- I hate noobs -

Odgovori