php下使用SimpleXML 处理XML 文件


Posted in PHP onFebruary 27, 2010

1 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 已经被读入到一个字符串$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 的代码出来。

PHP 相关文章推荐
PHP实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
ajax 的post方法实例(带循环)
Jul 04 PHP
PHP数据库链接类(PDO+Access)实例分享
Dec 05 PHP
初识php MVC
Sep 10 PHP
php导出CSV抽象类实例
Sep 24 PHP
PHP中require和include路径问题详解
Dec 25 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
Apr 14 PHP
php去除二维数组的重复项方法
Nov 03 PHP
配置Nginx+PHP的正确思路与过程
May 10 PHP
ThinkPHP中create()方法自动验证表单信息
Apr 28 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 #PHP
基于pear auth实现登录验证
Feb 26 #PHP
php str_pad() 将字符串填充成指定长度的字符串
Feb 23 #PHP
php 用checkbox一次性删除多条记录的方法
Feb 23 #PHP
PHP实现域名whois查询的代码(数据源万网、新网)
Feb 22 #PHP
PHP 伪静态隐藏传递参数名的四种方法
Feb 22 #PHP
收藏的PHP常用函数 推荐收藏保存
Feb 21 #PHP
You might like
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
2021/03/02 Javascript
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
Python实现GIF图倒放
2020/07/16 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
清华大学自主招生自荐信
2014/01/29 职场文书
安全教育感言
2014/03/04 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python
MySQL中日期型单行函数代码详解
2021/06/21 MySQL