C#中XML解析:如何从指定XML站点提取USD/TRY、GBP/TRY、EUR/TRY的外汇买入价并封装为List<ParaBirimi>
从TCMB XML中提取特定汇率数据并封装到自定义类
我明白你现在的需求:已经能读取TCMB的XML汇率数据,但不知道怎么精准筛选出USD、GBP、EUR的外汇买入价,还要把这些数据封装到你定义的ParaBirimi类里,最后返回一个List集合。
首先说一下,你原来用的XmlTextReader其实已经是过时的API了,现在更推荐用LINQ to XML(也就是XDocument类)来处理XML,代码会简洁很多,而且更容易定位到你需要的节点。下面我给你完整的实现方案:
第一步:准备工作
确保你的项目引用了System.Xml.Linq和System.Collections.Generic命名空间,前者用来处理XML,后者用来创建List集合。
你的ParaBirimi类可以保留,不用修改:
public class ParaBirimi { public decimal ForexBuying { get; set; } public string Name { get; set; }//Values like USD GBP EUR }
第二步:实现数据提取与封装
我把核心逻辑放到一个单独的方法里,这样代码更清晰,也方便复用。下面是完整的控制台程序代码:
using System; using System.Collections.Generic; using System.Globalization; using System.Xml.Linq; namespace ConsoleApp1 { public class ParaBirimi { public decimal ForexBuying { get; set; } public string Name { get; set; } // Values like USD GBP EUR } class Program { static void Main(string[] args) { string xmlUrl = "https://www.tcmb.gov.tr/kurlar/today.xml"; List<ParaBirimi> targetRates = GetTargetExchangeRates(xmlUrl); // 测试输出结果 foreach (var rate in targetRates) { Console.WriteLine($"{rate.Name} 外汇买入价: {rate.ForexBuying:N4}"); } } static List<ParaBirimi> GetTargetExchangeRates(string xmlUrl) { // 定义你需要的目标货币列表 var targetCurrencies = new List<string> { "USD", "GBP", "EUR" }; var resultList = new List<ParaBirimi>(); try { // 加载XML文档 XDocument xmlDoc = XDocument.Load(xmlUrl); // 用LINQ查询筛选出目标货币的节点 var filteredCurrencies = xmlDoc.Descendants("Currency") .Where(curr => targetCurrencies.Contains((string)curr.Attribute("CurrencyCode"))); foreach (var currencyNode in filteredCurrencies) { // 提取外汇买入价的文本,注意土耳其的数值格式是用逗号做小数点 string buyingPriceText = currencyNode.Element("ForexBuying").Value; if (decimal.TryParse(buyingPriceText, NumberStyles.Float, CultureInfo.GetCultureInfo("tr-TR"), out decimal buyingPrice)) { resultList.Add(new ParaBirimi { Name = (string)currencyNode.Attribute("CurrencyCode"), ForexBuying = buyingPrice }); } else { // 处理解析失败的情况,比如记录日志 Console.WriteLine($"无法解析{currencyNode.Attribute("CurrencyCode")}的买入价: {buyingPriceText}"); } } } catch (Exception ex) { // 处理网络或XML加载异常 Console.WriteLine($"获取汇率数据失败: {ex.Message}"); } return resultList; } } }
关键细节说明
- 用XDocument替代XmlTextReader:
XDocument.Load()可以直接加载远程XML,然后用LINQ语法快速定位到所有<Currency>节点,比手动遍历流节点高效太多。 - 筛选目标货币:通过
Where条件过滤出CurrencyCode属性为USD、GBP、EUR的节点,精准定位你需要的数据。 - 数值解析注意事项:TCMB返回的数值是土耳其地区格式(比如
28,7500),所以解析时必须指定tr-TR文化信息,否则会因为小数点符号不匹配导致解析失败。 - 异常处理:添加了try-catch块处理网络异常、XML加载失败等情况,让程序更健壮。
这样运行程序后,你就能得到一个包含USD、GBP、EUR外汇买入价的List<ParaBirimi>集合了。
内容的提问来源于stack exchange,提问作者Oytun Tur
相关产品推荐
相关产品推荐

