Bortset fra tegnkonverteringsfejl (æ,ø,å) er her en løsning på tabelopdatering fra remote xml fil.
Givet en tabel Valuta(code text,desc text,rate number) er dette topniveau kaldet:
Sub stocks2table()
Const table = "Valuta"
Dim newValues, fldValues, fldVArr
CurrentDb.Execute "delete from " & table
newValues = Split(csvvaluesOfXML(), vbCrLf)
If Not IsEmpty(newValues) Then
With CurrentDb.OpenRecordset(table)
For Each fldValues In newValues
If Len(fldValues) Then
fldVArr = Split(fldValues, ",")
.AddNew
![Code] = fldVArr(0)
![desc] = fldVArr(1)
![Rate] = Replace(fldVArr(2), ".", ",")
.Update
End If: Next: End With: End If
End Sub
Denne sub kalder:
Function csvvaluesOfXML()
Const xslFile = "D:\home\dev\devel\access\stock.xsl"
Dim domIn As DOMDocument30, domStylesheet As DOMDocument30, xmlData, loadXMLSucces
Set domIn = New DOMDocument30
loadXMLSucces = domIn.loadXML(xmlresponseText( _
"
http://www.nationalbanken.dk/_vti_bin/DN/DataService.svc/CurrencyRatesXML?lang=da"))
If loadXMLSucces Then
Set domStylesheet = New DOMDocument30
domStylesheet.Load xslFile
If Not domStylesheet Is Nothing Then
csvvaluesOfXML = domIn.transformNode(domStylesheet)
End If
End If
Set domIn = Nothing
End Function
Bemærk to ting der er hardcodet i csvvaluesOfXML()
1) url'en til natioalbankens valuta xml fil
2) filnavnet på en xsl fil - denne xml tekstfil ser såldes ud:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" version="1.0" omit-xml-declaration="yes" encoding="ISO-8859-1" />
<xsl:template match="/exchangerates/dailyrates">
<xsl:for-each select="currency">
<xsl:value-of select="@code"/><xsl:text>,</xsl:text><xsl:value-of select="@desc"/><xsl:text>,</xsl:text>
<xsl:choose><xsl:when test="string-length(@rate) < 2"><xsl:text>0</xsl:text></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(@rate,',','.')"/></xsl:otherwise>
</xsl:choose><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
xsl'en ser lidt rodet ud, det er vigtigt at der ikke kommer linieskift i outputet og den er hacket sammen så det ikke skete. Man teste med ?csvvaluesOfXML() i immediate vinduet
Og endeligt denne funktion som udfører http kaldet - det er her jeg ikke har kunnet fremeksperimentere adodb.stream konvertering der bringer æ,ø og å fra iso-8859-1 ind i tabellen:
Function xmlresponseText(url, Optional method = "GET")
Dim xhr
Set xhr = CreateObject("Microsoft.XMLHTTP")
xhr.Open method, url, False
xhr.send
If xhr.Status = 200 Then
With New ADODB.Stream
.Type = adTypeText
.Charset = "iso-8859-1"
.Open
.WriteText xhr.responseText
.Position = 0
.Charset = "utf-8" '"windows-1252"
xmlresponseText = .ReadText
End With
End If
Set xhr = Nothing
End Function