Avatar billede weiland Nybegynder
21. marts 2006 - 18:44 Der er 5 kommentarer og
1 løsning

Rekursiv funktion, der skaber xml-fil

Jeg har access-database med (lad os sige) 3 kolonner:

ID
ParentID
Title

Data vil jeg gerne have skrevet ud i en xml-fil, der ser sådan ud:

<?xml version="1.0" encoding="ISO-8859-1"?>
<menu>
    <menuItem caption="Opskrifter" nodeid="2">
        <menuItem caption="Forretter" nodeid="3"></menuItem>
        <menuItem caption="Hovedretter" nodeid="4">
            <menuItem caption="Bøf med løg" nodeid="5">
        </menuItem>
    </menuItem>
</menu>

........... og så videre


Jeg har kigget lidt på http://www.xefteri.com/articles/show.cfm?id=10, men kan ikke hitte ud af det.
Kan problemet klares?
Avatar billede weiland Nybegynder
21. marts 2006 - 18:46 #1
Ikke valid xml... det skal være

<?xml version="1.0" encoding="ISO-8859-1"?>
<menu>
    <menuItem caption="Opskrifter" nodeid="2">
        <menuItem caption="Forretter" nodeid="3"></menuItem>
        <menuItem caption="Hovedretter" nodeid="4">
            <menuItem caption="Bøf med løg" nodeid="5"></menuItem>
        </menuItem>
    </menuItem>
</menu>
Avatar billede eagleeye Praktikant
21. marts 2006 - 20:48 #2
Jeg da et forslag til koden dog med udgangspunk i dette eksempel:
http://www.html.dk/scripts/asp/00015/

nodeid er det en tæller 2,3,4,5,6,7,8....n eller ??


kode:


<%
xmlfile = server.Mappath ("xmlfilen.xml")

'Benytter FSO til at skrive til filen
set FSO = Server.CreateObject("Scripting.FilesystemObject")
set fil = FSO.OpenTextFile(xmlfile, 2, true)

Set rs = Server.CreateObject("ADODB.RecordSet")
Set conn = Server.CreateObject("ADODB.Connection")
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="& Server.Mappath("db1.mdb")
conn.Open strDSN

sql = "SELECT * FROM tabelnavn"
Set rs = conn.Execute(sql)

do while not rs.eof
  ' Gem data som kommasepareret liste
  arrID = arrID & ";;" & rs("ID")
  arrRE = arrRE & ";;" & rs("parentID")
  arrSU = arrSU & ";;" & rs("title")
  rs.MoveNext
Loop

' Lav arrays med data
arrID = Split(arrID,";;")
arrRE = Split(arrRE,";;")
arrSU = Split(arrSU,";;")

Rs.Close

Function Threads(intID, nodeid, level)   
  For m = 1 to Ubound(arrID)
    If int(arrRE(m)) = int(intID) Then
      nodeid = nodeid+1
      sStr = vbCrLf
      for xx = 0 to level
        sStr = sStr & "  "
      next
      Threads = Threads & sStr & "<menuItem caption=""" & arrSU(m) & """ nodeid=""" & nodeid & """>" & Threads(arrID(m), nodeid, level+1) & sStr & "</menuItem>"
    End If
Next
End Function

fil.WriteLine "<?xml version=""1.0"" encoding=""ISO-8859-1""?>"
fil.Write "<menu>"

fil.WriteLine Threads(0,1,0)

fil.WriteLine "</menu>"
fil.Close

%>
Avatar billede weiland Nybegynder
21. marts 2006 - 20:53 #3
tak for det, prøver lige

glemte at sige, at "nodeid" svarer til "id" fra databasen
- og at "caption" svarer til "title"
Avatar billede eagleeye Praktikant
21. marts 2006 - 20:56 #4
Ok cation havde jeg gættet :)
Så skal koden rettes til dette så den sætter ID ind fra databasen. Lige nu er det bare en tæller :)

Så prøv sådan her:


<%
xmlfile = server.Mappath ("xmlfilen.xml")

'Benytter FSO til at skrive til filen
set FSO = Server.CreateObject("Scripting.FilesystemObject")
set fil = FSO.OpenTextFile(xmlfile, 2, true)

Set rs = Server.CreateObject("ADODB.RecordSet")
Set conn = Server.CreateObject("ADODB.Connection")
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="& Server.Mappath("db1.mdb")
conn.Open strDSN

sql = "SELECT * FROM tabelnavn"
Set rs = conn.Execute(sql)

do while not rs.eof
  ' Gem data som kommasepareret liste
  arrID = arrID & ";;" & rs("ID")
  arrRE = arrRE & ";;" & rs("parentID")
  arrSU = arrSU & ";;" & rs("title")
  rs.MoveNext
Loop

' Lav arrays med data
arrID = Split(arrID,";;")
arrRE = Split(arrRE,";;")
arrSU = Split(arrSU,";;")

Rs.Close

Function Threads(intID, level)   
  For m = 1 to Ubound(arrID)
    If int(arrRE(m)) = int(intID) Then
      sStr = vbCrLf
      for xx = 0 to level
        sStr = sStr & "  "
      next
      Threads = Threads & sStr & "<menuItem caption=""" & arrSU(m) & """ nodeid=""" & arrID(m) & """>" & Threads(arrID(m), level+1) & sStr & "</menuItem>"
    End If
Next
End Function

fil.WriteLine "<?xml version=""1.0"" encoding=""ISO-8859-1""?>"
fil.Write "<menu>"

fil.WriteLine Threads(0,0)

fil.WriteLine "</menu>"
fil.Close

%>
Avatar billede weiland Nybegynder
21. marts 2006 - 21:05 #5
det var satans, det ser umiddelbart ud til at virke!
Det er næsten for godt til at være sandt... jeg tester lige igen :-)
Avatar billede weiland Nybegynder
21. marts 2006 - 21:10 #6
Jamen, det er SÅ smukt... kæft, det er dejligt... det kan jeg VIRKELIG bruge.
Tusind tak!
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