文中代碼使用 WinForm、Hashtable、XmlDocument、public class rss、屬性語法 public string Title { get; set; },**明確為 C# (Windows Forms) 項目**,非 Visual C++ (MFC/ATL/WTL)。標題「Visual C++」為誤導,**實為 C#/.NET 開發實戰**。
<rss>
<channel>
<title>頻道名稱</title>
<link>頻道鏈接</link>
<description>頻道描述</description>
<item> <!-- 多個新聞項 -->
<title>新聞標題</title>
<link>新聞鏈接</link>
<description>新聞摘要</description>
<pubDate>發布時間</pubDate>
</item>
</channel>
</rss>
public class RssFeed {
public class Channel {
public string Title { get; set; }
public string Link { get; set; }
public string Description { get; set; }
public List<Item> Items { get; set; } = new List<Item>();
}
public class Item {
public string Title { get; set; }
public string Link { get; set; }
public string Description { get; set; }
public DateTime PubDate { get; set; }
}
public Channel Channel { get; set; }
}
改進點:用強類型 List<Item> 替代 Hashtable,支援 LINQ 查詢、序列化、綁定。
public static RssFeed Parse(string xmlContent) {
var doc = XDocument.Parse(xmlContent);
var channel = doc.Root.Element("channel");
return new RssFeed {
Channel = new RssFeed.Channel {
Title = (string)channel.Element("title"),
Link = (string)channel.Element("link"),
Description = (string)channel.Element("description"),
Items = channel.Elements("item").Select(i => new RssFeed.Item {
Title = (string)i.Element("title"),
Link = (string)i.Element("link"),
Description = (string)i.Element("description"),
PubDate = DateTime.Parse((string)i.Element("pubDate"))
}).ToList()
}
};
}
// 界面:TextBox txtUrl, Button btnLoad, TreeView treeNews
private async void btnLoad_Click(object sender, EventArgs e) {
try {
using (var http = new HttpClient()) {
string xml = await http.GetStringAsync(txtUrl.Text.Trim());
var feed = RssFeed.Parse(xml);
treeNews.Nodes.Clear();
var root = treeNews.Nodes.Add(feed.Channel.Title);
root.Tag = feed.Channel.Link;
foreach (var item in feed.Channel.Items) {
var node = root.Nodes.Add(item.Title);
node.Tag = item; // 存儲完整對象
node.ToolTipText = item.Description;
}
root.Expand();
}
} catch (Exception ex) {
MessageBox.Show($"加載失敗: {ex.Message}");
}
}
// 雙擊節點打開鏈接
private void treeNews_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) {
if (e.Node.Tag is RssFeed.Item item)
Process.Start(new ProcessStartInfo(item.Link) { UseShellExecute = true });
else if (e.Node.Tag is string url)
Process.Start(new ProcessStartInfo(url) { UseShellExecute = true });
}
HttpClient + ETag/If-None-Match 或本地文件緩存本文實為 C# WinForms 開發 RSS 閱讀器實戰。核心價值在於:RSS/XML 結構理解、強類型數據模型、LINQ to XML 現代解析、TreeView 數據綁定與 Tag 模式存儲業務對象。Visual C++ (MFC/ATL) 實現同樣功能需手工解析 XML (MSXML/Expat/TinyXML)、管理內存、構建樹形控件項目,複雜度高得多。技術選型應誠實面對:C#/.NET 為此類應用層開發提供極高生產力。