如何使用Xamarin Forms和C#将网站HTML数据保存到文本文件
问题修复与优化方案
报错原因解决
你遇到的类型转换报错是因为File.WriteAllText的第二个参数要求传入字符串类型,而你传入的item是HtmlAgilityPack.HtmlNode类型的节点对象,没有做内容提取。你可以根据需求选择两个属性获取字符串内容:
- 仅获取节点内的纯文本内容:使用
InnerText属性 - 获取节点包含标签的完整HTML内容:使用
OuterHtml属性
现有代码的优化点
你当前的写法还有几个隐含问题需要调整:
- 循环内调用
File.WriteAllText会每次覆盖文件内容,最终只会保留最后一个节点的数据 - 同步加载网页、写入文件的操作会阻塞UI线程,点击按钮后会出现应用无响应的问题
- Xamarin.Forms中不能直接用文件名写入,需要指定应用沙盒的合法存储路径,否则文件无法正常读写
完整优化代码
using HtmlAgilityPack; using System.IO; using System.Linq; using System.Threading.Tasks; using Xamarin.Essentials; // 方法修改为异步 private async Task WebScraper() { // 异步加载网页,避免阻塞UI HtmlWeb web = new HtmlWeb(); HtmlDocument doc = await web.LoadFromWebAsync("https://www.flightview.com/airport/DAB-Daytona_Beach-FL/"); // 收集所有符合条件的节点内容 var nodes = doc.DocumentNode.SelectNodes("//td[@class='c1']"); if (nodes == null) return; // 防止没有匹配到节点时报空引用 var allContent = string.Join("\n", nodes.Select(n => n.InnerText.Trim())); // 获取Xamarin合法存储路径,这里用的是应用缓存目录,你也可以换成FileSystem.AppDataDirectory var filePath = Path.Combine(FileSystem.CacheDirectory, "AirportData.txt"); // 异步写入文件 await File.WriteAllTextAsync(filePath, allContent); } public ICommand OpenWebCommand { get; } // 命令要支持异步执行,推荐配合AsyncRelayCommand绑定按钮点击事件 public ICommand WebScraperCommand { get; }
额外说明
后续读取该文件时直接使用上述filePath路径即可,不要直接用文件名读取。如果需要简化异步命令的绑定逻辑,可以安装MVVM相关工具包使用封装好的异步命令实现。
内容的提问来源于stack exchange,提问作者clayclayclayclay
相关产品推荐
相关产品推荐

