Avatar billede rbl Praktikant
02. august 2005 - 03:11 Der er 11 kommentarer og
1 løsning

xmlhttp.responseBody ?

Hejsa

Jeg bruger xmlhttp.responseBody til at hente indholdet på nogle bestemte websider:

---------------------------------
function HentWebside(httplink)
set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.open "GET", httplink, false
xmlhttp.send ""
tekstArr = xmlhttp.responseBody

tekst = ""
For i = 1 to UBound(tekstArr)
    tekst = tekst & chrw(ascw(chr(ascb(midb(tekstArr,i,1)))))
Next

--Parserkode--

end function
---------------------------------

Problemet er, at for-løkken i nogle tilfælde tager utrolig lang tid om at løbe igennem koden. Hvis f.eks responseBody returnerer en webside på 700 linier kode, tager løkken ca. et sekund om at blive færdig. Hvis den derimod returnerer en webside med f.eks 4000 linier kode, tager den 3-4 minutter, hvor den bruger 100% af serverens cpu-kraft. Det er uholdbart, da ingen andre kan bruge serveren i den tid.

Når 700 liniers kode tager 1 sekund, burde 4000 liniers kode ikke tage 3-4 minutter. Nogen der har nogle forslag til hvad jeg kan gøre ?

Jeg har også prøvet med xmlhttp.responseText. Det går lynende hurtigt, men den kan ikke finde ud af æ, ø og å. Der kommer bare et ? i stedet for.

Håber I kan hjælpe.
Avatar billede arne_v Ekspert
02. august 2005 - 07:58 #1
? lyder som ISO-8859-1/CP-1252 vist som UTF-8

har du styr på charset ?
Avatar billede softspot Forsker
02. august 2005 - 10:53 #2
Grunden til at det performer så ringe med mange linier, er at du allokerer og deallokerer strengen hver gang du sammensætter den. Oveni det konverterer du hver karakter i streng fra byte-ascii til char til unicode-ascii til unicode-char, hvilket jo heller ikke gør det hurtigere.

Hvis du ikke allerede har været der, så tag evt. et kig på
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceappservices5/html/wce50oriXMLHTTP.asp
for at få lidt mere info om hvordan xmlhttp fungerer.

Jeg tror umiddelbart jeg ville bruge ADODB.Stream-objektet til at hente og konvertere data til en normal streng - det er ret hurtigt selv med store strenge...
Avatar billede softspot Forsker
02. august 2005 - 10:57 #3
Du kan f.eks. bruge denne funktion til at konvertere fra bytearray til VBScript-string (fundet på http://www.motobit.com/tips/detpg_binarytostring/)

'Stream_BinaryToString Function
'2003 Antonin Foller, http://www.motobit.com
'Binary - VT_UI1 | VT_ARRAY data To convert To a string
'CharSet - charset of the source binary data - default is "us-ascii"
Function Stream_BinaryToString(Binary, CharSet)
  Const adTypeText = 2
  Const adTypeBinary = 1
 
  'Create Stream object
  Dim BinaryStream 'As New Stream
  Set BinaryStream = CreateObject("ADODB.Stream")
 
  'Specify stream type - we want To save text/string data.
  BinaryStream.Type = adTypeBinary
 
  'Open the stream And write text/string data To the object
  BinaryStream.Open
  BinaryStream.Write Binary
 
 
  'Change stream type To binary
  BinaryStream.Position = 0
  BinaryStream.Type = adTypeText
 
  'Specify charset For the source text (unicode) data.
  If Len(CharSet) > 0 Then
    BinaryStream.CharSet = CharSet
  Else
    BinaryStream.CharSet = "us-ascii"
  End If
 
  'Open the stream And get binary data from the object
  Stream_BinaryToString = BinaryStream.ReadText
End Function
Avatar billede rbl Praktikant
02. august 2005 - 15:27 #4
Softspot --> Tak for det, det gjorde en verden til forskel med den funktion. Nu tager det ca. 5 sekunder.

Hvilket charset skal jeg bruge for at den genkender æ, ø og å ?  Når den bruger us-ascii, smider den æ, ø og å væk.
Avatar billede rbl Praktikant
02. august 2005 - 15:35 #5
Jeg fandt selv ud af det med charset. Jeg bruger "iso-8859-1". Er det ikke korrekt ?

Softspot --> Hvis du lægger et svar, får du pointene.
Avatar billede softspot Forsker
02. august 2005 - 15:46 #6
Godt du kom videre :)
Avatar billede softspot Forsker
02. august 2005 - 15:47 #7
Jeg vil umidelbart anbefale at du benytter UTF-8 hvis du selv skal generere noget, men i dette tilfælde er det vist snarere et spørgsmål om hvilken encoding data har når du henter dem fra den pågældende url...
Avatar billede rbl Praktikant
02. august 2005 - 15:51 #8
Ja, jeg har ingen indflydelse på hvilket charset der er brugt på websiderne.

Jeg skal bare sørge for, at jeg får det korrekte indhold ud.
Avatar billede softspot Forsker
02. august 2005 - 16:01 #9
Jeg tror du kan finde det benyttede charset ved at kalde xmlhttp.getResponseHeader("Content-Disposition") eller noget i den stil. Jeg kan ikke lige disse headers i hovedet, men du kan evt. få en indikation ved at kalde og udskrive/logge xmlhttp.getAllResponseHeaders().
Avatar billede softspot Forsker
02. august 2005 - 16:02 #10
...og tak for de mange point (måske nok lige i overkanten - men hvad...) :)
Avatar billede rbl Praktikant
02. august 2005 - 16:13 #11
Jeg har det sådan, at hvis jeg støder på et problem, der er så stort/essentielt for hele projektet, er jeg villig til at give max point for at få det løst. Så er jeg ligeglad med, at det måske kun tog nogle få minutter for dig at løse det. Det reddede min dag :-)

Tak for hjælpen.
Avatar billede softspot Forsker
02. august 2005 - 17:20 #12
fair nok :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester