这几天没心情看论文,于是开始写写摆摊网的代码。摆摊主要做高校二手书籍信息的分享,于是需要从豆瓣上获取图书信息,豆瓣提供了一个完整的 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;
}
}