SimpleXML 使用详细例子

要处理XML
文件,有三种守旧的拍卖思路:SAX 和DOM。SAX 基于事件触发机制, 
对XML 文件进行一次扫描,实现要开始展览的拍卖;DOM 则将整个XML
文件构造为一棵DOM 
树,通过对DOM 树的遍历实现处理。那二种办法各有利害,SAX
的处理思路绝对抽象, 
DOM 的处理进程相对繁琐,都不很吻合新手的入门。 
PHP5 推出了一套新的XML 处理函数,即SimpleXML。名如其实,SimpleXML
本人小 
巧精干,只提供了少量的几个章程函数,但用它处理起XML
文件成效却十分强大,操作也 
那些的大约。 
首先,它提供有差不离的函数能够从XML 文书档案、字符串、或DOM
对象上直接组织出 
SimpleXMLElement 对象;其次,SimpleXMLElement
提供有简要的法子能够展开质量、子节 
点、和XPath 的操作;但是,SimpleXML
最简便易行的地方是,它提供有利用正式对象的习性和 
对象迭代器实行节点操作的方式,这一处理思路使得用PHP 对XML
文书档案的拍卖获得了一点都不小 
的简化。 
2 SimpleXML 入门示例 
上边大家经过有个别小的代码片段,稍微通晓一下SimpleXML
的兵不血刃和简单。为举例方便, 
我们采纳二个Messages.xml 文件,里面富含这样一段XML 代码: 
Messages.xml 

复制代码代码如下:

<?xml version=’1.0′ standalone=’yes’?> 
<Messages> 
<msg id=’1′> 
<title>This is Title</title> 
<content>Here is Content</content> 
<time>2008-03-20 21:50:23</time> 
<reply id=’11’>reply 1</reply> 
<reply id=’12’>reply 2</reply> 
</msg> 
</Messages> 

那是一篇保存有留言新闻的XML
文书档案,每条音讯包含属性id,子节点title、content、time 
以及若干条对于它的过来新闻,每条回复包涵属性id 及回复的情节。 
用SimpleXML 处理并出口此XML 文书档案内容的经过以及艺术如下。 
(1) 构造SimpleXMLElement 对象 

代码片断 
$xml = simplexml_load_file(‘Messages.xml’); 
比方那段xml 已经被读入到2个字符串$messages 中,则足以使用如下语句: 
代码片断 
$xml = simplexml_load_string(‘Messages.xml’); 
(2)输出留言1 的标题 
代码片断 
//能够使用品质的艺术访问子节点,通过节点的标签名可直接获取节点的情节 
echo $xml->msg->title; 
(3)输出留言1 的率先条回复音讯 
代码片断 
//同级其余多少个同名节点自动变成数组,能够通过索引下标访问其内容 
echo $xml->msg->reply[0]; 
(4)输出留言的id 
代码片断 
//节点的性质与值棉被服装进成为事关数组的键与值 
echo $xml->msg[‘id’]; 
(5)输出第壹条回复的id 
代码片断 
//成为二维数组,第③维表示节点,第1维表示属性 
echo $xml->msg->reply[1][ ‘id’]; 
(6)依次输出全部回复的id 
代码片断 
//使用foreach 对同名节点开始展览遍历 
foreach ($xml->msg->reply as $reply){ 
echo $reply[‘id’]; 

(7)使用XPath 检索全体的回涨音讯 
代码片断 
//xpath 方法直接搜索定位(//表示任意深度) 
foreach ($xml->xpath(‘//reply’) as $reply){ 
echo $reply.'<br>’; 

(8)遍历留言1 享有的子节点 
代码片断 
//children 方法取得全体子节点 
foreach ($xml->msg->children() as $field){ 
echo $field.'<br>’; 

(9)重新设置留言1 的宣布时间 
代码片断 
//间接设置属性 
$xml->msg->time = ‘2008-03-21 00:53:12’; 
(10)设置回复2 的id 属性 
代码片断 
//设置管理数组的值 
$xml->msg->reply[1][‘id’] = ‘222’; 
(11)新增一个描述音讯作者的字段 
代码片断 
//直接设置属性 
$xml->msg->author = ‘zhangsan’; 
(12)将音信的撰稿中国人民保险公司存为属性 
代码片断 
//设置关联数组的key 
$xml->msg[‘author’] = ‘zhangsan’; 
(13)重新保存对象到文件 
代码片断 
//保存 
$xml->asXML(‘MessagesNew.xml’); 
应当能够见到SimpleXML 有多不难了吧! 
3 实例:XML 文件与数据库之间实行数量交互 
上边提供二个周旋完好的实例,将留言新闻从MySQL
数据库中查询出来,保存成为一 
个如上例所示的XML 文件。留言消息和死灰复燃消息独立保存在两张表中,使用MySQL
函数包 
能够万分不难地促成如下: 

代码如下: 

复制代码代码如下:

<?php 
//cong work atWed Mar 20 19:59:04 CST 2008 
//将数据从MySQL 数据库中保存到XML 文件中 
//可以应用如下两种办法协会开头的SimpleXMLElement 对象 
//① 、从DOM 对象中结构 
//$dom = new DOMDocument(); 
//$dom->loadXML(“<rows></rows>”); 
//$xml = simplexml_import_dom($dom); 
//贰 、从仅包涵根标签的xml 文件中构造 
//$xml = simplexml_load_file(‘messages.xml’); 
//三 、直接写根标签字符串构造 
//$xml =
simplexml_load_string(“<Messages></Messages>”); 
//④ 、使用SimpleXMLElement 类的布局器构造 
$xml = new SimpleXMLElement(‘<Messages></Messages>’); 
//连接数据库 
mysql_connect(‘localhost’,’root’,’root’); 
mysql_select_db(‘test’); 
mysql_query(‘set names utf8’); 
//查询新闻 
$rs = mysql_query(“select * from messages”); 
$i = 0; //用做多条新闻的数组索引下标 
while($row = mysql_fetch_assoc($rs)){ 
$xml->message[$i] = ”; //… … … … … … … … … … … … ① 
$xml->message[$i][‘id’] = $row[‘id’]; 
$xml->message[$i]->title = $row[‘title’]; 
$xml->message[$i]->content = $row[‘content’]; 
$xml->message[$i]->time = $row[‘time’]; 
//依照新闻id 查询它相关的上升消息 
$rsReply = mysql_query(“select * from replies where
mid={$row[‘id’]}”); 
$j = 0; //用于做多条回复的目录下标 
while($rowReply = mysql_fetch_assoc($rsReply)){ 
$xml->message[$i]->reply[$j] = $rowReply[‘reply’]; 
$xml->message[$i]->reply[$j][‘id’] = $rowReply[‘id’]; 
$j++; 

$i++; 

$xml->asXML(‘messages.xml’); 
?> 

上述代码唯一值得说的地方就是注脚①的那行。当大家要向2个SimpleXML
对象中新 
增一个节点或品质时,必须确定保障它的父节点是存在的,不然会报三个沉重错误,提醒音讯是: 
Objects used as arrays in post/pre increment/decrement must return
values by reference。希望大家

无须被那段不知所云的提示所迷惑。相信读者能通过对上述代码的问询,对等地写出一个从XML文件到MySQL
的代码出来。

 

转自http://www.jb51.net/article/22265.htm 

相关文章