解析任意 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 正確釋放。DataTable rssData = GetRss("https://example.com/feed.rss");
foreach (DataRow row in rssData.Rows)
{
Console.WriteLine($"{row["title"]} - {row["pubDate"]}");
}
MemoryCache)避免頻繁請求同一 RSS。feed/entry 路徑不同)。WebClient.Timeout 或改用 HttpClient)。