欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP 中的 SimpleXML 处理

程序员文章站 2022-03-31 22:23:22
...

了解和 php 版本 5 捆绑到一起的 Simplexml 扩展,它使 PHP 页面能够以 PHP 友好的语法来查询、搜索、修改和重新发布 XML。

PHP 版本 5 引入了 SimpleXML,一种用于读写 XML 的新的应用程序编程接口(API)。在 SimpleXML 中,下面的这样的表达式:

$doc->rss->channel->item->title


  从文档中选择元素。只要熟悉文档的结构,很容易编写这种表达式。但是,如果不很清楚需要的元素出现在何处(比如 Docbook、HTML 和类似的叙述性文档中),SimpleXML 可以使用 XPath 表达式寻找这些元素。

开始使用 SimpleXML

假设需要一个 PHP 页面将 RSS 提要(feed)转化成 HTML。RSS 是一种简单的 XML 格式用于发布连锁内容。文档的根元素是 rss,它包括一个 channel 元素。channel 元素包含关于提要的元数据,如标题、语言和 URL。它还包含各种封装在 item 元素中的报道。每个 item 都有一个 link 元素,包括一个 URL,还有 title 或 description(通常两者都有),包含普通文本。不使用名称空间。RSS 的内容当然不止这些,不过对本文来说知道这些就足够了。清单 1 显示了一个典型的例子,它包含两个新闻项。

清单 1. RSS 提要




Mokka mit Schlag
http://www.elharo.com/blog
en

  Penn Station: Gone but not Forgotten
 
   The old Penn Station in New York was torn down before I was born.
   Looking at these pictures, that feels like a mistake. The current site is
   functional, but no more; really just some office towers and underground
   corridors of no particular interest or beauty. The new Madison Square...
 

  http://www.elharo.com/blog/new-york/2006/07/31/penn-station


  Personal for Elliotte Harold
  Some people use very obnoxious spam filters that require you
   to type some random string in your subject such as E37T to get through.
   Needless to say neither I nor most other people bother to communicate with
   these paranoids. They are grossly overreacting to the spam PRoblem.
   Personally I won't ...

  http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/



我们来开发一个 PHP 页面将 RSS 提要格式化为 HTML。清单 2 显示了这个页面的基本结构。

清单 2. PHP 代码的静态结构




<?php // The title will be read from the RSS ?>

// Here we'll put a loop to include each item's title and description
?>




  解析 XML 文档

第一步是解析 XML 文档并保存到变量中。只需要一行代码,向 simplexml_load_file() 函数传递一个 URL 即可:

$rss = simplexml_load_file('http://partners.userland.com/nytRss/nytHomepage.xml');


  对于这个例子,我已经从 Userland 的 New York Times 提要(在 http://partners.userland.com/nytRss/nytHomepage.xml)填充了页面。当然,也可使用其他 RSS 提要的任何 URL。

要注意,虽然名称为 simplexml_load_file(),该函数实际上解析远程 HTTP URL 上的 XML 文档。但这并不是该函数唯一令人感到奇怪的地方。返回值(这里存储在 $rss 变量中)并没有指向整个文档,如果使用过其他 API 如文档对象模型(DOM)您可能会这样期望。相反,它指向文档的根元素。从 SimpleXML 不能访问文档序言和结语部分的内容。

寻找提要标题

整个提要的标题(不是提要中各报道的标题)位于 rss 根元素 channel 的 title 孩子中。很容易找到这个标题,就仿佛 XML 文档是类 rss 的一个对象的序列化形式,它的 channel 字段本身带有一个 title 字段。使用常规 PHP 对象引用语法,寻找标题的语句如下:

$title = $rss->channel->title;


  找到之后可以将其添加到输出 HTML 中。这样做很简单,只要回显 $title 变量即可:

<?php echo $title; ?>


  这一行输出元素的字符串值而不是整个元素。就是说写入文本内容但不包括标签。

甚至可以完全跳过中间变量 $title:

<?php echo $rss->channel->title; ?>


  因为该页面在多处重用这个值,我发现用一个含义明确的变量来存储会更方便。

……