|
在上一篇文章中,我描述了 RSS Bandit 應(yīng)用程序的內(nèi)部工作原理,該應(yīng)用程序通過處理 Web 上的 RSS 提要來收集各種 Web 站點(diǎn)上的信息。正如我在上一篇文章中提到的那樣,RSS 是一種 XML 格式,用于組合來自聯(lián)機(jī)新聞源的新聞和類似內(nèi)容。 RSS 提要是一個定期更新的 XML 文檔,其中包含有關(guān)新聞源和其中內(nèi)容的元數(shù)據(jù)。一個 RSS 提要至少應(yīng)包含一個代表新聞源的 channel,channel 包含一個標(biāo)題、鏈接和描述新聞源的說明。此外,一個 RSS 提要通常會包含一個或多個代表單個新聞項(xiàng)的 item 元素,其中每個元素都應(yīng)包含一個標(biāo)題、鏈接或說明。 自撰寫上一篇文章以來,RSS 已被更廣泛地用作 Web 上散布新聞的機(jī)制。RSS 提要不僅由聯(lián)機(jī)新聞源(如 Yahoo!News、BBC 和 Rolling Stone magazine)使用,而且已經(jīng)在以開發(fā)人員為中心的信息源(如 Microsoft Developer Network (MSDN)、Oracle Technology Network (OTN) 和 Sun Developer Network)之間變得很流行。隨著 RSS 提要的迅速增加,桌面新聞集合器已經(jīng)成為一個功能強(qiáng)大的工具,讓那些有興趣及時了解各種新聞源信息的人不必瀏覽多個 Web 站點(diǎn)來獲取固定的信息。 在過去的幾個月中,GotDotNet 上的 RSS Bandit 工作區(qū)已經(jīng)收到了 .NET 框架開發(fā)人員社區(qū)多個成員(如 Torsten Rendelmann、Michael Earls、Joe Feser)和許多 RSS Bandit 工作區(qū)其他成員的踴躍投稿。本文描述在過去幾個月內(nèi) RSS Bandit 應(yīng)用程序中各種新增功能的內(nèi)部原理。 了解 RSS Bandit 的用戶界面RSS Bandit 的用戶界面受郵件和新聞閱讀器(如 Microsoft Outlook? 和 Microsoft Outlook Express)的啟發(fā)。在 RSS Bandit 的當(dāng)前版本和上一篇文章中的版本之間有一個最顯著的區(qū)別,那就是用戶界面得到了改善。RSS Bandit 使用一個魔術(shù)庫,此庫是用戶界面控件的框架,它提供的功能比基本 Windows 窗體控件更豐富。 ![]() 圖 1. 用 RSS Bandit 閱讀新聞 魔術(shù)庫提供的強(qiáng)大功能之一就是能夠創(chuàng)建選項(xiàng)卡式窗格,此功能允許用戶在單個應(yīng)用程序中嵌套多個窗體。下面的圖 2 顯示魔術(shù)庫中的選項(xiàng)卡式窗格如何允許用戶從 RSS Bandit 內(nèi)部利用多個 Web 瀏覽器窗口。 ![]() 圖 2. 用 RSS Bandit 瀏覽 Web RSS Bandit 結(jié)構(gòu)概述RSS Bandit 應(yīng)用程序由兩個截然不同的部分組成:圖形用戶界面組件和 XML 和網(wǎng)絡(luò)組件。主要的 GUI 類是 WinGuiMain 和 RssBanditApplication 類,而主要的 XML 和網(wǎng)絡(luò)類是 RssHandler 和 RssLocater。 RssHandler 類按指定間隔時間下載 RSS 提要,并將它們提交給 CacheManager 來存儲。CacheManager 使用的存儲區(qū)與應(yīng)用程序的耦合程度不緊密,實(shí)際上,CacheManager 是一個抽象的類,目前它只有一個具體實(shí)現(xiàn),即用于將文件緩存到本地文件系統(tǒng)上的 FileCacheManager。這種靈活性意味著可以在將來引進(jìn)新類型的 CacheManager,以便使用更好、更優(yōu)化的存儲區(qū),如數(shù)據(jù)庫管理系統(tǒng)。同樣,RssHandler 類與用戶界面的耦合程度也不緊密,它可以由需要處理 RSS 提要的其他應(yīng)用程序重新使用。利用 RssHandler 類的客戶端會在實(shí)例化該類時注冊一個回調(diào)(委托)。然后,在下載新提要或更新后的提要時,RssHandler 對象會調(diào)用已注冊的回調(diào)。有關(guān)要下載哪些提要的信息以及其他配置數(shù)據(jù),可從用 XML 編寫的提要訂閱列表中獲取。RssLocater 將在嘗試發(fā)現(xiàn)特定 Web 站點(diǎn)的 RSS 提要時使用,并在嘗試定位提要時,使用一組定義完善的試探法。 RssBanditApplication 從 ApplicationContext 繼承,并控制 WinGuiMain。這是一個 Windows 窗體,其中包含一個樹視圖(用于顯示所訂閱提要的列表,這些提要可按自由定義的類別分組)、一個列表視圖(用于以您熟悉的任何 NNTP 閱讀器(如 Outlook Express)中的線程模式,來顯示有關(guān)當(dāng)前選定提要中項(xiàng)目的信息),以及一個內(nèi)嵌的 Web 瀏覽器(用于顯示項(xiàng)目內(nèi)容)。在啟動時,RssBanditApplication 會確認(rèn)是否有正在運(yùn)行的程序?qū)嵗?。如果有,它會向該?shí)例轉(zhuǎn)發(fā)任一命令行參數(shù)并自行終止。如果沒有正在運(yùn)行的類實(shí)例,則 RssBanditApplication 會用 RssHandler 注冊一個委托,RssHandler 可管理 RSS 提要的下載和處理。在下載新提要或更新后的提要后,RssBanditApplication 會使用 Safe, Simple Multithreading in Windows Forms, Part 1 文章(作者是 Chris Sells)中描述的方法,以線程安全方式通過委托進(jìn)行更新。 RssBanditApplication 類還可充當(dāng)多種用戶界面組件(菜單、工具欄按鈕、上下文菜單等)的中介,并可將操作委托給 WinGuiMain 和 RssHandler,或者在用戶與應(yīng)用程序交互時親自處理它們。每個可代表用戶啟動操作的主要用戶界面組件都可實(shí)現(xiàn) ICommand 接口(命令模式)和 ICommandComponent 接口,以提取多個類的實(shí)現(xiàn)細(xì)節(jié)。 該用戶界面還允許用戶管理 RssHandler 類各個方面的行為。用戶可以在訂閱列表中添加和刪除提要、配置提要的下載頻率、按類別組織提要,以及設(shè)置代理服務(wù)器信息。RssItemFormatter 類可使用 XslTransform 類來處理新聞項(xiàng)的顯示內(nèi)容,它使用用戶定義的 XSLT 樣式表,并將實(shí)現(xiàn) IXPathNavigable 接口的 RssItem 轉(zhuǎn)換為 HTML。 XML 技術(shù)和 RSS BanditRSS Bandit 應(yīng)用程序充分利用了 .NET 框架中的 XML 技術(shù)。RSS Bandit 可使用 XML 序列化在 XML 配置文件和對象之間進(jìn)行轉(zhuǎn)換;可使用 XSLT 來實(shí)現(xiàn)新聞項(xiàng)的可自定義視圖;可使用 XPath 來處理 RSS 提要的 HTML 內(nèi)容并刪除可能有惡意的元素;可使用 System.Xml.XmlWriter 類來確保它編寫格式正確的 XML,等等。 使用 XSLT 的可自定義主題在 RSS Bandit 中閱讀新聞項(xiàng)時,它們顯示在該應(yīng)用程序右下方的窗格中,此窗格實(shí)際上是一個嵌入式 Web 瀏覽器控件。使用嵌入式 Web 瀏覽器可以顯示新聞提要的內(nèi)容,初始版本的 RSS Bandit 并沒有利用它所帶來的靈活性。在當(dāng)前版本的 RSS Bandit 中,用戶可以創(chuàng)建一個 XSLT 樣式表,以自定義新聞項(xiàng)在 Web 瀏覽器窗格中的顯示方式。圖 3 是一個配置菜單的屏幕快照,在這里,用戶可以從 RSS Bandit 應(yīng)用程序的模板文件夾中選擇特定的樣式表 ![]() 圖 3. 選擇自定義樣式表 下載的每個 RSS 提要都表示為一個包含 RssItem 對象列表的 FeedInfo 對象。RssItem 類可實(shí)現(xiàn) IXPathNavigable 接口,這意味著它是 System.Xml.Xsl.XslTransform 類的 Transform 方法可接受的輸入內(nèi)容。在實(shí)現(xiàn) IXPathNavigable 接口時,會將 RssItem 公開為 RSS 2.0 XML 提要,其中包含一個代表 RssItem 中數(shù)據(jù)的項(xiàng)目。在 Web 瀏覽器窗格中顯示新聞項(xiàng)時,當(dāng)前選定的 XSLT 樣式表和 RssItem 實(shí)例會作為輸入內(nèi)容傳遞到 XslTransform 類的 Transform 方法中,該方法隨后會在瀏覽器窗格中呈現(xiàn)轉(zhuǎn)換結(jié)果。 由于大多數(shù) RSS 提要在其內(nèi)容中不使用 XHTML,而是喜歡使用純文本或正規(guī) HTML,因此有必要使用 Chris Lovett 的 SgmlReader 類來處理此類提要,SgmlReader 類可用于將 HTML 內(nèi)容轉(zhuǎn)換為 XHTML。 用 XSLT 導(dǎo)入提要列表用于存儲用戶訂閱的 RSS 提要列表的現(xiàn)有 XML 格式有好幾種。這些格式包括 OPML、OCS 和我在上一篇文章中為 RSS Bandit 選擇的格式。 盡管 RSS Bandit 在內(nèi)部適用于我的提要列表格式,但還可以導(dǎo)入 OPML 或 OCS 格式的提要列表。如果導(dǎo)入的提要列表不是 RSS Bandit 格式,則會檢查它是否為 OPML 或 OCS 格式。如果提要列表采用這兩種格式之一,則會針對導(dǎo)入的提要列表調(diào)用一個樣式表,以便將特定格式轉(zhuǎn)換為 RSS Bandit 提要列表格式。下面的樣式表可將 OCS 文件轉(zhuǎn)換為我的提要訂閱列表格式: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www./1999/XSL/Transform" xmlns="http://www./2003/RSSBandit/feeds/" xmlns:rdf="http://www./1999/02/22-rdf-syntax-ns#" xmlns:dc="http:///metadata/dublin_core#" exclude-result-prefixes="dc rdf"> <xsl:output method="xml" indent="yes" /> <xsl:template match="/"> <feeds> <xsl:for-each select="/rdf:RDF/rdf:description/rdf:description"> <feed> <title> <xsl:choose> <xsl:when test="dc:title"> <xsl:value-of select="dc:title" /> </xsl:when> <xsl:otherwise> <link>No title for RSS feed provided in imported OCS</link> </xsl:otherwise> </xsl:choose> </title> <link> <xsl:choose> <xsl:when test="rdf:description/@about"> <xsl:value-of select="rdf:description/@about" /> </xsl:when> <xsl:otherwise> <link>No URL for RSS feed provided in imported OCS</link> </xsl:otherwise> </xsl:choose> </link> </feed> </xsl:for-each> </feeds> </xsl:template> </xsl:stylesheet> 將導(dǎo)入的文件轉(zhuǎn)換為 RSS Bandit 提要訂閱列表格式之后,它會與在啟動時處理的提要訂閱列表的內(nèi)部表示形式合并在一起。 配置文件和 W3C XML 架構(gòu)RSS Bandit 提要列表格式是使用 W3C XML 架構(gòu)定義 (XSD) 文件進(jìn)行描述的,該文件允許應(yīng)用程序利用 .NET 框架的 XML 序列化功能將 XML 轉(zhuǎn)換為強(qiáng)類型對象,以便在與提要列表格式的內(nèi)容交互時提供更自然的編程模型。 RSS Bandit 的集成式搜索 功能也有一個 XML 配置文件格式。用戶可以選擇使用一個或多個搜索引擎,直接從 RSS Bandit 用戶界面搜索 Web。在默認(rèn)情況下,配置文件包含有關(guān) Google、Feedster 和 MSN Search 的信息。用戶還可以使用 XmlSerializer 類來處理搜索配置文件,XmlSerializer 類可將搜索配置文件轉(zhuǎn)換為強(qiáng)類型對象的圖形,以提供一個更自然的編程模型來與配置信息進(jìn)行交互。下面是搜索配置文件的架構(gòu)。 <xs:schema targetNamespace=‘http://www./2003/RSSBandit/searchConfiguration/‘ xmlns:xs=‘http://www./2001/XMLSchema‘ elementFormDefault=‘qualified‘ xmlns:c=‘http://www./2003/RSSBandit/searchConfiguration/‘> <xs:element name=‘searchConfiguration‘> <xs:complexType> <xs:sequence> <xs:element name=‘engine‘ minOccurs=‘0‘ maxOccurs=‘unbounded‘> <xs:complexType> <xs:sequence> <xs:element name=‘title‘ type=‘xs:string‘ /> <xs:element name=‘search-link‘ type=‘xs:anyURI‘> <xs:annotation> <xs:documentation> This defines the base URL of the search engine. The placeholder for the search expression is ‘[PHRASE]‘ without the single quotes but with the brackets! </xs:documentation> </xs:annotation> </xs:element> <xs:element name=‘description‘ type=‘xs:string‘ /> <xs:element name=‘image-name‘ type=‘xs:string‘ /> </xs:sequence> <xs:attribute name=‘a(chǎn)ctive‘ type=‘xs:boolean‘ /> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name=‘open-newtab‘ type=‘xs:boolean‘ use=‘optional‘ /> </xs:complexType> </xs:element> </xs:schema> 圖 4 顯示如何在 RSS Bandit 應(yīng)用程序中使用搜索配置文件中的信息。 ![]() 圖 4. 從 RSS Bandit 搜索 Web 生成格式正確的 XML 和導(dǎo)出 OPML 文件許多新聞集合器都使用 OPML 格式來存儲提要列表信息,因此,該格式對于 RSS Bandit 的用戶非常有利,因?yàn)樗軌驅(qū)⑵鋬?nèi)部的提要列表導(dǎo)出到 OPML 文件中。在初始版本的 RSS Bandit 中,我用以下代碼生成了數(shù)個可用于幾個測試案例的 OPML 文件,但是很多用戶在嘗試此功能時失敗。 StringBuilder sb = new StringBuilder("<opml>\n<body>\n");
if(_feedsTable != null){
foreach(feedsFeed f in _feedsTable.Values){
sb.AppendFormat("<outline title=‘{0}‘ xmlUrl=‘{1}‘
/>\n", f.title, f.link);
}
}
sb.Append("</body>\n</opml>");
上述代碼的問題在于,它同時處理了構(gòu)造 XML 和串聯(lián)文本值,盡管這是一個比較誘人的建議,但卻是錯誤的。當(dāng)用戶在 RSS 提要的標(biāo)題中使用被 XML 視為特殊的字符(如和符號 (&) 或單引號 (‘))時,RSS Bandit 會生成格式有誤的 XML。為了解決此問題,我決定使用專門針對編寫 XML 而設(shè)計的 .NET 框架類 — XmlWriter 類。下面是為了使用 XmlWriter 類而重寫的同一任務(wù)。 XmlTextWriter writer = new XmlTextWriter(feedStream,System.Text.Encoding.UTF8);
writer.WriteStartElement("opml");
writer.WriteStartElement("body");
if(_feedsTable != null) {
foreach(feedsFeed f in _feedsTable.Values) {
writer.WriteStartElement("outline");
writer.WriteAttributeString("title",f.title);
writer.WriteAttributeString("xmlUrl", f.link);
writer.WriteEndElement();
}
}
writer.WriteEndElement(); //close <body>
writer.WriteEndElement(); //close <opml>
writer.Flush();
writer.Close();
XPath 和 RSS Bandit:自動發(fā)現(xiàn)提要在訂閱 Web 站點(diǎn)的 RSS 提要時,主要困難之一就是發(fā)現(xiàn) RSS 提要的位置。在 2002 年 8 月,Mark Pilgrim 曾描述了一個超自由主義 RSS 定位器的算法,該算法由以下幾個步驟組成:
RSS Bandit 使用 RssLocater 類來實(shí)現(xiàn)上面的自動發(fā)現(xiàn)過程。第一步涉及到下載 Web 站點(diǎn)并在其中搜索鏈接。作為一個 XML 的狂熱支持者,我希望使用 XPath 在文檔中搜索鏈接,但意識到這會非常困難,因?yàn)榇蠖鄶?shù)站點(diǎn)都不是用基于 XML 的 XHTML 標(biāo)記語言編寫的,而是用與 XML 不兼容的舊版 HTML 編寫的。在這種情況下,可以借助于 Chris Lovett 的 SgmlReader 類。SgmlReader 類可以讀入 HTML 文檔并將它表示為 XML 文檔,隨后可以使用 .NET 框架中的傳統(tǒng) XML API 來處理此 XML 文檔。以下代碼片段顯示用戶如何使用 XPath 來獲取 HTML 文檔中引用 RSS 提要的所有 LINK 元素: SgmlReader reader = new SgmlReader();
reader.InputStream = new StreamReader(GetWebPage(url));
reader.Href = url;
reader.DocType= "HTML";
XmlDocument doc = new XmlDocument();
doc.XmlResolver = null;
doc.Load(reader);
ArrayList list = new ArrayList();
//<link rel="alternate" type="application/rss+xml" title="RSS" href="url/to/rss/file">
foreach(XmlNode node in doc.SelectNodes("http://*[local-name()=‘link‘ and
@type=‘a(chǎn)pplication/rss+xml‘ and @title=‘RSS‘]/@href")){
string url = ConvertToAbsoluteUrl(node.Value, node.BaseURI);
if(LooksLikeRssFeed(url)){
list.Add(url);
}
}
圖 5 中的屏幕快照顯示一個對話框,若在嵌入式 Web 瀏覽器中查看的站點(diǎn)是 MSDN 主頁,則在單擊 RSS Bandit 應(yīng)用程序上的 Autodiscover Feeds 按鈕時,該對話框會彈出。 ![]() 圖 5. 啟動提要自動發(fā)現(xiàn)功能 圖 6 中的屏幕快照顯示在站點(diǎn)中成功找到 RSS 提要的結(jié)果。 ![]() 圖 6. 找到的提要 使用 XPath 篩選可能有惡意的內(nèi)容如上所述,RSS 提要中的 HTML 內(nèi)容會先轉(zhuǎn)換為 XHTML,然后才顯示在瀏覽器窗格中。如果不注意從 RSS 提要的 HTML 內(nèi)容中去除可能有惡意的元素(如腳本塊),可能會導(dǎo)致安全問題。由于 RSS 提要中的 HTML 內(nèi)容是使用 Chris Lovett 的 SgmlReader 類轉(zhuǎn)換為 XHTML 的,因此可以方便地使用 XPath 和 XmlDocument 類來去除不需要的標(biāo)記。以下代碼片段顯示如何使用 XPath 從 RSS 提要的內(nèi)容中篩選掉可能有惡意的元素和屬性。 //remove potentially malicious tags
string badtagQuery = "http://@style | //*[local-name()=‘script‘ or local-
name()=‘object‘or local-name()=‘embed‘ or local-name()=‘iframe‘ or local-
name()=‘meta‘ or local-name()=‘frame‘or local-name()=‘frameset‘ or local-
name()=‘link‘ or local-name()=‘style‘]";
foreach(XmlNode badtag in doc.SelectNodes(badtagQuery)){
XmlAttribute badattr = badtag as XmlAttribute;
if(badattr != null){
badattr.OwnerElement.Attributes.Remove(badattr);
}else{
badtag.ParentNode.RemoveChild(badtag);
}
}
從 RSS Bandit 張貼注釋我最初創(chuàng)建 RSS Bandit 的目的是將它用作跟蹤經(jīng)常訪問的多個 weblog 的方法。在早些時候,我認(rèn)為 weblog 的一個有趣方面就是它們的對話特性,特別是用戶可以通過 Web 觀看討論場面的方式。RSS Bandit 有許多嘗試?yán)?weblog 對話特性的功能。 如果特定 RSS 提要中的某個新聞項(xiàng)引用 RSS Bandit 中的其他新聞項(xiàng),或被其他新聞項(xiàng)引用,則這種關(guān)系會顯示在用戶界面中,作為電子郵件和新聞閱讀器的線程消息回放。這提供了一個非常直觀的機(jī)制,用于在用戶訂閱的 weblog 上跟蹤討論,這是因?yàn)榛ハ嘁玫奶訒@示在一起。RSS Bandit 還提供了多種方法,與為響應(yīng)特定新聞項(xiàng)而張貼的注釋進(jìn)行交互,具體方法取決于其 RSS 提要中提供的信息。用于提供有關(guān)新聞項(xiàng)注釋信息的 RSS 元素有許多,其中包括 comment 元素(它提供一個鏈接,用戶可以在此處于用戶界面中張貼新聞項(xiàng)注釋)、slash:comments 元素(用于指出為響應(yīng)新聞項(xiàng)而張貼的注釋數(shù)量)、wfw:commentRss 元素(為新聞項(xiàng)注釋提供 RSS 提要的位置)和 wfw:comment 元素(它提供的 URI 可接受作為新聞項(xiàng)答復(fù)來發(fā)送的 RSS 項(xiàng),新聞項(xiàng)使用的是 HTTP POST)。 RSS Bandit 支持上面的元素,這些元素提供有關(guān)特定新聞項(xiàng)注釋的信息。下面的圖 7 是 RSS Bandit 的屏幕快照,它顯示全部四個與注釋有關(guān)的使用中 RSS 元素。 ![]() 圖 7. 從 RSS Bandit 閱讀和張貼注釋 將注釋張貼到 RSS Bandit 的機(jī)制是 CommentAPI,CommentAPI 指定應(yīng)用程序如何通過將RSS 項(xiàng)張貼到特定 URI 來發(fā)送對 RSS 提要中新聞項(xiàng)的響應(yīng)。以下代碼片段顯示 RSS Bandit 如何使用 HTTP POST 來發(fā)送對 RSS 提要中新聞項(xiàng)的答復(fù)。 public HttpStatusCode PostCommentViaCommentAPI(string url, RssItem item){
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
request.Timeout = 1 * 60 * 1000; //one minute timeout
request.UserAgent = this.UserAgent;
request.Proxy = this.Proxy;
request.Credentials = CredentialCache.DefaultCredentials;
request.Method = "POST";
request.ContentType = "text/xml";
string comment = item.ToString(true);
request.ContentLength = comment.Length;
StreamWriter myWriter = null;
try{
myWriter = new StreamWriter(request.GetRequestStream());
Trace.WriteLine(comment);
myWriter.Write(comment);
} catch(Exception e){
throw new WebException(e.Message, e);
}finally{
if(myWriter != null){
myWriter.Close();
}
}
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
return response.StatusCode;
}
應(yīng)注意的是,對 CommentAPI 的支持尚不普及。CommentAPI 實(shí)現(xiàn)列表中提供了支持 CommentAPI 的 Web 站點(diǎn)列表。一個值得注意的 CommentAPI 支持程序是 .Text blog 引擎,Weblogs @ ASP.NET 和 Weblogs @ DotNetJunkies.com 均使用該引擎。 RSS Bandit 有一個虛擬文件夾,其中存儲有通過圖 8 所示的 CommentAPI 張貼的所有注釋。 ![]() 圖 8. 已發(fā)送項(xiàng)目文件夾 插件結(jié)構(gòu)在最近的一個名為在 CLR 中傳遞 XML 數(shù)據(jù)的 MSDN TV 情節(jié)中,Don Box 描述了在 .NET 框架的應(yīng)用程序之間傳遞 XML 的各種機(jī)制。用戶可以將許多類型選作 .NET 框架中 XML 文檔的表示形式,如 String、IXPathNavigable、XmlDocument 或 XmlReader 類的實(shí)例,它們各有利弊。最近,Simon Fell 建議將 IBlogExtension 接口用作基于 .NET 框架構(gòu)建的新聞集合器的通用機(jī)制,以便與插件共享信息,并選擇 IXPathNavigable 接口作為在新聞集合器和插件之間傳遞 XML(特別是 RSS 項(xiàng))的方法。 RSS Bandit 支持 IBlogExtension 接口,因此允許開發(fā)人員構(gòu)建與 RSS Bandit 集成的插件。圖 9 中的屏幕快照顯示與 w.bloggar 插件(位于 http://www./wBloggarPlugin.zip 上,由 Luke Hutteman 編寫)的集成,該插件使用戶能夠使用流行的 w.bloggar weblog 編輯器在他們的 weblog 中張貼特定新聞項(xiàng)。 ![]() 圖 9. 從 RSS Bandit 張貼到 Weblog RSS Bandit 的未來規(guī)劃自從我發(fā)表上一篇文章以來,RSS Bandit 已經(jīng)得到突飛猛進(jìn)的發(fā)展,這主要是由于我和 Torsten Rendelmann 的不懈努力以及 RSS Bandit 工作區(qū)中許多人的幫助。我打算繼續(xù)與 .NET 開發(fā)人員社區(qū)中的各位成員一起開發(fā) RSS Bandit,并一直將它用作顯示 .NET 框架功能的方法,以及構(gòu)建利用 XML 強(qiáng)大功能的豐富客戶端應(yīng)用程序的平臺。 在下一版本的 RSS Bandit 中,我希望看到幾個功能,如使用 更新程序塊進(jìn)行自動更新、新聞項(xiàng)選擇的類似于報紙的視圖,以及從 RSS Bandit 直接編輯用戶的 weblog 的功能。如果您愿意協(xié)助我們向 RSS Bandit 中添加這些功能或其他功能,歡迎您加入該工作區(qū)并提供幫助。您的幫助對我們總是有用的。 Dare Obasanjo 是 Microsoft 的 WebData 組的成員,該小組在 .NET 框架的 System.Xml 和 System.Data 命名空間、Microsoft XML 核心服務(wù) (MSXML) 和 Microsoft 數(shù)據(jù)訪問組件 (MDAC) 中開發(fā)組件。 有關(guān)本文的任何問題或評論,歡迎張貼到 GotDotNet 上的 Extreme XML 留言板。 |
|
|