首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

.NET 通用 RSS 轉 DataTable 解析器:支援動態欄位與巢狀項目

     編輯:ASP.NET 基礎

設計目標

解析任意 RSS 2.0 格式,自動偵測 <item> 子元素作為欄位,轉換為 DataTable,支援後續新增/刪除欄位無需修改程式碼。

完整實作程式碼

public static DataTable GetRss(string filePath)
{
    DataTable dt = new DataTable();
    using (WebClient wc = new WebClient())
    using (Stream stream = wc.OpenRead(filePath))
    using (StreamReader sr = new StreamReader(stream))
    {
        if (sr.EndOfStream) return dt;

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(sr);

        XmlNodeList itemNodes = xmlDoc.SelectNodes("rss/channel/item");
        if (itemNodes.Count == 0) return dt;

        // 動態建立欄位:以第一個 item 的子節點名稱為準
        XmlNode firstItem = itemNodes[0];
        foreach (XmlNode child in firstItem.ChildNodes)
        {
            dt.Columns.Add(new DataColumn(child.Name));
        }

        // 填入資料列
        foreach (XmlNode item in itemNodes)
        {
            DataRow dr = dt.NewRow();
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                XmlNode valueNode = item.SelectSingleNode(dt.Columns[i].ColumnName);
                dr[i] = valueNode?.InnerText ?? string.Empty;
            }
            dt.Rows.Add(dr);
        }
    }
    return dt;
}

關鍵設計亮點

  • 動態欄位發現: 不寫死欄位名稱,自動讀取第一筆 <item> 的所有子元素名稱建立 DataColumn。
  • 容錯處理: 使用 ?.InnerText ?? string.Empty 防止節點不存在拋出例外。
  • 資源釋放: 善用 using 區塊確保 WebClient、Stream、StreamReader 正確釋放。
  • 通用性: 適用於部落格、論壇、新聞等標準 RSS 來源,甚至包含自訂擴充欄位的 RSS。

使用範例

DataTable rssData = GetRss("https://example.com/feed.rss");
foreach (DataRow row in rssData.Rows)
{
    Console.WriteLine($"{row["title"]} - {row["pubDate"]}");
}

擴充建議

  • 加入快取機制(MemoryCache)避免頻繁請求同一 RSS。
  • 支援 Atom 格式(feed/entry 路徑不同)。
  • 加入網路逾時與重試邏輯(WebClient.Timeout 或改用 HttpClient)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved