+ -
当前位置:首页 → 问答吧 → 第八章 PHP 5中处理XML

第八章 PHP 5中处理XML

时间:2008-01-18

来源:互联网

记号 中午细读一下

作者: 习明   发布时间: 2008-01-18

终于出来,等了好久了

作者: jfcat   发布时间: 2008-01-18

8.4  SimpleXML
SimpleXML扩展,在PHP 5中默认开启,是处理XML最简单的方法。你不需要记住负责的DOM API,只需要通过数据结构的形式访问XML。这里是它的4个简单的规则:
1. 属性表示元素的迭代器。
2. 数字索引表示元素。
3. 非数字索引表示属性。
4. 允许用字符串转换访问TEXT数据。
通过使用这4个规则,你可以访问XML文件中所有的数据。

8.4.1  创建一个SimpleXML对象 Creating a SimpleXML Object
你可以用3种方法中的任意一种创建一个SimpleXML对象,就像在这个例子中显示的一样:
复制PHP内容到剪贴板
PHP代码:

<?php
$sx1 = simplexml_load_file('example.xml');
$string = <<<XML
<?xml version='1.0'?>
<html xmlns="[url=http://www.w3.org/1999/xhtml]http://www.w3.org/1999/xhtml[/url]" xml:lang="en" lang="en">
<head>
<title>XML Example</title>
</head>
<body background="bg.png">
<p>
Moved to <a href="[url=http://example.org/]http://example.org/">example.org<a[/url]>.
</p>
<pre>
foo
</pre>
<p>
Moved to <a href="[url=http://example.org/]http://example.org/">example.org</a[/url]>.
</p>
</body>
</html>
XML;
$sx2 = simplexml_load_string($string);
$sx3 = simplexml_load_dom(new DomDocument());
?>

在这第一种方法中,simplexml_load_file()打开指定文件并且把它解析到内存中。在第二种方法中,创建$string并把它传递到simplexml_load_string()函数中。第三种方法,simplexml_load_dom()导入一个用PHP中的DOM函数创建的DomDocument对象。在所有3种情况中,PHP都返回一个SimpleXML对象。SimpleXML扩展中simplexml_load_dom()函数有一个在DOM扩展中的兄弟函数,叫dom_import_simplexml()。这些相关的函数可以让你在两个扩展中共享相同的XML结构。例如,你可以用SimpleXML修改简单的文档并且用DOM处理更加复杂的类型。

8.4.2  浏览SimpleXML对象 Browsing SimpleXML Objects
第一个规则是“属性表示元素的迭代器”,它表示你可以循环所有在<body>中的<p>标记,例如:
复制PHP内容到剪贴板
PHP代码:

<?php
foreach ($sx2->body->p as $p) {
}
?>

第二个规则描述“数字索引表示元素”,它意味着你可以如此访问第二个<p>标签
复制PHP内容到剪贴板
PHP代码:

<?php
$sx->body->p[1];
?>

第三个规则是“非数字索引表示属性”,它意味着你可以如此访问body标记的背景标签
复制PHP内容到剪贴板
PHP代码:

<?php
echo $sx->body['background'];
?>

最后一个规则,“允许用字符串转化访问TEXT数据”,意味着你可以从元素中访问所有的文本数据。通过下面的代码,我们可以把第二个<p>标记的内容输出(也就是结合规则2和4):
复制PHP内容到剪贴板
PHP代码:

<?php
echo $sx->body->p[1];
?>

但是,输出并不显示Moved to example.org.。实际情况是,它输出Moved to.。就像你能看到的,从一个节点访问TEXT数据将不会包含子节点。你可以使用asXML()方法来包含子节点,但是这还会把所有的文本都加进来。可以使用strip_tags()来防止将所有文本加进来。下面的例子将输出Moved to example.org:
复制PHP内容到剪贴板
PHP代码:

<?php
echo strip_tags($sx->body->p[1]->asXML()) . "\n";
?>

如果你想遍历body节点所有的子元素,使用SimpleXML 元素对象的children()方法。下面的例子遍历了body节点所有的子元素:
复制PHP内容到剪贴板
PHP代码:

<?php
foreach ($sx->body->children() as $element) {
/* 对该元素进行一些操作 */
}
?>

如果你想遍历一个元素所有的属性,attributes()方法适合你。让我们遍历第一个<a>标记的属性。
复制PHP内容到剪贴板
PHP代码:

<?php
foreach ($sx->body->p[0]->a->attributes() as $attribute) {
echo $attribute . "\n";
}
?>

8.4.3  保存 SimpleXML 对象  Storing SimpleXML Objects
你可以保存一个修改的或者处理过的结构或者一个子节点到硬盘中。可以使用asXML()方法来实现,它可以让你在任何一个SimpleXML对象中调用:
复制PHP内容到剪贴板
PHP代码:

<?php
file_put_contents('filename.xml', $sx2->asXML());
?>

8.5  PEAR
有些情况下,刚才所有的技术都不适合。例如,没有DOM XML扩展支持,或者你可能需要解析一些非常特殊的内容并且不想自己创建一个解析器。PEAR包含了可以处理有关解析XML的类,它们可能是有用的。我们将介绍其中的两种:XML_Tree和XML_RSS。XML_Tree可以用在没有DOM XML扩展支持时通过结构树搭建XML文档,或者在你不需要许多特性的情况下快速搭建一个文档时。XML_RSS可以解析RSS文件。RSS文件是用来描述最新条目的XML文档(例如)一个新闻站点。

8.5.1  XML_Tree
用XML_Tree创建一个XML文档是非常简单的,并且可以在没有DOM XML扩展支持的情况下实现。你可以通过在你的命令行界面中键入pear install XML_Tree来安装这个PEAR类。为了显示XML_Trees和“正常”的DOM XML方法之间的区别,我们将再次搭建相同的X(HT)ML 文档。
复制PHP内容到剪贴板
PHP代码:

<?php
require_once 'XML/Tree.php';
/* 创建文档和根节点 */
$dom = new XML_Tree;
$html =& $dom->addRoot('html', '',
array (
'xmlns' => 'http://www.w3.org/1999/xhtml',
'xml:lang' => 'en',
'lang' => 'en'
)
);
/* 创建head和title元素 */
$head =& $html->addChild('head');
$title =& $head->addChild('title', 'XML Example');
/* 创建body和p元素 */
$body =& $html->addChild('body', '', array ('background' =>
&#10149;'bg.png'));
$p =& $body->addChild('p');
/* 增加"Moved to" */
$p->addChild(NULL, "Moved to ");
/* 增加a元素 */
$p->addChild('a', 'example.org', array ('href' =>
&#10149;'http://example.org'));
/* 增加"."、br和"foo & bar" */
$p->addChild(NULL, ".");
$p->addChild('br');
$p->addChild(NULL, "foo & bar");
/* 输出显示的内容 */
$dom->dump();
?>

就像你能够看到的,用XML_Tree增加一个拥有属性和(简单)内容的元素是非常简单的。例如,观察下面代码行,它增加一个元素到p元素中:
引用:
$p->addChild('a', 'example.org', array ('href' =>'http://example.org'));
代替原来的4个方法调用,你可以只用一行代码来增加元素。当然,DOM XML扩展比XML_Tree拥有更多的特性,但是对于简单的任务来说,我们推荐使用这个卓越的PEAR类。

8.5.2  XML_RSS
RSS(RDF Site Summary,Really Simple Syndication)源是XML的一个常用应用。RSS是一个XML词汇表,用来描述新闻条目,并且这些新闻条目可以被集成(或者叫做内容聚合)到你自己的Web站点中。PHP.net有一个包含最近新闻条目的RSS源,地址是http://www.php.net/news.rss。你可以在http://web.resource.org/rss/1.0/spec中找到RSS规范的全部规则,但是查看一个例子会更好些。下面是我们即将解析的RSS文件的一部分:
复制PHP内容到剪贴板
PHP代码:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns:rdf="[url=http://www.w3.org/1999/02/22-rdf-syntax-ns]http://www.w3.org/1999/02/22-rdf-syntax-ns[/url]#"
xmlns="[url=http://purl.org/rss/1.0/]http://purl.org/rss/1.0/[/url]"
xmlns:dc="[url=http://purl.org/dc/elements/1.1/]http://purl.org/dc/elements/1.1/[/url]"
>
<channel rdf:about="[url=http://www.php.net/]http://www.php.net/[/url]">
<title>PHP: Hypertext Preprocessor</title>
<link>[url]http://www.php.net/&lt[/url];/link>
<description>The PHP scripting language web site</description>
<items>
<rdf:Seq>
<rdf:li rdf:resource="[url=http://qa.php.net/]http://qa.php.net/[/url]" />
<rdf:li rdf:resource="[url=http://php.net/downloads.php]http://php.net/downloads.php[/url]" />
</rdf:Seq>
</items>
</channel>
<!-- RSS-Items -->
<item rdf:about="[url=http://qa.php.net/]http://qa.php.net/[/url]">
<title>PHP 4.3.5RC1 released!</title>
<link>[url]http://qa.php.net/&lt[/url];/link>
<description>PHP 4.3.5RC1 has been released for testing. This is the first release candidate and should have a very low number of problems and/or bugs. Nevertheless, please download and test it as much as possible on real-life applications to uncover any remaining issues. List of changes can be found in the NEWS file.</description>
 
<dc:date>2004-01-12</dc:date>
</item>
<item rdf:about="[url=http://www.php.net/downloads.php]http://www.php.net/downloads.php[/url]">
<title>PHP 5.0 Beta 3 released!</title>
<link>[url]http://www.php.net/downloads.php&lt[/url];/link>
<description>PHP 5.0 Beta 3 has been released. The third beta of PHP is also scheduled to be the last one (barring unexpectedsurprises). This beta incorporates dozens of bug fixes since Beta 2, better XML support and many other improvements, some of which are documented in the ChangeLog. Some of the key features of PHP 5 include: PHP 5 features the Zend Engine 2. XML support has been completely redone in PHP 5, all extensions are now focused ound the excellent libxml2 library ([url=http://www.xmlsoft.org/]http://www.xmlsoft.org/[/url]). SQLite has been bundled with PHP. For more information on SQLite, please visit their website. A new SimpleXML extension for easily accessing and manipulating XML as PHP objects. It can also interface with the DOM extension and vice-versa. Streams have been greatly improved, including the ability to access low-level socket operations on streams.<description><dc:date>2003-12-21<dc:date>
</item>
<!-- / RSS-Items PHP/RSS -->
</rdf:RDF>
这个RSS文件包含了两部分内容:头信息,描述内容聚合来源的站点,并包含一个可用条目的列表。第二个部分包含了新闻条目。我们不希望在每次用户访问页面时再从http://php.net重新获取RSS文件然后显示这个信息。所以,将增加一些缓冲。每天下载一次该文件就已经足够了,因为新闻顶多一天更新一次(这是针对php.net,其他站点可能使用不同的策略)。
我们将使用通过pear install XML_RSS安装的PEAR::XML_RSS类。下面是该脚本:
复制PHP内容到剪贴板
PHP代码:

<?php
require_once "XML/RSS.php";
$cache_file = "/tmp/php.net.rss";
首先,就跟刚才显示的一样,我们包含该PEAR类并且定义缓存文件的路径:
if (!file_exists($cache_file) ||
(filemtime($cache_file) < time() - 86400))
{
copy("[url=http://www.php.net/news.rss]http://www.php.net/news.rss[/url]", $cache_file);
}
 
接下来,我们检查文件是否已经被缓存并且缓冲的文件是否过期(一天是86 400秒)。如果文件不存在或者已经过期,我们将从php.net下载一个新的RSS文件并且把它存在缓冲文件当中:
$r =& new XML_RSS($cache_file);
$r->parse();
把XML_RSS类实例化以便解析RSS文件,然后调用parse()方法。这个方法将把RSS文件解析到一个数据结构中并可以让别的方法读取,例如getChannelInfo()将返回一个包含标题、描述和Web站点链接的数据,如下所示:
array(3) {
["title"]=>
string(27) "PHP: Hypertext Preprocessor"
["link"]=>
string(19) "[url=http://www.php.net/]http://www.php.net/[/url]"
["description"]=>
string(35) "The PHP scripting language web site"
}
getItems()返回的是新闻条目的标题、描述和链接。在下面的代码中,我们使用getItems()方法来遍历所有的条目并显示出来:
[php]foreach ($r->getItems() as $value) {
echo strtoupper($value['title']). "\n";
echo wordwrap($value['description']). "\n";
echo "\t{$value['link']}\n\n";
}
?>

当你运行这个脚本的时候,将看到它从RSS文件中输出新闻条目:
PHP 4.3.5RC1 RELEASED!
PHP 4.3.5RC1 has been released for testing. This is the first release
candidate and should have a very low number of problems and/or bugs.
Nevertheless, please download and test it as much as possible on real-life
applications to uncover any remaining issues. List of changes can be found
in the NEWS file.
http://qa.php.net/

PHP 5.0 BETA 3 RELEASED!
PHP 5.0 Beta 3 has been released. The third beta of PHP is also
scheduled to be the last one (barring unexpected surprises). This
beta incorporates dozens of bug fixes since Beta 2, better XML
support and many other improvements, some of which are documented in
the ChangeLog. Some of the key features of PHP 5 include: PHP 5
features the Zend Engine 2. XML support has been completely redone in
PHP 5, all extensions are now focused around the excellent libxml2
library (http://www.xmlsoft.org/). SQLite has been bundled with PHP.
For more information on SQLite, please visit their website. A new
SimpleXML extension for easily accessing and manipulating XML as PHP
objects. It can also interface with the DOM extension and vice-versa.
Streams have been greatly improved, including the ability to access
low-level socket operations on streams.
http://www.php.net/downloads.php

作者: PHPChina   发布时间: 2008-01-18

这章有东西学了。

作者: eclanp   发布时间: 2008-01-19


慢慢看~`

作者: 125231896   发布时间: 2008-01-20

大家踊跃发言啊~

作者: luzhou   发布时间: 2008-01-20

哈哈  又有新内容了  今天在西单图书大厦看了下,总台感觉很不错

作者: blankyao   发布时间: 2008-01-21

已得了一本就不在写评论留给没有得的朋友,大家发看发想发评!

作者: gvtbs   发布时间: 2008-01-21

期待啊!前几周都被落选了,希望这次有机会。

作者: whchao001   发布时间: 2008-01-25

已在当当买了~~

作者: wwwjyw8   发布时间: 2008-01-31

大家加油啊咯!!!

作者: luzhou   发布时间: 2008-01-31

对 php的扩展,比较实用,内容还是比较难。不过也算是最新的技术的。
支持。粗略的看了下

作者: liangjiao   发布时间: 2008-02-01

似乎好像不错

作者: taohui   发布时间: 2008-02-29

热门下载

更多