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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:54:03