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 的代码出来。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容