新的 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="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:admin="http://webns.net/mvcb/"
xmlns="http://purl.org/rss/1.0/"
rdf:about="http://www.tedroche.com"
Ted Roche & Associates, LLC Web
Site
http://www.tedroche.com
Changes to the web site of Ted Roche
& Associates, LLC
en-us
2004-01-07T16:55:48
"http://msdn.microsoft.com/vfoxpro"/"mailto:tedroche@tedroche.com"/"http://www.tedroche.com/ConfGrid#2003"/"http://www.tedroche.com/ConfGrid#2003"New White Papers: VFP and RSSfrom 2003 conferences...]]http://www.tedroche.com/ConfGrid#2003Unknown2004-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 生成 RSSFoxPro textmerge 可以通过以下代码快速而有效地生成 XML,这段代码将生成一个 RSS 2.0 feed:LOCAL lcXML as String, lcContents as String, lcFileNameSTORE SPACE(0) TO lcXML, lcContents#DEFINE CRLF CHR(13)+CHR(10)lcFileName = "trweb.xml"* Read header informationSELECT cTitle as Title, ;cLink as Link, ;mDesc as Description ;FROM trhead ;INTO CURSOR curHead* Read news itemsSelect 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 curItemSET textmerge TO memvar lcXML additiveSET TEXTMERGE ON noshowSCAN\\\\\\ENDSCANSET TEXTMERGE offSET TEXTMERGE to* Generate the heading and channel items and embed* the body withinSet Textmerge To Memvar lcContentsSet Textmerge On Noshow\\RSS generated by--\\\\\\en-us\Copyright\\http://blogs.law.harvard.edu/tech/rss\\60\\\Set Textmerge OffSet Textmerge To* Write it outlcSafety = Set("Safety")Set Safety OffStrtofile(lcContents, lcFileName, 0)Set Safety &lcSafetyFUNCTION 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 stringlcString = 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