Jag har gjort en funktion som hämtar en ASP genererad XML-fil genoom XMLHttp. Denna sparar jag ner som en temporär fil på servern för att sedan öppna den. Vilken rad är nummer 11? Jag har löst problemet nu, fick använda mig av en annan metod. Hur löste du det? Kan ju vara bra att veta. =) Eftersom jag letade runt efter en lösning på mitt problem insåg jag snabbt och självklart att fler säkert hade samma problem :) så här kommer lösningenHämta XML via XMLHttp för att sedan spara lokalt: problem?
Problemet jag stöter på är att när jag skall skriva till filen så får jag ett litet felmeddelande, verkar bero på att jag har flera rader text inne i en specifik tag?
Felet blir:
<code>
Microsoft VBScript runtime error '800a0005'
Invalid procedure call or argument
/system/xmltest.asp, line 11
</code>
XMLTest.asp
<code>
s = GetHTML("http://www.rudyalvarado.com/system/genXML.asp?id=166")
Set cFSO = CreateObject("Scripting.FileSystemObject")
SavePath = "testar.xml"
Set responsefile = cFSO.CreateTextFile(Server.MapPath(SavePath))
responsefile.Writeline(s)
responsefile.close
</code>
Slutligen då XML-filen som ser ut så här:
<code>
<ARTIKEL>
<RUBRIK>Bongo blir Infocore</RUBRIK>
<PUFF>kldsjfkdlsjf</PUFF>
<INGRESS>Ingress</INGRESS>
<SKRIBENT>Viktor Bergman</SKRIBENT>
<SKRIVET>2003-06-01 22:10:00</SKRIVET>
<BRODTEXT>Från att ha hetat Bongo New Media Consultants har vi nu bytt namn till Infocore Solutions</BRODTEXT>
</ARTIKEL>
</code>Sv: Hämta XML via XMLHttp för att sedan spara lokalt: problem?
Alltså vilken rad genererar felet?Sv: Hämta XML via XMLHttp för att sedan spara lokalt: problem?
Sv: Hämta XML via XMLHttp för att sedan spara lokalt: problem?
Sv: Hämta XML via XMLHttp för att sedan spara lokalt: problem?
Det jag gör är att hämtar hem filen med XMLHttp och sparar den temporärt på servern för att sedan loopa igenom den och sedan radera filen.
Först slänger jag ihop en unik sträng så jag inte skriver över filer...
<code>
tempName = Replace(now, ":", "")
tempName = Replace(tempName, " ", "")
<code>
Sen börjar själva koden då, som jag uppenbarligen inte ligger bakom ursprungligen ;)
URLer ligger i theURLS i en array som är separerad enligt detta format URL|URL|URL. Jag valde att ha en textruta där man skrev in en adress till scriptet som genererar XML-filen.
<code>
TheURLS = Trim(request.querystring("data"))
</code>
Nästa steg är att välja vad den lokala filen skall heta.
<code>
FileNames = tempName & ".xml"
</code>
Dags att börja splitta upp arrayen
<code>
FileURL = Split(TheURLS,"|")
SaveName = Split(FileNames,"|")
</code>
En massa kod som man egentligen inte behöver bry sig om :p
<code>
Set xmlHTTP
Set xmlHTTP = CreateObject("MSXML2.ServerXMLHTTP")
'Cycle through the file locations and save them
For x = 0 to UBound(FileURL)
'Get the file
xmlHTTP.open "GET", FileURL(x), false
xmlHTTP.send()
'Download the file
set DataStream = CreateObject("ADODB.Stream")
DataStream.Open
DataStream.Type = 1 'adTypeBinary
DataStream.Write xmlHTTP.ResponseBody
DataStream.Position = 0
</code>
Ange vart du vill att filen skall sparas. Skall vara en direkt sökväg.
<code>
SavedFile = "c:\inetpub\wwwroot\xml\ & SaveName(x)
'Set the File System Object, so we can check to see if it already exists.
set FSO = Createobject("Scripting.FileSystemObject")
'If the file already exists, delete it
if fso.Fileexists(SavedFile) then
Fso.DeleteFile SavedFile
End If
set FSO = Nothing
'Write the file to the location on the server
DataStream.SaveToFile SavedFile
DataStream.Close
Set DataStream = Nothing
Next
Set xmlHTTP = Nothing
</code>
Nu är det första steget klart, nu kan du öppna XML filen med DOM eller vad du nu gillar bäst. Eftersom jag är inte är så "extremt" bevandrad inom XML och DOM väljer jag istället att öppna den som en vanlig datakälla.
<code>
Dim objRS
Set objRS = Server.CreateObject("ADODB.RecordSet")
objRS.ActiveConnection = "Provider=MSDAOSP; Data Source=MSXML2.DSOControl.2.6;"
</code>
Öppna filen, antingen med Server.Mappath eller direkt sökväg.
<code>
objRS.Open("c:\inetpub\wwwroot\xml\" & tempName & ".xml" ))
</code>
Nu kan du i stort sett göra vad du vill med filen, stoppa in datan i en databas eller liknande. Observera att den hämtar datan i ordningen som noden är skapad. Tex
<test>Pellesoft är grymt!</test> <---- objRS.Fields(0)
<test2>XML är framtiden</test2> <---- objRS.Fields(1)
<code>
Do While Not objRS.EOF
Response.Write( "Fält 1: " & objRS.Fields(0) & "<br>")
Response.Write( "Fält 2: " & objRS.Fields(1) & "<br>")
objRS.MoveNext
Loop
</code>
Efter detta tar du bort filen med FSO.
Hoppas det fungerar lika bra för er som det gör för mig!
Ha de gött :)