22.4 SimpleXML类库
视频讲解:光盘TMlx22SimpleXML类库.exe
PHP对XML格式的文档进行操作有很多方法。如XML语法解析函数、DOMXML函数和SimpleXML函数等。其中,PHP 5新加入的SimpleXML函数操作更简单。本节就使用SimpleXML系列函数来实现对XML文档的读写和浏览。
22.4.1 创建SimpleXML对象
使用SimpleXML首先要创建对象。共有3种方法来创建对象,分别是:
Simplexml_load_file()函数,将指定的文件解析到内存中。
Simplexml_load_string()函数,将创建的字符串解析到内存中。
Simplexml_load_date()函数,将一个使用DOM函数创建的DomDocument对象导入到内存中。
【例22.5】本例使用3个函数分别创建3个对象,并使用print_r来输出3个对象。实例代码如下:(实例位置:光盘TMsl225)
<?php header("Content-Type:text/html; charset=utf-8"); //设置编码 /* 第一种方法 */ $xml_1=simplexml load file("5.xml"); print_r($xml_1); /* 第二种方法 */ $str = <<<XML <? xml version='1.0' encoding='gb2312'?> <Object> <ComputerBook> <title>PHP从入门到精通</title> </ComputerBook> </Object> XML; $xml_2=simplexml load string($str); echo '<p>'; print_r($xml_2); /* 第三种方法 */ $dom = new domDocument(); $dom -> loadXML($str); $xml_3=simplexml import dom($dom); echo '<p>'; print_r($xml_3); ?>
结果为:SimpleXMLElement Object ( [ComputerBook] => SimpleXMLElement Object ( [title] => PHP从入门到精通 ) )
SimpleXMLElement Object ( [ComputerBook] => SimpleXMLElement Object ( [title] => PHP从入门到精通 ) )
SimpleXMLElement Object ( [ComputerBook] => SimpleXMLElement Object ( [title] => PHP从入门到精通 ) )
可以看到,不同数据源的XML只要结构相同,那么输出的结果也是相同的。
注意
第一行中的header()函数设置了HTML编码。虽然在XML文档中设置了编码格式,但只是针对XML文档的,在HTML输出时也要设置编码格式。
22.4.2 遍历所有子元素
创建对象后,就可以使用SimpleXML的其他函数来读取数据。使用SimpleXML对象中的children()函数和foreach循环语句可以遍历所有子节点元素。
【例22.6】本例使用children()函数遍历所有子节点。实例代码如下:(实例位置:光盘TMsl226)
<?php header('Content-Type:text/html; charset=utf-8'); //设置编码 /* 创建XML格式的字符串 */ $str = <<<XML <? xml version='1.0' encoding='gb2312'?> <object> <book> <computerbook>PHP从入门到精通</computerbook> </book> <book> <computerbook>PHP项目开发全程实录</computerbook> </book> </object> XML; /* ************************** */ $xml=simplexml load string($str); //创建一个SimpleXML对象 foreach($xml->children()as$layer_one){ //循环输出根节点 print_r($layer_one); //查看节点结构 echo '<br>'; foreach($layer_one->children()as$layer_two){ //循环输出第二层根节点 print_r($layer_two); //查看节点结构 echo '<br>'; } } ?>
运行结果如图22.2所示。
图22.2 遍历节点
22.4.3 遍历所有属性
SimpleXML不仅可以遍历子元素,还可以遍历元素中的属性,其使用的是SimpleXML对象中的attributes方法,在使用上和children()函数相似。
【例22.7】本例使用attributes方法来遍历所有的元素属性。实例代码如下:(实例位置:光盘TMsl227)
<?php header("Content-Type:text/html; charset=utf-8"); //设置编码 /* 创建XML格式的字符串 */ $str = <<<XML <? xml version='1.0' encoding='gb2312'?> <object name='commodity'> <book type='computerbook'> <bookname name='PHP从入门到精通’/> </book> <book type='historybook'> <booknanme name=’上下五千年’/> </book> </object> XML; $xml=simplexml load string($str); //创建一个SimpleXML对象 foreach($xml->children()as$layer_one){ //循环子节点元素 foreach($layer_one->attributes()as$name=>$vl){ //输出各个节点的属性和值 echo $name.'::'.$vl; } echo '<br>'; foreach($layer_one->children()as$layer_two){ //输出第二层节点元素 foreach($layer_two->attributes()as$nm=>$vl){ //输出各个节点的属性和值 echo $nm."::".$vl; } echo '<br>'; } } ?>
运行结果如图22.3所示。
图22.3 遍历子元素属性
22.4.4 访问特定节点元素和属性
SimpleXML对象除了可以使用上面两个方法来遍历所有的节点元素和属性,还可以访问特定的数据元素。SimpleXML对象可以通过子元素的名称对该子元素赋值,或使用子元素的名称数组来对该子元素的属性赋值。
【例22.8】本例使用SimpleXML对象直接对XML元素和属性进行访问。实例代码如下:(实例位置:光盘TMsl228)
<?php header('Content-Type:text/html; charset=utf-8'); //设置编码 /* 创建XML格式的字符串 */ $str = <<<XML <? xml version='1.0' encoding='gb2312'?> <object name=’商品’> <book> <computerbook>PHP从入门到精通</computerbook> </book> <book> <computerbook name='PHP项目开发全程实录’/> </book> </object> XML; /* ************************** */ $xml=simplexml_load_string($str); //创建SimpleXML对象 echo$xml['name'].'<br>'; //输出根元素的属性name echo$xml->book[0]->computerbook.'<br>'; //输出子元素中computerbook的值 echo$xml->book[1]->computerbook['name'].'<br>'; //输出computerbook的属性值 ?>
运行结果如图22.4所示。
图22.4 访问特定的节点元素和属性
22.4.5 修改XML数据
修改XML数据同读取XML数据类似。如例22.8中,在访问特定元素或属性时,也可以对其进行修改操作。
【例22.9】本例首先读取XML文档,然后输出根元素的属性name,接着修改子元素computerbook,最后输出修改后的值。实例代码如下:(实例位置:光盘TMsl229)
<?php /* 设置编码格式 */ header('Content-Type:text/html; charset=utf-8'); /* 创建XML格式的字符串 */ $str = <<<XML <? xml version='1.0' encoding='gb2312'?> <object name=’商品’> <book> <computerbook type='php入门应用’>PHP从入门到精通</computerbook> </book> </object> XML; /* *************************** */ /* 创建SimpleXML对象 */ $xml = simplexml_load_string($str); /* 输出根目录属性name的值 */ echo $xml['name'].'<br />'; /* 修改子元素computerbook的属性值type */ $xml->book->computerbook['type']=iconv('gb2312', 'utf-8', 'PHP程序员必备工具’); /* 修改子元素computerbook的值 */ $xml->book->computerbook=iconv('gb2312', 'utf-8', 'PHP函数参考大全’); /* 输出修改后的属性和元素值 */ echo $xml->book->computerbook['type'].' => '; echo $xml->book->computerbook; ?>
运行结果如图22.5所示。
图22.5 修改元素和属性值
说明
iconv()函数是转换编码函数。有时,希望向页面或文件写入数据,但添加的数据的编码格式和文件原有编码格式不符,导致输出时出现乱码。这时,使用iconv()函数将数据从输入时所使用的编码转换为另一种编码格式后再输出即可解决问题。本例是将字符串“PHP程序员必备工具”从gb2312的编码格式转换成utf-8编码格式。
22.4.6 保存XML文档
数据在SimpleXML对象中所做的修改,其实是在系统内存中做的改动,而原文档根本没有变化。当关掉网页或清空内存时,数据又会恢复。要保存一个修改过的SimpleXML对象,可以使用asXML方法来实现。该方法可以将SimpleXML对象中的数据格式转化为XML格式,然后再使用file()函数中的写入函数将数据保存到XML文件中。
【例22.10】本例首先从10.xml文档中生成SimpleXML对象,然后对SimpleXML对象中的元素进行修改,最后将修改后的SimpleXML对象再保存到10.xml文档中,实例代码如下:(实例位置:光盘TMsl2210)
//10.xml文档 <? xml version="1.0" encoding="gb2312"?> <object name="商品"> <book> <computerbook type="PHP入门应用">PHP从入门到精通</computerbook> </book> </object> //index.php文件 <?php /* 创建SimpleXML对象 */ $xml = simplexml_load_file('10.xml'); /* 修改XML文档内容 */ $xml->book->computerbook['type'] = iconv('gb2312', 'utf-8', 'PHP程序员必备工具’); $xml->book->computerbook = iconv('gb2312', 'utf-8', 'PHP函数参考大全’); /* 格式化对象$xml */ $modi = $xml->asXML(); /* 将对象保存到10.xml文档中 */ file_put_contents('10.xml', $modi); /* 重新读取10.xml文档 */ $str = file_get_contents('10.xml'); /* 输出修改后的文档内容 */ echo $str; ?>
运行结果如图22.6所示。
图22.6 保存SimpleXML对象
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。