VB.NET读取在线XML文件并加载至DataGridView问题求助
解决VB.NET加载ECB汇率XML到DataGridView的问题
你的代码存在两个核心问题:
- 调用
ReadXml(xmlfile)时,传入的是XML内容字符串,但该重载方法会将参数识别为文件路径而非XML内容,导致文件不存在的错误 - 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
相关产品推荐
相关产品推荐

