前一篇帖子使用了 xpath,后来了解到 xpath 的性能可能比较差,而且在遇到有命名空间的时候还有点小麻烦。这里都已豆瓣提供的 API 返回的 xml 为例。豆瓣返回的 xml 不是 rss 格式的,而是 Atom 格式,有很多的命名空间,如果习惯于操作 rss 格式的 xml,那么可以直接把 xml 里面的命名空间的字符串都 replace 掉,这个方法貌似很简单很暴力,就不会遇到命名空间的问题了。

从豆瓣 API 开始,点击这个链接 http://api.douban.com/book/subjects?q=java 你就可以看到 xml 格式,由于返回的是 Atom 格式的 xml,浏览器会自动帮你解析,所以应该这样

# 这样就可以得到一个java.xml文件。
$ wget -O java.xml http://api.douban.com/book/subjects?q=java

这样就可以得到一个 java.xml 文件,接下来使用 SimplePHP 处理这个文件。

首先要创建一个 SimpleXML 对象

//$content为xml的内容
$xml = new SimpleXMLElement($content);

现在要获取 opensearch 命名空间下的 totalResults 节点的文本,代码如下:

$children = $xml->children('http://a9.com/-/spec/opensearchrss/1.0/');
$totalResults = $children->totalResults;

处理所有 xml 文档中所有的 entry 节点

//处理所有找到的记录
$entries = $xml->entry;
foreach($entries as $entry){
//取命名空间下的孩子节点
$entryChildren = $entry->children('http://www.douban.com/xmlns/');
//...
}

好了,这里只是抛砖引玉,其它具体的操作还得参考 SimpleXML 的文档。