这几天没心情看论文,于是开始写写摆摊网的代码。摆摊主要做高校二手书籍信息的分享,于是需要从豆瓣上获取图书信息,豆瓣提供了一个完整的 xml 来描述一本书,例如http://api.douban.com/book/subject/isbn/9787543639136,于是需要处理这个 xml 来获取相应信息,这里小码哥采用的是直接使用 xpath 来获取 xml 文档中相应的信息。摆摊使用了 sae,于是使用 SimpleXML 来处理 xml,加上自己还只是 PHP 的初学者,于是出现了一些问题。

这里是一些学习资料:

  • xpath:http://www.w3school.com.cn/xpath/
  • simplexml:http://cn2.php.net/manual/en/simplexmlelement.xpath.php

新建 SimpleXMLElement 对象,xml 文件内容在$content 中

$bookFromDouban = new SimpleXMLElement($content);

直接查询,在命名空间 db 下的所有 attribute,且有 name 属性,以下 xpath 查询是没有问题的,

$result = $bookFromDouban->xpath("//db:attribute[@name]");

但是,这条查询就有问题了,如下,

$result = $bookFromDouban->xpath("//link[@rel='self']|//link[@rel='image']");

上面的代码表示在默认的命名空间里面查询 link 节点,但是在 php 5.0 以上却不能查出数据。需要这样操作

//获取这个xml的所有的命名空间
$namespaces = $bookFromDouban->getNamespaces();
//注册默认的命名空间为'd'
$bookFromDouban->registerXPathNamespace('d', $namespaces['']);
//现在这个查询就ok了
$result = $bookFromDouban->xpath("//d:link[@rel='self']|//d:link[@rel='image']");

对$result 遍历就简单了,这里也给出一个简单的例子,遍历完,变量就初始化了。PS:代码写的不优雅,欢迎拍砖。

translator = array();
$author = array();
$i = $j = 0;
foreach($result as $item)
{
    foreach($item->attributes() as $val)
    {
        $val = str_replace('-','_',$val);
        if($val == 'author')
        {
            $author[$i++] = ''.$item;
        }
        else if($val == 'translator')
            translator[$j++] = ''.$item;
        else
            $$val = $item;
    }
}