php下使用SimpleXML 处理XML 文件
程序员文章站
2022-03-29 17:52:58
1 simplexml 简介 要处理xml 文件,有两种传统的处理思路:sax 和dom。sax 基于事件触发机制, 对xml 文件进行一次扫描,完成要进行的处理;dom...
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 的代码出来。
要处理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 使用expat方式解析xml文件操作示例
-
PHP使用xmllint命令处理xml与html的方法
-
PHP中使用SimpleXML检查XML文件结构实例
-
PHP中使用DOMDocument来处理HTML、XML文档的示例
-
PHP之自定义会话控制---使用文件处理
-
ASP.NET下使用xml反序列化、缓存依赖实现个性化配置文件的实时生效
-
php下使用SimpleXML 处理XML 文件
-
使用PHP DOM-XML创建和解析XML文件
-
PHP使用XMLWriter读写xml文件操作详解
-
Android开发使用XML文件定义ImageView的在selected为true和false状态下显示不同的图像