想要輕鬆解析 RSS 訂閱源,首先必須深入理解其內部結構。所謂「知己知彼,百戰不殆」,這句話在程式開發中同樣適用。RSS 本質上是一種標準化的 XML 格式,各大新聞網站(如百度新聞)提供的 RSS 連結雖然樣式略有不同,但核心骨架高度一致:最外層是 <rss> 節點,內含單一 <channel> 節點,channel 下又包含多個 <item> 節點,每個 item 代表一則具體新聞,包含標題(title)、連結(link)、描述(description)等子節點。掌握這層結構,後續的程式碼編寫便迎刃而解。

新建一個 Windows Forms 專案,表單上拖放一個 Label、一個輸入 RSS 網址的 TextBox (txtURL)、一個「讀取新聞」按鈕(bnRead),以及一個用於樹狀顯示新聞列表的 TreeView (treeRSS)。為了方便儲存解析出的資料,定義兩個結構體:
public class RssData
{
public struct Channel
{
public string Title;
public Hashtable Items; // 鍵為索引,值為 Item 結構
}
public struct Item
{
public string Title;
public string Description;
public string Link;
}
}
Channel.Items 使用 Hashtable 存放所有新聞條目,鍵值僅需唯一,這裡直接用集合計數器作為鍵。
C# 提供了豐富的 XML 操作類別。這裡採用 XmlDocument 載入遠端 RSS,再透過自訂的 FoundChildNode 方法遞迴尋找指定名稱的子節點(如 rss、channel)。找到 channel 節點後,遍歷其子節點:遇到 title 存入頻道標題,遇到 item 則呼叫 GetRssItem 解析單條新聞並加入集合。
XmlTextReader reader = new XmlTextReader(url);
XmlValidatingReader validator = new XmlValidatingReader(reader);
validator.ValidationType = ValidationType.None;
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode rssNode = FoundChildNode(doc, "rss");
XmlNode channelNode = FoundChildNode(rssNode, "channel");
// 後續遍歷 channelNode.ChildNodes 並填充 RssData.Channel 結構
解析完成後,呼叫 ViewRss 方法將資料繫結到 TreeView:根節點顯示頻道名稱,子節點逐一加入新聞標題,並將對應的原文連結存入節點的 Tag 屬性。最後在 treeRSS_AfterSelect 事件中讀取 Tag,使用 Process.Start 呼叫預設瀏覽器開啟原文。
private void ViewRss(RssData.Channel channel)
{
treeRss.BeginUpdate();
treeRss.Nodes.Clear();
TreeNode root = treeRss.Nodes.Add(channel.Title);
root.Tag = "";
for (int i = 0; i < channel.Items.Count; i++)
{
RssData.Item item = (RssData.Item)channel.Items[i];
TreeNode node = root.Nodes.Add(item.Title);
node.Tag = item.Link;
}
treeRss.ExpandAll();
treeRss.EndUpdate();
}
private void treeRss_AfterSelect(object sender, TreeViewEventArgs e)
{
string url = e.Node.Tag?.ToString();
if (!string.IsNullOrEmpty(url))
Process.Start(url);
}

至此,一個功能完整的 RSS 閱讀器已經誕生。雖然它尚缺乏未讀標記、分類管理、自動重新整理等進階功能,但核心流程——「下載 XML → 解析節點 → 結構化儲存 → UI 繫結 → 互動跳轉」——已完整呈現。掌握這套流程,你便能輕鬆擴展出支援 Atom、JSON Feed 等格式的通用訂閱工具,甚至整合到自己的資訊聚合平台中。