Lige min kommentar - ovenstående er er kun første skridt i en mere generel og skalerbar løsning.
Tabelindholdets xml form skal ikke laves med feltnavne i koden - men skrives generelt så en hvilket som helst tabel får xml elementnavne bestemt af tabellens feltnavne.
eksempel
for i=0 to rs.fields.count-1
print#1,"<" & rs.fields(i).name & ">" & rs.fields(i) & "</" & rs.fields(i).name & ">"
next
Den dannede xml er blot et mellemstadie - men så kan den også bruges til hvilken som helst opgave.
Næste skridt er at lave udskrivning til fil på en helt anden måde. Faktisk skal mellemstadiet slet ikke udskrives til fil, men for at få lidt forståelse for hvad der sker kan man prøve det.
VIGTIGT: sæt referencer til microsoft xml, ver3
Sub testTable2xmlfile(tableN,pathName)
Dim xml As DOMDocument30
Set xml = domtreeOnsorted(tableN)
xml.Save pathName
End Sub
Function domtreeUnsorted(tablN) As DOMDocument30
Dim root As IXMLDOMElement, rec As IXMLDOMElement, fldNE As IXMLDOMElement, tblAtt As IXMLDOMAttribute
Dim fldNArr, fld
fldNArr = fieldNames(tablN)
Set domtreeUnsorted = New DOMDocument30
domtreeUnsorted.async = False
domtreeUnsorted.appendChild domtreeUnsorted.createProcessingInstruction("xml", "version=""1.0"" encoding=""ISO-8859-1""")
Set root = domtreeUnsorted.appendChild(domtreeUnsorted.createElement("table"))
Set tblAtt = domtreeUnsorted.createAttribute("name")
tblAtt.value = tablN
root.Attributes.setNamedItem tblAtt
With rsi(tablN)
While Not .eof
Set rec = root.appendChild(domtreeUnsorted.createElement("rec"))
For Each fld In fldNArr
Set fldNE = rec.appendChild(domtreeUnsorted.createElement(fld))
fldNE.text = .Fields(fld) & ""
'Debug.Print "<" & fld & ">" & .Fields(fld) & "</" & fld & ">"
Next: Wend: End With
End Function
Sub add2list(V, i)
On Error Resume Next
ReDim Preserve V(UBound(V) + 1)
If err.Number = 13 Then ReDim V(0)
If IsObject(i) Then Set V(UBound(V)) = i Else V(UBound(V)) = i
End Sub
Function fieldNames(tablN)
Dim fldN
With CurrentDb.OpenRecordset(tablN)
For Each fldN In .Fields: add2list fieldNames, fldN.name: Next: End With
End Function
------------------------------------------------------------
Så kommer vi til formateringsdelen - her hvor det bestemmes hvordan slut xml'en skal se ud til den konkrete opgave. xslt transformtion er faktisk gammelt stof, men er noget kryptisk i dens overdekorede syntaks.
Kort fortalt dannes slut xml filen ved transformation af tabeldata xmlfilen vha et xslt script. Xslt scriptet er også en xml fil (extension: .xsl)
-------start på file: stylesheetFileN ------------
<xsl:stylesheet version="2.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="Windows-1252" indent="yes"/>
<xsl:variable name="tableN">table-<xsl:value-of select="/table/@name"/></xsl:variable>
<xsl:template match="/">
<xsl:element name="{$tableN}" >
<xsl:apply-templates select="table/rec" />
</xsl:element>
</xsl:template>
<xsl:template match="rec">
<contact>
<xsl:apply-templates />
</contact>
</xsl:template>
<xsl:template match="*">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
-------slut på file: stylesheetFileN ------------
Rodelementet er ikke 'statics', men tabel-tabelnavn for at vise lidt om attribute til element transformering.
Og her den endelige subrutine:
Sub Table2xmlfile(tableN, stylesheetFileN, xmlOutput)
Dim xml As DOMDocument30, xslt As DOMDocument30, domOut As DOMDocument30
Set xml = domtreeUnsorted(tableN)
Set xslt = New DOMDocument30
Set domOut = New DOMDocument30
xslt.Load stylesheetFileN
xml.transformNodeToObject xslt, domOut
domOut.Save xmlOutput
Set xml = Nothing
Set xslt = Nothing
Set domOut = Nothing
End Sub