透過XML釋出新聞(轉)

RegisterForBlog發表於2007-08-11
透過XML釋出新聞(轉)[@more@]

  新的 RSS 新聞聚合頻繁出現,這是因為越來越多的軟體開發人員發現:無論是用於商業還是個人使用,該技術在“語言表達”方面確實有效。例如,一個程式設計師的網路日記可以為記錄開發人員在最新專案或感興趣的解決方案中感受到的喜悅或遇到的挑戰提供一個很好的平臺。在這篇 Ted Roche 在 4 月發表的 RSS 文章的續篇中,他展示了 Visual FoxPro 開發人員如何能夠僅使用幾個常用且功能強大的 VFP 命令來輕鬆地建立 RSS 聚合新聞。

  

  在上個月有關 RSS 的文章中,我談到了作為一個使用者來使用 RSS,手動讀取和編寫 RSS,訂閱 RSS 聚合新聞以便在新聞閱讀器中閱讀,以及使用 blogging 軟體釋出 RSS。本文將探討使用 Visual FoxPro 以程式設計方式生成 RSS。我將說明基本的格式,並討論用 VFP 生成 RSS 的兩種方法。

  

  格式

  RSS 的歷史與很多特定標準類似,不同的團體獲得絕對優勢地位並宣告其合理性,然後分裂並留下舊格式。實際上,現在有兩種格式可以考慮:RSS 1.0 和 2.0。(第三個競爭者 Atom ― 有爭議,正如它的某些作者所堅持的,根本不是 RSS ― 可能只是一種變體。它正處於早期開發階段,目前的版本是 3.0,本文不會考慮它,但會對其加以關注。)

  

  儘管有相似之處,RSS 1.0 和 RSS 2.0 仍然由兩個對立的陣營所管理。如果您只能支援一個格式,那麼 RSS 2.0 似乎是最簡單且最普遍的。但是,RSS 1.0 具有更豐富的語法,並且對擴充套件基本結構的含義有更明確的定義。大多數工具對這兩種格式都支援,並且正如我將展示的,在這兩種格式中生成“公分母”輸出並不是那麼困難。

  

  那麼,什麼是基礎結構呢?一個 RSS 文件(也稱為“聚合新聞”,因為它們很多都是新聞聚合)包含一個描述資訊源(新聞“通道”)的標頭和一個帶有一篇或多篇文章、新聞頭條、引用或者任何隨附內容的正文。在 RSS 1.0 中,項是通道元素的同輩,它們在通道元素的 集合中列出。在 RSS 2.0 中,項本身作為子元素包含在通道元素內。上一篇文章展示了 RSS 2.0 的一個示例,由靠近頂部的 版本標記來區分。下面的程式碼展示了一個典型的 RSS 1.0 feed。請注意,整個文件都包括在 和 標記中。這表現了 RSS 1.0 文件的特性。

  

  

    xmlns:rdf=""

  xmlns:dc=""

  xmlns:sy=""

  xmlns:admin=""

  xmlns="">

    rdf:about="">

  

  

  Changes to the web site of Ted Roche

  & Associates, LLC

  en-us

  

  

  2004-01-07T16:55:48

    ""/>

    "mailto:tedroche@tedroche.com"/>

  

  

    "/ConfGrid#2003"/>

  

  

  

    "/ConfGrid#2003">

  

    from 2003 conferences...]]>

  /ConfGrid#2003

  Unknown

  2004-01-07T16:55:48

  

  

  

  生成 RSS

  生成 RSS 的方法有很多種。在上一篇文章中,我提到了 Notepad,它是一種粗糙但有效的工具。在這裡,我將以兩種不同的方法使用 VFP:textmerge 和 MSXML COM 物件。每種技術都有其優勢和劣勢。

  

  VFP 技術的優勢在於其速度和配置的簡單性。Textmerge 在速度上佔優勢:由於所使用的所有物件都是原生 VFP 命令,其生成過程快如閃電。安裝生成 RSS 的 VFP 應用程式只需要通常的執行庫安裝。與之相對,MSXML 物件必須在目標機器上安裝和配置;在 Web 伺服器上使用它時,我遇到了一些困難,而其他人也報告了類似的問題。原生 VFP 技術避免了這一點。(請注意,XMLToCursor 使用 MSXML COM 物件;如果您要尋求一種“純粹”的 VFP 解決方案,那麼也需要避免這一點。)

  

  但是,VFP 沒有任何原生功能來驗證和操作 XML;因此,生成的聚合新聞可能不正確。最佳示例之一在上述程式碼塊中:新聞聚合的標題是“Ted Roche & Associates,LLC Web Site”,and 字元需要“轉義”為 & 格式,以防止分析錯誤。同樣,大於號和小於號也要分別轉換為 > 和   

  根據您為聚合新聞選擇的字符集,其他字元也應該進行轉義,以確保在目標系統上正確顯示。除了字符集轉換以外,使用 MSXML COM 物件還可以確保完成一些基本的驗證。COM 物件將始終生成有效且格式規範的 XML。使用 Visual FoxPro 物件,您需要自己檢查 XML。

  

  為了簡化本文中的技術解釋,您可以假定資料來自兩個遊標:curHead 包含標題、說明以及通道(標頭)元素所需的連結資訊,curItem 包含每個新聞項的一個記錄,並帶有該文章的標題、連結和說明。

  

  使用 FoxPro textmerge 生成 RSS

  FoxPro textmerge 可以透過以下程式碼快速而有效地生成 XML,這段程式碼將生成一個 RSS 2.0 feed:

  

  LOCAL lcXML as String, lcContents as String, lcFileName

  STORE SPACE(0) TO lcXML, lcContents

  #DEFINE CRLF CHR(13)+CHR(10)

  lcFileName = "trweb.xml"

  * Read header information

  SELECT cTitle as Title, ;

  cLink as Link, ;

  mDesc as Description ;

  FROM trhead ;

  INTO CURSOR curHead

  * Read news items

  Select TOP 10 cTitle as Title, ;

  tUpdated as pubDate, ;

  mContent as Description, ;

  cLink as link ;

  FROM trweb ;

  ORDER BY tUpdated descending ;

  INTO CURSOR curItem

  * Generate the items - body'

  SELECT curItem

  SET textmerge TO memvar lcXML additive

  SET TEXTMERGE ON noshow

  SCAN

  

  

  <>

  <>

  <>

  

  ENDSCAN

  SET TEXTMERGE off

  SET TEXTMERGE to

  * Generate the heading and channel items and embed

  * the body within

  Set Textmerge To Memvar lcContents

  Set Textmerge On Noshow

  

  > --&gt

  

  

   

   <>

   <>

   en-us

   Copyright <>

   <>

   http://blogs.law.harvard.edu/tech/rss

   <>

   60

   <>

  

  

  Set Textmerge Off

  Set Textmerge To

  * Write it out

  lcSafety = Set("Safety")

  Set Safety Off

  Strtofile(lcContents, lcFileName, 0)

  Set Safety &lcSafety

  FUNCTION HTMLFix(tcString)

  * This code ASSUMES the incoming string is ANSI,

  * CHR(32) to (127) and has not already had the

  * characters converted - it will make a mess of a

  * string that already has strings like ― in it.

  LOCAL lcString as string

  lcString = STRTRAN(tcString,"&","&")

  lcString = STRTRAN(lcString,"  lcString = STRTRAN(lcString,">",">")

  RETURN ALLTRIM(lcString)

  

  下面看一下程式碼中發生了什麼。curItems 遊標包含名為“title”、“description”和“link”的欄位,用於匹配 XML 主體所需的項。在源表中,這些欄位被相應地命名為 cTitle、mDesc 和 cLink,但是它們被生成遊標的 SQL SELECT 語句中的別名加以更改。在更多幾個程式碼行中,專案列表是透過 scan 和 textmerge 生成的。然後,用 textmerge 生成主文件,從 curHead 遊標取出值,並對其他值(如果您需要擴充套件該示例,也可以將這些值包含在 curHead 遊標中)進行硬編碼。最後,用 StrToFile() 寫出檔案。

  

  RFC822Date() 函式是一個簡單的 UDF,包含它是為了將所提供的 FoxPro datetime 值轉換為 RSS 2.0 規範所需的 RFC 822 格式,如“Thu, 27 Feb 2003 14:11:12 GMT”。(RSS 1.0 規範要求一種由 ISO 8601


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10763080/viewspace-948389/,如需轉載,請註明出處,否則將追究法律責任。

相關文章