级别: 初级 Colin Beckingham, 研究员, 自由职业者
2009 年 9 月 07 日 有时,Web 开发人员被要求向两种或更多不同受众提供数据服务 — 受众之一获得完整的信息包,其他受众获得整个包的选定摘录。了解如何设计 Web 页面,使普通受众能以 HTML 方式阅读页面,又能使另外的受众以 XML 方式阅读同一页面而获取数据。
问题
市场调查发现,有时公布的信息要面向两种或更多独立受众。特别是一种受众期望利用现代浏览器技术所能提供的所有附加功能,而另一种受众只需要特定纯粹的事实。
 |
常用缩写词
- Ajax:异步 JavaScript 和 XML(Asynchronous JavaScript + XML)
- CSS:层叠样式表(Cascading Style Sheet)
- HTML:超文本标记语言(Hypertext Markup Language)
- SQL:结构化查询语言(Structured Query Language)
- XML:可扩展标记语言(Extensible Markup Language)
|
|
方法
一个构造巧妙的紧密 XHTML 页面能同时服务两种受众。两种受众都能通过浏览器获取数据。然而,浏览器将忠实地尝试遵循所有支持文档,例如图像和 CSS 指导,运行 JavaScript 等等。这种方法不易于自动化,会浪费资源 — 特别在拨号连接时。
如果 HTML 代码完整而且结构良好,它就能由 XML 解析器作为 XML 读取。忽略 <DOCTYPE ...> 声明,根元素就成为了 <html>...</html> 元素。当数据项在 HTML 代码中可正确识别,而且拥有不会使 HTML 标记无效的适当属性时,XML 解析器就能提取之,不会让浏览器产生额外操作。
示例
假设您是一个户外游泳池的程序员。市场调查显示,您必须使两种受众 —— 固定游客和当地卫生部门 —— 知悉当前状况。
首先以游泳者为例。特别在春季,通告当前游泳池水温很关键,可确保当池水过冷而不能满足其要求的时候,固定顾客和潜在顾客不会前来。您希望受众看到的内容很多,包括营业时间、入场费、要遵守的规章和安全制度,以及关于卫生政策严厉程度的信息等等,而水温信息只是其中之一。作为一名程序员,您还希望向顾客显示儿童在池中享受快乐时光的照片(背景音效为泼水声和欢叫),以及家长留言 —— 他们会评论孩子们是否受到完善的监管。使用 Adobe® Flash® 显示一些信息,而由 JavaScript 例程或者一些按钮控件 Ajax 例程来控制其他部分 — 这些都受到了广泛受众的赞赏。
于是,您拥有了定期刷新当前数据的 Web 页面。清单 1 提供了 HTML 格式的基本 Web 页面,采用了缩进以辅助阅读各种元素。
清单 1. 游泳池页面
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' >
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
<meta http-equiv='Content-type' content='text/html;charset=UTF-8' />
<title>Main Street Pool</title>
<script language='JavaScript'
src='xxxxx.js' type='text/javascript' ></script>
<link rel='stylesheet' type='text/css' href='style.css' />
</head>
<body onload='play_splashing();' background='thepool.png' bgcolor='#rrggbb' >
<div id='main' style='display: block' >
<p>Welcome<img src='pool2.png' alt='Picture of pool' /></p>
<p>Comments from parents</p>
<p>Safety at the Pool</p>
<p>Our hygiene policy</p>
</div>
<div id='data'>
<p>Our current readings are:
Water Temperature</p>
<div id='watertemp' style='display: inline'>77.7</div>
<p>Chlorine Level</p>
<div id='waterchlr' style='display: inline'>0.08</div>
</div>
</body>
</html>
|
这是一个非常简单的页面,产生的输出如清单 2 所示。
清单 2. 游泳池页面的输出
Welcome (Picture of pool)
Comments from parents
Safety at the Pool
Our hygiene policy
Our current readings are: Water Temperature
77.7
Chlorine Level
0.08
|
该页面缺失了多个部分,例如 CSS 和 JavaScript 文件的源代码,包括 play_splashing() 函数和 PNG 图像文件。这些参考仅是简单地显示了浏览器要自动下载和处理的项目,这增加了额外操作。
第一种受众得到了满足;用户能够随时获知水温。下面研究第二种受众。
使用 XML 检索数据
当地卫生部门维护其关系区域中所有游泳池的最新记录和历史数据。卫生部门要求您提供水温和氯含量读数。该部门只要求这些 — 无需图片、无需 JavaScript,只需两条数据。而该部门还需要使其数据库中的数据检索连同其他设施的读数一同自动化。
清单 3 提供了一组简短的 PHP 指令以提取所需数据。
清单 3. 用于检索信息的 PHP 代码
<?php
// extract values from an HTML file using XML
$cont = file_get_contents('mytest.html'); // line 1
$bline = strpos($cont,"<html"); // line 2
$cont2 = substr($cont,$bline-1); // line 3
$xml = simplexml_load_string($cont2); // line 4
echo $xml->head->title."\n"; // line 5
foreach ($xml->body->div[1]->div as $mydiv) {
echo $mydiv['id']." ".$mydiv."\n"; // line 6
}
?>
|
清单 3 中的代码作用很多。逐行说明,第 1 行从服务器以文本形式抽出页面。第 2 行在文本中找到根元素的起始位置,允许第 3 行剪辑 <DOCTYPE...> 信息,此信息在 XML 上下文中不相关。注意,在目标搜索字符串的末尾没有大于 (>) 符号,因为在原始文档中,html 元素中可能有附加属性。搜索 <html> 将不会生成任何结果。第 4 行将文档载入一个 XML 解析器中。第 5 行报告页面的标题 — 在本例中,用于鉴别游泳池。第 6 行加入一个检查数据的循环。在本例中,它只是简单地向屏幕发送回报告,但第 6 行也可以容易地成为一条在数据库中存储数据的 SQL insert 语句。
为 <div>...</div> 部分使用例如 id 等属性,可将 Main 和 Data 部分分开、将水温和氯含量分开,这可帮助卫生单位的程序员检查正确读数是否进入相关数据库字段。清单 4 显示了 PHP 检索代码的输出。
清单 4. 清单 3 中 PHP 代码的输出
Main Street Pool
watertemp 77.7
waterchlr 0.08
|
清单 3 中的代码十分简单,因为它默认了许多内容。它假定 HTML 结构良好、能作为 XML 阅读,游泳池的名称将正确上报,Data 部分将被识别,所有 id='...' 属性将就位。如果这些因素中有任一缺失或误置,那么浏览器将智能地解决问题。然而,XML 解析器将因错误而停止。XML 将十分欢迎如 myid 等属性,而不是 id 属性,但这将完全使 HTML 代码无效,所以我们期望 XML 使用的属性应当是标准的 HTML 属性。
一些问题
我们很容易认为:因为用户可阅读数据(在本例中使用 XML),所以其他页面或其他站点也能用相同方式处理。但事实并非如此。
在示例中,程序员和两种受众之间有明确或默认的约定。程序员特别留意确保代码完整,以及必要的属性就位。满足了这些要求,两种目标受众就都可获得上下文相关的信息,流程按照期望运行,因此节省了各方的时间和精力。阅读其他没有适当约定的站点,可能会实际违反使用协议的条款或条件。要阅读特定的公共可用信息,会有明示或暗示的要求,即用户应当使用浏览器阅读信息,从而看到为内容付款的广告。
实际上,一些站点使用了明显的不完整、不一致的 HTML 代码。浏览器可能要进行额外工作来显示该页面,但这样做是成功的。XML 解码失败是因为其要求更加严格。可能发布者希望强迫用户只使用特定浏览器来阅读页面。
结束语
利用 XML 检查紧密 XHTML 代码可促使从 Web 页面快速提取数据、减少工作量和下载负担、消除重复并提高信息检索的准确性。
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | Colin Beckingham 居住在加拿大安大略省东部,是一名自由研究员、撰稿人和程序员。他拥有金斯顿市皇后大学
以及温莎大学的学位,在银行业、园艺、赛马、教育、公共服务、零售和旅游/观光等广泛领域都有涉猎。他是数据库应用程序编写者,也是大量报纸、杂志和在线文章的撰稿人,他的研究兴趣包括 Linux 上的开源编程以及语音控制应用程序。 |
对本文的评价
|