再说 PHP 中 SimpleXML

前一篇帖子使用了 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....

March 22, 2012 · 1 min · Le

SimpleXML使用xpath

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

December 1, 2011 · 1 min · Le

摆摊网页面设计

从泰山回来这几天,抽得空把摆摊网的页面做了出来,包括 css 和 html 的编写等,现在可以从 baitan.sinaapp.com 看到页面效果了,目前兼容 ie8、ff、chrome、safari 等。 baitan001.com 也在备案之中,应该很快就可以使用 baitan001.com 域名访问了。 有同学想练习 js,php 等 web 技术的,不妨联系我,我肯定能让你参与进来! 我是小码哥

November 7, 2011 · 1 min · Le