Aktuellen Wechselkurs aus XML lesen

  • VB.NET

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Aktuellen Wechselkurs aus XML lesen

    Hallo Leute ,

    Ich suche gerade nach einer Möglichkeit wie man mit den aktuellen Wechselkursen rechnen kann. VB2010

    Dazu habe ich folgenden Code mit XML über einen Link der ECB gefunden :

    Quellcode

    1. Imports System.Xml' Internet-Adresse
    2. Public ECPXMLAddress As String = _
    3. "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"' Auslesen der Wechselkurse der ECB aus XML-File
    4. Public Function getECBCurrencyExchanges(ByVal WebAddress As String) As Array
    5. Dim xmlReader As XmlTextReader
    6. Dim outArray(1, 1) As String
    7. Dim currStr As String = Nothing
    8. Dim currVstr As String = Nothing
    9. Dim j As Short
    10. ' Lesen der Daten vom XML-file
    11. xmlReader = New XmlTextReader(WebAddress)
    12. With xmlReader
    13. While .Read()
    14. If .Name <> "" Then
    15. ' Prüfen, ob da ein Node gesmes:name ist
    16. If .Name = "gesmes:name" Then currStr = .ReadString()
    17. For i As Integer = 0 To .AttributeCount - 1
    18. ' Prüfen, ob da ein Node Cube ist
    19. If .Name = "Cube" Then
    20. ' Prüfen, ob ein Attribut, dann Wert lesen
    21. If .AttributeCount = 1 Then
    22. .MoveToAttribute("time")
    23. currVstr = DateTime.Parse(.Value).ToShortDateString
    24. End If
    25. ' Prüfen, ob zwei Attribute, dann Wechselkurs lesen
    26. If .AttributeCount = 2 Then
    27. currStr = "" : currVstr = ""
    28. .MoveToAttribute("currency")
    29. ' Ergänzen der Währungsbezeichnung
    30. currStr = CurrencyName(.Value)
    31. .MoveToAttribute("rate")
    32. currVstr = .Value
    33. End If
    34. End If
    35. If i Mod 2 = 0 Then
    36. If currStr IsNot Nothing Then
    37. outArray(0, j) = currStr
    38. outArray(1, j) = currVstr
    39. j += 1
    40. ReDim Preserve outArray(1, j)
    41. End If
    42. End If
    43. .MoveToNextAttribute()
    44. Next i
    45. End If
    46. End While
    47. End With
    48. ReDim Preserve outArray(1, outArray.Length / 2 - 2)
    49. Return outArray
    50. End FunctionPublic Function CurrencyName(ByVal shortName As String) As String
    51. Dim returnText As String = Nothing
    52. Select Case shortName
    53. Case "DKK" : returnText = "Dänemark;Danish Krone"
    54. Case "EUR" : returnText = "EU;Euro"
    55. Case "USD" : returnText = "USA;US Dollar"
    56. Case "GBP" : returnText = "Großbritannien;Pound Sterling"
    57. Case "SEK" : returnText = "Schweden;Swedish Krona"
    58. Case "NOK" : returnText = "Norwegen;Norwegian Krona"
    59. Case "CNY" : returnText = "China;Chinese Yuan Renminbi"
    60. Case "ISK" : returnText = "Island;Icelandic Krona"
    61. Case "IDR" : returnText = "Indonesien;Indonesian Rupiah"
    62. Case "CHF" : returnText = "Schweiz;Swiss franc"
    63. Case "CAD" : returnText = "Kanada;Canadian Dollar"
    64. Case "JPY" : returnText = "Japan;Japanese Yen"
    65. Case "RUB" : returnText = "Russland;Russian Rouble"
    66. Case "HRK" : returnText = "Kroatien;Croatian Kuna"
    67. Case "MYR" : returnText = "Malaysia;Malaysian Ringgit"
    68. Case "PHP" : returnText = "Philippinen;Philippine Peso"
    69. Case "THB" : returnText = "Thailand;Thai Baht"
    70. Case "AUD" : returnText = "Australien;Australian Dollar"
    71. Case "NZD" : returnText = "Neuseeland;New Zealand Dollar"
    72. Case "EEK" : returnText = "Estland;Estonian Kroon"
    73. Case "LVL" : returnText = "Lettland;Latvian Lats"
    74. Case "LTL" : returnText = "Litauen;Lithuanian Litas"
    75. Case "PLN" : returnText = "Polen;Polish Zloty"
    76. Case "CZK" : returnText = "Tschechien;Czech Koruna"
    77. Case "HUF" : returnText = "Ungarn;Hungarian Forint"
    78. Case "HKD" : returnText = "Hongkong;Hong Kong Dollar"
    79. Case "SGD" : returnText = "Singapur;Singapore Dollar"
    80. Case "SDR" : returnText = "Spezial;Special Drawing Rights"
    81. Case "BGN" : returnText = "Bulgarien;Bulgarian Lev"
    82. Case "CYP" : returnText = "Zypern;Cypriotic Pund"
    83. Case "MTL" : returnText = "Malta;Maltesic Lira"
    84. Case "ROL" : returnText = "Rumänien;Romanian Leu"
    85. Case "SIT" : returnText = "Slowenien;Slovenscy Tolar"
    86. Case "SKK" : returnText = "Slowakei;Slovakic Koruna"
    87. Case "TRY" : returnText = "Türkei;Turkish Lira"
    88. Case "KRW" : returnText = "Südkorea;South Korean Won"
    89. Case "ZAR" : returnText = "Südafrika;South African Rand"
    90. Case "BRL" : returnText = "Brasilien;Brasilian Real"
    91. Case "IDR" : returnText = "Indonesien;Indonesian Rupiah"
    92. Case "INR" : returnText = "Indien;Indian Rupee"
    93. Case "MXN" : returnText = "Mexiko;Mexican Peso"
    94. End Select
    95. If returnText IsNot Nothing Then returnText += ";" + shortName
    96. Return returnText
    97. End Function


    Jetzt ist meine Frage :

    Wie bekomme ich aus dem Script die Wechselkurse .

    Link zur XML : [url]http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml

    [/url]Danke schonmal im Voraus :D
    1. Deine Select Case solltest du auf ein Dictionary aufwerten.
    2. XMLDeserialiser Ich sollte besser lesen. --> Zeile 23 - 37
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Du kannst dir ein DataSet mit der selben Struktur wie das XML File anlegen und einfach das komplette XML immerwieder neu in dein DataSet einlesen, damit hättest du zumindest ne schnell funktion mit der man arbeiten könnte.

    2Kb runterladen und ab ins DataSet und das alle 10Sek oder wie du möchtest.
    wie gesagt: Man kann dir nichts raten, bezüglich "rausbekommen", wenn unklar ist, wo mans hineinbekommen soll.
    shaebich macht da schon den Vorschlag, den ich auch empfehlen würde.

    Nur - da es sich um tägliche Wechselkurse handelt, würde es reichen, wenn man die einmal täglich runterlädt, und ins Dataset überträgt - nicht alle 10 sek.
    Hat man die Daten erst im typisierten Dataset, so ist alles weitere ein Kinderspiel.
    Selbst die Anzeige der Kursentwicklungen im Chart-Control, über einen frei wählbaren Zeitraum wäre in ca. 15 Zeilen abzuhandeln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    guck - ich hab grad was gebastelt mit XDocument, weil ich die Xml-Intellisense für die XDoc-Technologie erst neuestens entdeckt hab.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports <xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01">
    3. Imports <xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
    4. Imports System.Globalization
    5. Public Class frmXDocTester
    6. Public Sub New()
    7. InitializeComponent()
    8. CurrencyDts.Fill()
    9. End Sub
    10. Private Sub MenuStrip1_MenuClicked(ByVal Sender As Object, ByVal e As EventArgs) _
    11. Handles SaveToolStripMenuItem.Click, ReloadToolStripMenuItem.Click, _
    12. TestToolStripMenuItem.Click
    13. Select Case True
    14. Case Sender Is SaveToolStripMenuItem
    15. CurrencyDts.Save(Me)
    16. Case Sender Is ReloadToolStripMenuItem
    17. CurrencyDts.Fill()
    18. Case Sender Is TestToolStripMenuItem
    19. ReadDayExchanges()
    20. End Select
    21. End Sub
    22. Private Sub ReadDayExchanges()
    23. CurrencyBindingSource.CancelEdit()
    24. Dim _XDoc = XDocument.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml")
    25. Dim xel = _XDoc.<gesmes:Envelope>.<Cube>.<Cube>.First
    26. Dim datum = Date.Parse(xel.@time, CultureInfo.InvariantCulture)
    27. If CurrencyDts.ExchangeRate.Any(Function(rwXch) rwXch._Date = datum) Then
    28. MessageBox.Show("heute ist schon aktualisiert worden!")
    29. Return
    30. End If
    31. For Each xch In xel.<Cube>
    32. Dim currID = xch.@currency
    33. Dim rwCurr = CurrencyDts.Currency.FindByID(currID)
    34. If rwCurr.Null Then rwCurr = CurrencyDts.Currency.AddCurrencyRow(currID)
    35. CurrencyDts.ExchangeRate.AddExchangeRateRow(rwCurr, datum, Decimal.Parse(xch.@rate, CultureInfo.InvariantCulture))
    36. Next
    37. End Sub
    38. End Class
    (beachte: dieses ist nur der relevante Code-Ausschnitt. Lauffähig ist er nur im Kontext der angehängten Solution)

    Das ist also sowas, was die Xml-Daten aussm INet direkt einer typisierten DataTable zufügt, und wenn man das jeden Tag einmal ausführt, bildet sich mit der Zeit für jede Währung eine hübsche Wechsel-Kurs-WerteReihe, die bereits im DGV angezeigt wird.
    Bislang sind halt nur die Daten von 2 Tagen drinne.
    Dateien
    • XDocTester.zip

      (64,17 kB, 127 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hab' da ein altes Projekt gefunden, vielleicht hilft Dir das ... da bekommst Du Deine Kurse sogar Online direkt von der EZB.
    Dateien
    Mal ne andere Frage. Was würde gegen einen simplen WebService sprechen? Ich habe dir mal einen rausgesucht: webservicex.net/CurrencyConvertor.asmx. Den kannst du zum Projekt hinzufügen unter Projekt -> Dienstverweis hinzufügen. Ich hab dir mal im Anhang ein funktionierendes Projekt reingestellt. Habs getestet und funktioniert wunderbar. Und ist so gut wie keine Arbeit und leicht wartbar. Internetverbindung brauchste so oder so. Von dem her sehe ich außer dem eventuell kleinen Performanceunterschied keine Nachteile. Zumal du dir Fragen wie z.B. wie oft aktualisiere ich die Daten etc. nicht stellen musst.
    Dateien


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    ErfinderDesRades schrieb:

    frag doch einfach - weil es ist ganz einfach


    Also es soll so sein , dass ich Eine Euro Eingabe per TextBox habe,
    Dann soll die Zielwährung per ComboBox ausgewählt werden.

    jedoch gibt er mir alle Werte auf einmal raus :

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim _XDoc = XDocument.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml")
    3. Dim xel = _XDoc.<gesmes:Envelope>.<Cube>.<Cube>
    4. For Each xch In xel.<Cube>
    5. Dim currID = xch.@currency
    6. Dim rate = xch.@rate
    7. MsgBox(rate)
    8. Next
    9. ' zum gucken ob er werte findet
    10. End Sub
    was soll dieser Beispiel-Code?
    Wo ist die Textbox, die den Eingabe-Wert angibt?
    (statt der Combo könntest du einfacherweise erstmel meine Datagridviews drinne lassen, und mit dem linken halt die Ziel-Währung wählen).

    Oder nimm doch einfach theFiloes Webservice-Lösung, die macht doch bereits genau, was dir vorschwebt, oder?

    edit: naja - ich bastel mal was - moment...
    Dateien
    • XDocTester02.zip

      (67,84 kB, 139 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Der_Igelmann schrieb:

    Also es soll so sein , dass ich Eine Euro Eingabe per TextBox habe,
    Dann soll die Zielwährung per ComboBox ausgewählt werden.

    Ich verstehe dein Problem nicht. Du hast bereits eine voll funktionsfähige Lösung von mir bekommen. Unterstützt wesentlich mehr Währungen, braucht so gut wie keinen Code und erst recht keinen mit XML etc.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.