要处理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 已经被读入到一个字符串$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 
代码片断 
//成为二维数组,第一维表示节点,第二维表示属性 
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 对象 
//1、从DOM 对象中构造 
//$dom = new DOMDocument(); 
//$dom->loadXML("<rows></rows>"); 
//$xml = simplexml_import_dom($dom); 
//2、从仅包含根标签的xml 文件中构造 
//$xml = simplexml_load_file('messages.xml'); 
//3、直接写根标签字符串构造 
//$xml = simplexml_load_string("<Messages></Messages>"); 
//4、使用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'); 
?> 

上述代码唯一值得一提的地方就是标志①的那行。当我们要向一个SimpleXML 对象中新 
增一个节点或属性时,必须保证它的父节点是存在的,否则会报一个致命错误,提示信息是: 
Objects used as arrays in post/pre increment/decrement must return values by reference。希望大家

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

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

**PHP SimpleXML 使用详细例子的更多相关文章

  1. SimpleXML 使用详细例子

    要处理XML 文件,有两种传统的处理思路:SAX 和DOM.SAX 基于事件触发机制, 对XML 文件进行一次扫描,完成要进行的处理:DOM 则将整个XML 文件构造为一棵DOM 树,通过对DOM 树 ...

  2. ThinkPHP 自动创建数据、自动验证、自动完成详细例子介绍(十九)

    原文:ThinkPHP 自动创建数据.自动验证.自动完成详细例子介绍(十九) 1:自动创建数据 //$name=$_POST['name']; //$password=$_POST['password ...

  3. 批处理bat脚本编写(附详细例子)

                                                        批处理bat脚本编写(附详细例子) 由于在项目开发的过程中经常需要编写bat脚本,而看大牛们编写 ...

  4. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

  5. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...

  6. Duboo整合SpringBoot超级详细例子(附源码)

    dubbo3.0整合SpringBoot例子 dubbo新版本(3.0以上)在相对于 dubbo 旧版本(2.5.2.6.2.7),有很多的不相同的地方. 官方文档也说了新版本的特性: https:/ ...

  7. Linux crontab 命令格式与详细例子

    基本格式 :* * * * * command分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示第2列表示小时1-23(0表示0点)第3列表示日期1-31第4列表示月份1-1 ...

  8. [转]Oracle中使用Rownum分页详细例子

    原文地址:http://www.jb51.net/article/52272.htm 在MySQL中,我们通常都使用limit来完成数据集获取的分页操作,而在Oracle数据库中,并没有类似limit ...

  9. Linux crontab定时执行任务 命令格式与详细例子

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

随机推荐

  1. P4887 第十四分块(前体) 莫队

    题意: 给你一个序列,每次询问l,r问多少个a[i]^a[j]有k个1,k固定. 序列长度1e5,a[i]<=2^14 时限1s,空间40M 题解: 个人其实开始没什么思路,看了题解也好久,题解 ...

  2. python基础之模块之sys模块

    sys模块的功能 sys是python中较为常用的一个模块,他提供了对python脚本运行时的环境的操作. sys功能: 1  sys.argv     #将python脚本运行时的脚本名以及参数作为 ...

  3. day1 java基础语法

    一.关键字:java关键字有:abstract boolean break byte case catch char class const continue default do double el ...

  4. Shell记录-Shell命令(磁盘)

    inux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式 df [选项] [文件] Shell ...

  5. Java并发编程原理与实战十二:深入理解volatile原理与使用

    volatile:称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的. 可见:一个线程修改了这个变量的值,在另一个线程中能够读取到这个修改后的值. synchronized除了线程之间互 ...

  6. Java并发编程原理与实战九:synchronized的原理与使用

    一.理论层面 内置锁与互斥锁 修饰普通方法.修饰静态方法.修饰代码块 package com.roocon.thread.t3; public class Sequence { private sta ...

  7. JavaScript - Scope of variables

    It's important to note, especially if you have come to JavaScript from another language, that variab ...

  8. 从github上下载一个csv文件

    when u open the raw file(i.e. csv) on github, then point to RAW button, then right click the mouse, ...

  9. 关于node的setTimeout的延时最大限制

    node的setTimeout有最大值限制,最大值为2^31-1.一旦超过了最大值,其效果就跟延时值为0的情况一样,也就是马上执行.chrome测试并未发现该问题,解决方案如下,重写setTimeou ...

  10. [转载]浅析为什么char类型的范围是 —128~+127

    http://blog.csdn.net/daiyutage/article/details/8575248 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写, ...