当我们的请求返回的结果代码是200时,我们知道 web 交流成功了。内容可能是我们想要的,也可能不是,但是我们有很好的理由相信取回 XML 文档时没有发生错误。
因此,在这种情况下,我们继续处理信息:
if ($http_result->code == 200) { // ... Processing response here... $doc = simplexml_load_string($http_result->data); if ($doc === false) { $msg = "Error parsing bookshelf XML for %url: %msg."; $vars = array('%url'=>$url, '%msg'=>$e->getMessage()); watchdog('goodreads', $msg, $vars, WATCHDOG_WARNING); return t("Getting the bookshelf resulted in an error."); } return _goodreads_block_content($doc, $num_items); // Otherwise we don't have any data } else { // ... Error handling that we just looked at.
在上面的例子中,我们使用了 PHP 5 的 SimpleXML 库。SimpleXML 提供了一套方便易用的工具,用来处理 XML 内容。在已经过气儿的 PHP 4 语言版本中没有这个库。
为了保持与以前的PHP版本兼容,Drupal 代码常常使用 Expat 解析器,一个相当老的基于事件的 XML 解析器,PHP发布的时候就支持这个库。Drupal甚至包扩了一个创建 Expat 解析器的包装函数。但是,编写事件处理函数是很费时的重复性劳动。SimpleXML 给了我们一个易用的接口,需要编写的代码少多了。
使用 Expat 基于事件的方法处理 XML 文档的例子,参见内建的 Aggregator 模块。使用 Expat 的详细文档参见 PHP 官方文档:http://php.net/manual/en/ref.xml.php.
我们将使用 simplexml_load_string() 来解析 XML。如果解析成功,这个函数返回一个 SimpleXML 对象。但是,如果解析失败,它返回 false。
在我们的代码中,检查了 false 的情况。如果发现了,我们记录一条错误并返回一条友好的错误信息。不过,如果 Goodreads XML 文档得到了正确解析,这个函数将调用我们模块中的另一个函数:_goodreads_block_content()。这个函数根据 XML 数据构造一些内容。
评论
发表新评论