β

SimpleXML使用xpath

iForget, i write 97 阅读

这几天没心情看论文,于是开始写写摆摊网的代码。摆摊主要做高校二手书籍信息的分享,于是需要从豆瓣上获取图书信息,豆瓣提供了一个完整的xml来描述一本书,例如http://api.douban.com/book/subject/isbn/9787543639136,于是需要处理这个xml来获取相应信息,这里小码哥采用的是直接使用xpath来获取xml文档中相应的信息。摆摊使用了sae,于是使用SimpleXML来处理xml,加上自己还只是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;
    }
}
作者:iForget, i write
iForget (a.k.a Wáng Lè)
原文地址:SimpleXML使用xpath, 感谢原作者分享。

发表评论