Avatar billede bennetsen Nybegynder
05. september 2003 - 23:27 Der er 30 kommentarer og
1 løsning

Åbne en bestemt fil

<%
Response.Buffer = True

dim sti,fso,folder,files
sti = server.MapPath(".")
Set fso = createobject("scripting.filesystemobject")
Set folder = fso.getfolder(sti)
Set files = folder.files
for each file in files
  if LCase(fso.GetExtensionName(file.name)) = "xml" and inStr(1,Lcase(file.name), "test_data_") > 0 then
    filnavn = file.name
    exit for
  end if
next

Dim xml
    Set xml = Server.CreateObject("Microsoft.XMLDOM")
    xml.async = False
    xml.load (Server.MapPath(filnavn))


Dim title, heading, paragraph, testHTML
    Fornavn = xml.documentElement.childNodes(0).text
    Efternavn = xml.documentElement.childNodes(1).text
    Adresse = xml.documentElement.childNodes(2).text
    Postnr = xml.documentElement.childNodes(3).text
    By = xml.documentElement.childNodes(4).text

    Set xml = Nothing
%>
Jeg skal åbne en bestemt xml-fil på serveren.
Filen bliver automatisk genereret af et eksternt program.

Filen hedder test_data_xxxx.xml hvor x'erne er vilkårlige tal og bogstaver.
Der findes også en test_data.xml, men det er den anden som skal åbnes

Jeg har prøvet med nedenstående script uden succes.
Kan man gøre andet - f.eks sige at filen skal være over 9 tegn?

På forhånd tak

----------------------------script-----------
<html>
<head>
    <title></title>
</head>
<body>
<h3 align="center"><%= fornavn %> <%= efternavn %></h3>
<p align="center"><% = adresse %></p>
<div align="center"><%= postnr %><%= by %></div>
</body>
</html>
Avatar billede eagleeye Praktikant
05. september 2003 - 23:32 #1
ja du kan tilføje et længde tjek, prøv sådan her så:


  if LCase(fso.GetExtensionName(file.name)) = "xml" and (inStr(1,Lcase(file.name), "test_data_") > 0) and len(file.name) > 9 then
Avatar billede bennetsen Nybegynder
05. september 2003 - 23:37 #2
Det virker ikke

Jeg prøver at hente filen "test_data_639159938CFF47A49F0023446AA650E1.xml"
Avatar billede bennetsen Nybegynder
06. september 2003 - 00:11 #3
Jeg bruger nu følgende kode, men den komme med fejlen "
Microsoft VBScript runtime error '800a01a8'

Object required: 'documentElement'

/finn2/test.asp, line 26
"

----------kode-----------
<%
Response.Buffer = True

dim sti,fso,folder,files, file
sti = server.MapPath(".")
Set fso = createobject("scripting.filesystemobject")
Set folder = fso.getfolder(sti)
Set files = folder.files
for each file in files

if LCase(fso.GetExtensionName(file.name)) = "xml" and (inStr(1,Lcase(file.name), "test_data_") > 0) and len(file.name) > 15 then


    filnavn = file.name
    exit for
  end if
next

Dim xml
    Set xml = Server.CreateObject("Microsoft.XMLDOM")
    xml.async = False
    xml.load (Server.MapPath(filnavn))


Dim fornavn, efternavn, adresse, postnr, by
    Fornavn = xml.documentElement.childNodes(0).text
    Efternavn = xml.documentElement.childNodes(1).text
    Adresse = xml.documentElement.childNodes(2).text
    Postnr = xml.documentElement.childNodes(3).text
    By = xml.documentElement.childNodes(4).text

    Set xml = Nothing
%>
<html>
<head>
    <title></title>
</head>
<body>
test
<h3 align="center"><%= fornavn %> <%= efternavn %></h3>
<p align="center"><% = adresse %></p>
<div align="center"><%= postnr %><%= by %></div>
</body>
</html>
Avatar billede eagleeye Praktikant
06. september 2003 - 00:17 #4
Ok, det xml obejct kender jeg ikke, men en siger at documentElement mangler et obejdt jeg fandt et eks på nettet er det sådan noget du vil??
http://zhanshou.hypermart.net/XML/net.html
Avatar billede eagleeye Praktikant
06. september 2003 - 00:19 #5
Avatar billede eagleeye Praktikant
06. september 2003 - 00:23 #6
Jeg må nok erkende jeg ikke umiddelbart kan se forskel på det sidste eksemple og det du har lavet..

Kan du evt. prøve at tjekke den får rigtigt fat i filen evt ved lige inden llinje med:

Dim xml


tilføje denne linje

Response.Write filnavn


og se den udskriver det rigtige filnavn.
Avatar billede bennetsen Nybegynder
06. september 2003 - 09:46 #7
Det gør den :-)
"
test_data_639159938CFF47A49F0023446AA650E1.xml
Microsoft VBScript runtime error '800a01a8'
Object required: '[object]'
/finn2/test.asp, line 28
"
Avatar billede bennetsen Nybegynder
06. september 2003 - 10:22 #8
Jeg har fundet fejlen.
det virker med én post i xml-filen, men ikke når der bliver tilføjet flere poster.

Kan man lave en eller anden form for løkke, der kan læse de enkelte noder (eller måske få det over i en access database)?

XML-koden med to poster ser således ud:

--------xml----------------
<fields xmlns="http://www.quask.com/quaskformserver/quaskformdata" appName="HTML Form Client" appVersion="0.99" guid="978EC73489874393A22B5DE58A5465BE" version="29586297-B5FE882077E7F13A" title="test_data" successURL="http://domæne.dk/finn2/test_data.htm" failureURL="http://domæne.dk/finn2/test_data.htm" singleResponse="false" rid="" source="http://domæne.dk/finn2/test_data.xml" afterSend="0" time="20030906 08:03:03">
<field id="174">Ole</field>
<field id="175">Knold</field>
<field id="176">Vejlevej 4</field>
<field id="177">8987</field>
<field id="178">Valby</field>
</fields>
<fields xmlns="http://www.quask.com/quaskformserver/quaskformdata" appName="HTML Form Client" appVersion="0.99" guid="978EC73489874393A22B5DE58A5465BE" version="29586297-B5FE882077E7F13A" title="test_data" successURL="http://domæne.dk/finn2/test_data.htm" failureURL="http://domæne.dk/finn2/test_data.htm" singleResponse="false" rid="" source="http://domæne.dk/finn2/test_data.xml" afterSend="0" time="20030906 08:15:19">
<field id="174">Vera</field>
<field id="175">Andersen</field>
<field id="176">Vesterhavet 6</field>
<field id="177">4500</field><field id="178">Udby</field>
</fields>
Avatar billede eagleeye Praktikant
06. september 2003 - 10:45 #9
Jo man kan lave noget kode som løber filen igennem. Jeg vil godt prøve at vise et eksemple men jeg skal lige stille et psr såørgsmål så.

Det som du ønsker at få ud er dette:

<field id="174">Ole</field>
<field id="175">Knold</field>
<field id="176">Vejlevej 4</field>
<field id="177">8987</field>
<field id="178">Valby</field>

og ende med:
Ole, Knold, Vejlevej 4, 8987, Valby

Er det rigtigt forstået??


Og de felter du hendter vil se altid være formateret på denne måde, med et tal som id ?? eller kan id være tekst??

<field id="175">Knold</field>
Avatar billede bennetsen Nybegynder
06. september 2003 - 10:54 #10
Ja eller
Fornavn Efternavn adresse postnr by
Ole Knold Vejlevej 8987 Valby

Det vil altid være et tal som ID (Bliver automatisk generet af et ekstern program (quask quask.com)

På forhånd tak
Avatar billede eagleeye Praktikant
06. september 2003 - 11:00 #11
Hvad skal der ske hvis der er flere personer i xml filen?
De skal bare alle sammen skrives ud?
Avatar billede bennetsen Nybegynder
06. september 2003 - 11:05 #12
Ja i første omgang :-)
Jeg skal senere prøve om jeg kan lave noget forespørgsel. Det er derfor det var best hvis man kunne smide data ind i en database
Avatar billede eagleeye Praktikant
06. september 2003 - 11:37 #13
Ok her eks, den åbner filen som en teskt fil og bruger regular expression til at finde data og putter dem i et array ogudsrkiver fra det.
Det stiller dog et krav og der er at data i filen står sådan her, en linje per <field id="... linje.:

<field id="174">Ole</field>
<field id="175">Knold</field>
<field id="176">Vejlevej 4</field>
<field id="177">8987</field>
<field id="178">Valby</field>


--koden--
<%
Response.Buffer = True

dim sti,fso,folder,files, file
sti = server.MapPath(".")
Set fso = createobject("scripting.filesystemobject")
Set folder = fso.getfolder(sti)
Set files = folder.files
for each file in files

if LCase(fso.GetExtensionName(file.name)) = "xml" and (inStr(1,Lcase(file.name), "test_data_") > 0) and len(file.name) > 15 then
    filnavn = file.name
    exit for
  end if
next

Set FSO = Server.CreateObject("Scripting.FileSystemObject")
Set file = FSO.OpenTextFile(Server.MapPath(filnavn))
Set re = New RegExp
re.Global = true
re.IgnoreCase = true

redim personArr(0)
personStr = ""
do while not file.AtEndOfStream
  str = file.readline

  re.Pattern = "^(<field id=""\d+"">)([a-zæøåA-Z0-9\s]+)(</field>)$"

  if re.test(str) then
    outstr = re.Replace(str, "$2")
    personStr = personStr & "," & outstr
  else
    if personStr <> "" then
      personStr = Mid(personStr,2)
      personArr(ubound(personArr)) = personStr
      personStr = ""
      redim preserve personArr(ubound(personArr)+1)
    end if
  end if
loop
file.Close

for i = lbound(personArr) to ubound(personArr)
  str = personArr(i)
  if str <> "" then
    strArr = Split(str,",")
    fornavn = strArr(0)
    efternavn = strArr(1)
    adresse = strArr(2)
    postnr = strArr(3)
    by = strArr(4)
%>

<h3 align="center"><%= fornavn %> <%= efternavn %></h3>
<p align="center"><% = adresse %></p>
<div align="center"><%= postnr %> <%= by %></div>

<%
  end if
next
%>
Avatar billede bennetsen Nybegynder
06. september 2003 - 12:21 #14
Jeg tør næsten ikke sige det :-)

Den viser en "tom" side (uden fejlmed.) og der er to poster i xml-filen "test_data_611293910ABA4DBB91484C308FEFCF82.xml"
Avatar billede eagleeye Praktikant
06. september 2003 - 12:30 #15
ok og hvordan ser filen ud er det med linje skift så det ser sådan her ud:

<field id="174">Ole</field>
<field id="175">Knold</field>
<field id="176">Vejlevej 4</field>
<field id="177">8987</field>
<field id="178">Valby</field>

eller står det sådan her:
<field id="174">Ole</field><field id="175">Knold</field><field id="176">Vejlevej 4</field><field id="177">8987</field><field id="178">Valby</field>
Avatar billede bennetsen Nybegynder
06. september 2003 - 12:55 #16
Xml-filen ser således ud:

-----------------------------------------
<fields xmlns="http://www.quask.com/quaskformserver/quaskformdata" appName="HTML Form Client" appVersion="0.99" guid="978EC73489874393A22B5DE58A5465BE" version="29586297-B5FE882077E7F13A" title="test_data" successURL="http://domæne.dk/finn2/test_data.htm" failureURL="http://domæne.dk/finn2/test_data.htm" singleResponse="false" rid="" source="http://domæne.dk/finn2/test_data.xml" afterSend="0" time="20030906 08:03:03"><field id="174">Ole</field><field id="175">Knold</field><field id="176">Vejlevej 4</field><field id="177">8987</field><field id="178">Valby</field></fields><fields xmlns="http://www.quask.com/quaskformserver/quaskformdata" appName="HTML Form Client" appVersion="0.99" guid="978EC73489874393A22B5DE58A5465BE" version="29586297-B5FE882077E7F13A" title="test_data" successURL="http://domæne.dk/finn2/test_data.htm" failureURL="http://domæne.dk/finn2/test_data.htm" singleResponse="false" rid="" source="http://domæne.dk/finn2/test_data.xml" afterSend="0" time="20030906 08:15:19"><field id="174">Vera</field><field id="175">Andersen</field><field id="176">Vesterhavet 6</field><field id="177">4500</field><field id="178">Udby</field></fields>
Avatar billede eagleeye Praktikant
06. september 2003 - 13:45 #17
Ok, jeg var lige væk et 1 times tid, prøv med dette så, koden er lavet lidt om:




--koden--
<%
Response.Buffer = True

dim sti,fso,folder,files, file
sti = server.MapPath(".")
Set fso = createobject("scripting.filesystemobject")
Set folder = fso.getfolder(sti)
Set files = folder.files
for each file in files

if LCase(fso.GetExtensionName(file.name)) = "xml" and (inStr(1,Lcase(file.name), "test_data_") > 0) and len(file.name) > 15 then
    filnavn = file.name
    exit for
  end if
next

Set FSO = Server.CreateObject("Scripting.FileSystemObject")
Set file = FSO.OpenTextFile(Server.MapPath(filnavn))

Set re = New RegExp
re.Global = true
re.IgnoreCase = true

redim personArr(0)
personStr = ""
do while not file.AtEndOfStream
  filArr = split(file.readAll, "<field ")
  for i = lbound(filArr) to ubound(filArr)
    str = filArr(i)
    re.Pattern = "(id=""\d+"">)([a-zæøåA-Z0-9\s]+)(</field>)"

    if re.test(str) then
      outstr = re.Replace(str, "$2")
      personStr = personStr & "," & outstr
      Response.Write personStr & "<br>"
     
      if inStr(1,str, "</fields>") then
        personStr = Mid(personStr,2)
        personArr(ubound(personArr)) = personStr
        personStr = ""
        redim preserve personArr(ubound(personArr)+1)
      end if
    end if
  next
loop
file.Close

for i = lbound(personArr) to ubound(personArr)
  str = personArr(i)
  if str <> "" then
    strArr = Split(str,",")
    fornavn = strArr(0)
    efternavn = strArr(1)
    adresse = strArr(2)
    postnr = strArr(3)
    by = strArr(4)
%>

<h3 align="center"><%= fornavn %> <%= efternavn %></h3>
<p align="center"><% = adresse %></p>
<div align="center"><%= postnr %> <%= by %></div>

<%
  end if
next
%>
Avatar billede eagleeye Praktikant
06. september 2003 - 13:52 #18
hmm du fik vist en linje for meget med, den udskriver løbene hvad den finde det skal ikke med..:

Denne linje kan du fjerne:
    Response.Write personStr & "<br>"
Avatar billede bennetsen Nybegynder
06. september 2003 - 14:45 #19
Hurra hurra - nu virker det :-)
Hvis du smider et svar så får du dine velfortjente points.

Jeg kunne nu stadigvæk godt tænke mig at få dise data ind i en access database. Er det en opgave du kunne løse (gerne mod betaling i rigtige mønter)?
Avatar billede eagleeye Praktikant
06. september 2003 - 14:53 #20
Skal de ind i tilsvarne kolonner?
Så det da hurtigt lige at tilføje eks. som vist nedenfor antager alle 5 kolonner er defineret som text kolonner i databasen, by står i [] fordi det er reserveret ord i SQL (ORDER BY).

Du kan udvide dette styk kode:

for i = lbound(personArr) to ubound(personArr)
  str = personArr(i)
  if str <> "" then
    strArr = Split(str,",")
    fornavn = strArr(0)
    efternavn = strArr(1)
    adresse = strArr(2)
    postnr = strArr(3)
    by = strArr(4)
%>

<h3 align="center"><%= fornavn %> <%= efternavn %></h3>
<p align="center"><% = adresse %></p>
<div align="center"><%= postnr %> <%= by %></div>

<%
  end if
next
%>


Til dette så det skrive til en database:


Set Conn = Server.CreateObjec("ADODB.Connection")
connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("db.mdb")
Conn.Open connString

for i = lbound(personArr) to ubound(personArr)
  str = personArr(i)
  if str <> "" then
    strArr = Split(str,",")
    fornavn = strArr(0)
    efternavn = strArr(1)
    adresse = strArr(2)
    postnr = strArr(3)
    by = strArr(4)

    SQL = "INSERT INTO tabelnavn (fornavn, efternavn, adresse, postnr, [by]) VALUES ("
    SQL = SQL & "'" & fornavn & "', "
    SQL = SQL & "'" & efternavn & "', "
    SQL = SQL & "'" & adresse & "', "
    SQL = SQL & "'" & postnr & "', "
    SQL = SQL & "'" & by & "' "
    SQL = SQL & ")"
 
  'Indsæt i DB
  Conn.Execute(SQL)
%>

<h3 align="center"><%= fornavn %> <%= efternavn %></h3>
<p align="center"><% = adresse %></p>
<div align="center"><%= postnr %> <%= by %></div>

<%
  end if
next
Conn.Close
%>
Avatar billede bennetsen Nybegynder
06. september 2003 - 15:28 #21
Jeg får følgende fejl:

Microsoft VBScript runtime error '800a01b6'
Object doesn't support this property or method: 'CreateObjec'

/finn2/test3.asp, line 54

Hvad har jeg gjort forkert? - har smidt hele koden med

-----------kode--------------
<%
Response.Buffer = True

dim sti,fso,folder,files, file
sti = server.MapPath(".")
Set fso = createobject("scripting.filesystemobject")
Set folder = fso.getfolder(sti)
Set files = folder.files
for each file in files

if LCase(fso.GetExtensionName(file.name)) = "xml" and (inStr(1,Lcase(file.name), "test_data_") > 0) and len(file.name) > 15 then
    filnavn = file.name
    exit for
  end if
next

Set FSO = Server.CreateObject("Scripting.FileSystemObject")
Set file = FSO.OpenTextFile(Server.MapPath(filnavn))

Set re = New RegExp
re.Global = true
re.IgnoreCase = true

redim personArr(0)
personStr = ""
do while not file.AtEndOfStream
  filArr = split(file.readAll, "<field ")
  for i = lbound(filArr) to ubound(filArr)
    str = filArr(i)
    re.Pattern = "(id=""\d+"">)([a-zæøåA-Z0-9\s]+)(</field>)"

    if re.test(str) then
      outstr = re.Replace(str, "$2")
      personStr = personStr & "," & outstr
     
      if inStr(1,str, "</fields>") then
        personStr = Mid(personStr,2)
        personArr(ubound(personArr)) = personStr
        personStr = ""
        redim preserve personArr(ubound(personArr)+1)
      end if
    end if
  next
loop
file.Close

%>
<html>
<body>
<table border=1>
<tr><th>Fornavn</th><th>Efternavn</th><th>Adresse</th><th>Postnr</th><th>By</th></tr>
<%

Set Conn = Server.CreateObjec("ADODB.Connection")
connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("db1.mdb")
Conn.Open connString

for i = lbound(personArr) to ubound(personArr)
  str = personArr(i)
  if str <> "" then
    strArr = Split(str,",")
    fornavn = strArr(0)
    efternavn = strArr(1)
    adresse = strArr(2)
    postnr = strArr(3)
    by = strArr(4)

    SQL = "INSERT INTO tabelnavn (fornavn, efternavn, adresse, postnr, [by]) VALUES ("
    SQL = SQL & "'" & fornavn & "', "
    SQL = SQL & "'" & efternavn & "', "
    SQL = SQL & "'" & adresse & "', "
    SQL = SQL & "'" & postnr & "', "
    SQL = SQL & "'" & by & "' "
    SQL = SQL & ")"
 
  'Indsæt i DB
  Conn.Execute(SQL)
%>

<h3 align="center"><%= fornavn %> <%= efternavn %></h3>
<p align="center"><% = adresse %></p>
<div align="center"><%= postnr %> <%= by %></div>

<%
  end if
next
Conn.Close
%>
Avatar billede eagleeye Praktikant
06. september 2003 - 15:32 #22
hov der mangler et t ;)
Set Conn = Server.CreateObjec("ADODB.Connection")

sådan her:
Set Conn = Server.CreateObject("ADODB.Connection")
Avatar billede bennetsen Nybegynder
06. september 2003 - 15:51 #23
UPS - pinlig jeg ikke kunne se en lile fejl.
Der er en anden lille fejl - By bliver til f.eks. "Valby<fields>" i databasen.

En anden ting er at Ø bliver til "&#248;", Å bliver til "&#229;" og Æ bliver til "&#198;". Kan man gøre noget ved det. Jeg har ikke mulighed for at validere i Quask programmet.
Avatar billede eagleeye Praktikant
06. september 2003 - 16:03 #24
Ok, har lidt set en lille fejl i koden som finder de enkelte felter..

PRøv at udskifte dette:

do while not file.AtEndOfStream
  filArr = split(file.readAll, "<field ")
  for i = lbound(filArr) to ubound(filArr)
    str = filArr(i)
    re.Pattern = "(id=""\d+"">)([a-zæøåA-Z0-9\s]+)(</field>)"

    if re.test(str) then
      outstr = re.Replace(str, "$2")
      personStr = personStr & "," & outstr
     
      if inStr(1,str, "</fields>") then
        personStr = Mid(personStr,2)
        personArr(ubound(personArr)) = personStr
        personStr = ""
        redim preserve personArr(ubound(personArr)+1)
      end if
    end if
  next
loop



Med dette:

do while not file.AtEndOfStream
  filArr = split(file.readAll, "<field ")
  for i = lbound(filArr) to ubound(filArr)
    str = filArr(i)
    re.Pattern = "(id=""\d+"">)([a-zæøåA-Z0-9\s]+)(</field>)"

    if re.test(str) then
      outstr = re.Replace(str, "$2")
      index = inStr(1,outstr, "</fields>")
      if index > 0 then
        outstr = left(outstr,index-1)
      end if
     
      personStr = personStr & "," & outstr
      if index > 0 then
        personStr = Mid(personStr,2)
        personArr(ubound(personArr)) = personStr
        personStr = ""
        redim preserve personArr(ubound(personArr)+1)
      end if
    end if
  next
loop
Avatar billede eagleeye Praktikant
06. september 2003 - 16:05 #25
Står Ø rigtig i XML filen??  eller som  "&#248;"
koden skulle nemlig ikke umiddelbart gøre noget som ændre det.
Avatar billede bennetsen Nybegynder
06. september 2003 - 16:59 #26
Ø står som "&#248;", så det er ikke koden. Jeg tænkte bare at det måske kunne konverteres tilbage til Ø
Avatar billede eagleeye Praktikant
06. september 2003 - 17:13 #27
Der er ikke en funktion som laver det om til så man må replace dem:

do while not file.AtEndOfStream
  filArr = split(file.readAll, "<field ")



Så det bliver:

do while not file.AtEndOfStream
  filStr = file.readAll
  filStr = Replace(filStr, "&#216;", "Ø")
  filStr = Replace(filStr, "&#198;", "Æ")
  filStr = Replace(filStr, "&#197;", "Å")
  filStr = Replace(filStr, "&#248;", "ø")
  filStr = Replace(filStr, "&#230;", "æ")
  filStr = Replace(filStr, "&#229;", "å")
 
  filArr = split(file.readAll, "<field ")
Avatar billede bennetsen Nybegynder
06. september 2003 - 17:33 #28
Nu tør jeg snart ikke komme igen :-)

Den melder nu følgende fejl:

Microsoft VBScript runtime error '800a003e'

Input past end of file

/finn2/test4.asp, line 36
Avatar billede eagleeye Praktikant
06. september 2003 - 17:35 #29
Den linje som ser sådan her ud, det er min fejl jeg fik pastet den forkert ind:

  filArr = split(file.readAll, "<field ")

Skal nemlig også ændre til så den ser sådan her ud:

  filArr = split(filStr, "<field ")
Avatar billede bennetsen Nybegynder
06. september 2003 - 17:53 #30
Det virker bare fint - det eneste er at den smider de samme poster ind flere gange i databasen.
Avatar billede eagleeye Praktikant
06. september 2003 - 19:23 #31
den skulle gerne skrive det lige så mange gang i databsen som den skriver det på skærmen.
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