You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET读取在线XML文件并加载至DataGridView问题求助

解决VB.NET加载ECB汇率XML到DataGridView的问题

你的代码存在两个核心问题:

  1. 调用ReadXml(xmlfile)时,传入的是XML内容字符串,但该重载方法会将参数识别为文件路径而非XML内容,导致文件不存在的错误
  2. ECB的XML是多层嵌套的<cube>结构,DataSet自动生成的表结构需要筛选出正确的子表才能获取汇率数据

修正方案1:修复DataSet读取逻辑

通过StringReader传递XML内容,再筛选出存储汇率的子表:

Imports System.IO
Imports System.Net
Imports System.Data

Dim xmlContent As String
Dim webClient As New WebClient()
Dim dataSet As New DataSet()

Try
    xmlContent = webClient.DownloadString("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml")
    ' 使用StringReader传递XML内容,避免被当作文件路径处理
    Using reader As New StringReader(xmlContent)
        dataSet.ReadXml(reader)
    End Using

    ' 找到包含currency和rate列的汇率数据表
    Dim rateTable As DataTable = Nothing
    For Each table As DataTable In dataSet.Tables
        If table.Columns.Contains("currency") AndAlso table.Columns.Contains("rate") Then
            rateTable = table
            Exit For
        End If
    Next

    If rateTable IsNot Nothing Then
        DataGridView1.DataSource = rateTable
        ' 可选:隐藏自动生成的冗余列
        DataGridView1.Columns("cube_id").Visible = False
        DataGridView1.Columns("cube1_id").Visible = False
    Else
        MsgBox("未找到汇率数据表")
    End If
Catch ex As Exception
    MsgBox(ex.Message)
End Try

修正方案2:使用LINQ to XML直接提取数据(更可控)

如果DataSet的自动映射不符合需求,可手动解析XML并构建DataTable:

Imports System.Net
Imports System.Xml.Linq
Imports System.Data

Dim xmlContent As String
Dim webClient As New WebClient()
' 定义XML命名空间
Dim ns As XNamespace = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"

Try
    xmlContent = webClient.DownloadString("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml")
    Dim xDoc As XDocument = XDocument.Parse(xmlContent)

    ' 提取所有包含currency和rate属性的cube节点
    Dim rates = From cube In xDoc.Descendants(ns + "cube")
                Where cube.Attribute("currency") IsNot Nothing AndAlso cube.Attribute("rate") IsNot Nothing
                Select New With {
                    .Currency = cube.Attribute("currency").Value,
                    .Rate = Convert.ToDecimal(cube.Attribute("rate").Value)
                }

    ' 构建DataTable并绑定到DataGridView
    Dim rateTable As New DataTable()
    rateTable.Columns.Add("货币代码", GetType(String))
    rateTable.Columns.Add("汇率(相对于欧元)", GetType(Decimal))

    For Each item In rates
        rateTable.Rows.Add(item.Currency, item.Rate)
    Next

    DataGridView1.DataSource = rateTable
Catch ex As Exception
    MsgBox(ex.Message)
End Try

注意事项

  • ECB的XML带有命名空间,LINQ to XML解析时必须先定义对应命名空间才能正确找到节点
  • 方案1利用DataSet自动解析XML,适合快速开发;方案2手动解析,对数据结构的控制更强,适合复杂XML场景

内容的提问来源于stack exchange,提问作者m4dnew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:15:35