php xml读写操作实现代码
什么是XML?
XML(eXtensible Markup Language)是国际标准化组织的标准通用标记语言SGML的子集。由以下规范组成:
可扩展样式语言(eXtensible Sytle Language , XSL)
XML链接语言(XML Linking Language,包括Xpath、Xlink和Xpointer)
XML名称空间(XML Namespace)
在PHP5之前的版本对XML的处理存在很多的问题,例如XML工具之间只具有简单的关联、每个工具不能一起协同工作等,PHP5中的新XML扩展具有下列特点:
能够像一个整体一样协调工作
是一个标准化的XML库:libxml2
完全遵循W3C规范
更有效地处理数据
是你工作中合适的XML工具
HTML和XML区别与联系?
HTML和XML都是SGML的子集,所以他们有很大的相似性。下面是XML相对于HTML具有的独特性:
可扩展性,用以定义需要的新标记。这对于今天的web是很有意义的
结构,用于表示任意复杂程度的数据。从某种意义上说是一个小型的关系数据库
校验,用以检查数据的结构正确性。通过DTD约束可以达到这一目的。
媒体无关性,以多种格式发布内容。网页、手机显示的wml、其他媒体终端的显示等
厂商和平台中立
数据的表示与内容分离(这是与html本质区别,但现在流行的DIV+CSS设计思路与这种近似)
XML的元素区分大小写
任何元素都需要有结束标记
XML只有一个根元素
属性必须加上引号
一个完整的XML长什么样子?
代码如下 | 复制代码 |
<?xml version="1.0"?> <shows> <show> <name>Simpsons</name> <channel>FOX</channel> <start>8:00 PM</start> <duration>30</duration> </show> <show> <name>Law & Order</name> <channel>NBC</channel> <start>8:00 PM</start> <duration>60</duration> </show> </shows> |
形式良好的XML文档须具备下列特征:
每一个元素有一个开始和结束标记
文档有且只有一个根元素,其他的所有元素都是它的子元素
正确的格式化空元素
标记的大小写匹配
正确的嵌套
属性值必须用引号
实体在引用之前必须声明
实体不能循环指向自身
通过DOM生成XML
代码如下 | 复制代码 |
// 创建一个新的文档$dom = new DOMDocument('1.0'); $trachtenberg = $book->appendChild($dom->createElement('author')); |
// 输出完美格式化的XML文档$dom->formatOutput = true;
echo $dom->saveXML();输出内容如下:
代码如下 | 复制代码 |
<?xml version="1.0"?> <book?> <cover="soft">PHP Cookbook</title> </book> |
用PHP解析已经存在的XML文件
常用有三种方式来解析XML文件
对于简单文件采用SimpleXML
对于复杂的XML文件采用DOM扩展来实现
对于大型XML文件采用XMLReader扩展来实现
XML示例文件如下(address-book.xml):
代码如下 | 复制代码 |
<?xml version="1.0"?> <person id="2"> |
通过SimpleXML方式:
代码如下 | 复制代码 |
$sx = simplexml_load_file('address-book.xml'); foreach ($sx->person as $person) { print "$firstname_text_value $lastname_text_valuen"; |
}通过DOM扩展:
代码如下 | 复制代码 |
$dom = new DOMDocument; foreach ($dom->getElementsByTagname('person') as $person) { $lastname = $person->getElementsByTagname('lastname'); print "$firstname_text_value $lastname_text_valuen"; |
通过XMLReader扩展:
代码如下 | 复制代码 |
$reader = new XMLReader(); while ($reader->read()) { |
用XPath来查询信息http://www.111cn.net
在SimpleXML和DOM扩展中都有XPath
代码如下 | 复制代码 |
//SimpleXml示例 |
//DOM扩展示例
代码如下 | 复制代码 |
$xpath = new DOMXPath($dom); $email = $xpath->query('/address-book/preson/email');验证XML文档是否合法 |
在PHP中,DOM扩展支持基于DTD,XML Schema和RelaxNG的验证,而SimpleXML则只提供了XML Schema验证。
XML内容为UTF-8格式
如果数据来源为其他格式,需要经过编码为UTF-8格式,下面是通过iconv库进行转换的示例
代码如下 | 复制代码 |
$utf_8 = iconv('ISO-8859-1', 'UTF-8', $iso_8859_1); |
表面看到的不一定是真的,file_get_contents或者curl远程抓一下,看其是否是一个有效的XML
特殊字符是会引起simplexml_load_file解析XML失败的,函数会报错
定义和用法
simplexml_load_file() 函数把 XML 文档载入对象中。
如果失败,则返回 false。
语法
simplexml_load_file(file,class,options,ns,is_prefix)参数 描述
file 必需。规定要使用的 XML 文档。
class 可选。规定新对象的 class。
options 可选。规定附加的 Libxml 参数。
ns 可选。
is_prefix 可选。
实例
例子 1. Interpret an XML document
代码如下 | 复制代码 |
<?php if (file_exists('test.xml')) { var_dump($xml); This script will display, on success: SimpleXMLElement Object |
At this point, you can go about using $xml->title and any other elements.
第一家比较诡异,看源代码及IE页面,毛问题没有,函数就是报错。后来想了个办法,file_get_contents一下,发现丫的在XML数据前面和后面分别有一串数字。于是XML无法顺利解析,这个分析起来还好些,而另一个就堪称头疼了。
XML格式如下:
代码如下 | 复制代码 |
<Result value="true" message="Success!"> |
初步分析是由于 里面NickName乱码导致,于是试验另一地址:
代码如下 | 复制代码 |
<Result value="true" message="Success!"> |
毛问题没有,很显然是这个NickName乱码造成的。于是开始了漫长且无奈的沟通,不过人家合作方不认为自己的文件格式有问题
返回类 SimpleXMLElement 的一个对象,该对象的属性包含 XML 文档中的数据。如果失败,则返回 false。
simplexml_load_file解析xml详细实例
xml文档格式如下
代码如下 | 复制代码 |
<?xml version="1.0" encoding="utf-8"?> <list> <company>武汉xxx公司</company> <user> <name>张三</name> <age sex="未知">a</age> <height>1</height> </user> <user> <name>李四</name> <age sex="女">b</age> <height>2</height> </user> <user> <name>王五</name> <age sex="男">c</age> <height>3</height> </user> <town parent="0" id="1">台北</town> <town parent="1" id="2">板桥</town> <town parent="0" id="3">桃园</town> </list> |
php解析代码
*/
代码如下 | 复制代码 |
header("content-type:text/html; charset=utf-8"); //设置编码 echo "<br>循环读取:<br>"; echo "<br>循环读取:<br>"; |
/*
定义和用法
simplexml_load_file() 函数把 xml 文档载入对象中。
如果失败,则返回 false。
语法
simplexml_load_file(file,class,options,ns,is_prefix)参数 描述
file 必需。规定要使用的 xml 文档。
class 可选。规定新对象的 class。
options 可选。规定附加的 libxml 参数。
ns 可选。
is_prefix 可选。
代码如下 | 复制代码 |
<?php |
正则解析
代码如下 | 复制代码 |
<?php $xml = ""; $f = fopen( 'books.xml', 'r' ); while( $data = fread( $f, 4096 ) ) { $xml .= $data; } fclose( $f ); preg_match_all( "//<book/>(.*?)/<//book/>/s", $xml, $bookblocks ); foreach( $bookblocks[1] as $block ) { preg_match_all( "//<author/>(.*?)/<//author/>/", $block, $author ); preg_match_all( "//<title/>(.*?)/<//title/>/", $block, $title ); preg_match_all( "//<publisher/>(.*?)/<//publisher/>/", $block, $publisher ); echo( $title[1][0]." - ".$author[1][0]." - ". $publisher[1][0]."/n" ); } ?> |
books.xml文件如下
代码如下 | 复制代码 |
<books> <book> <author>Jack Herrington</author> <title>PHP Hacks</title> <publisher>O'Reilly</publisher> </book> <book> <author>Jack Herrington</author> <title>Podcasting Hacks</title> <publisher>O'Reilly</publisher> </book> </books> |
下面就给大家举一个小小的例子用parser函数来读取xml数据:
代码如下 | 复制代码 |
<?php
fclose($filehandler);
function characterData($parser_instance, $xml_data) //读取数据时的函数 function endElement($parser_instance, $element_name) //结束标签事件的函数 ?> |
xml文件代码如下:
代码如下 | 复制代码 |
<?xml version="1.0"?> |
parser是php内置的一个用来处理xml的解析器,它的工作由三个事件组成:起始标签、 读取数据、结束标签。
也就是说在对xml进行处理的时候每当遇到起始标签、数据和结束标签的时候函数会做相应的动作来完成对xml数据的转换。
前面的mysql.php 是封装的mysql数据库功能,单例模式,所以取对象是静态方法 mysql::getObject(); 代码很简单代码如下 | 复制代码 |
include 'mysql.php';
$xml->openUri('hello.xml'); // or 'php://output' $xml->setIndentString(' '); // <rss version="2.0"> // for item $xml->endDocument(); |
openUri('') 方法的参数可以是一个文件,那么xml数据就写入到这个文件
或者 php://output 输出到缓冲区,然后 flush方法输出到页面
与大多数流行的 Web 服务如 twitter 通过开放 API 来提供数据一样,它总是能够知道如何解析 API 数据的各种传送格式,包括 JSON,XML 等等。
$json_string='{"id":1,"name":"foo","email":"foo@foobar.com","interest":["wordpress","php教程"]} ';
$obj=json_decode($json_string);
echo $obj->name; //prints foo
echo $obj->interest[1]; //prints php
PHP解析XML 数据
$xml_string="<?xml version='1.0'?>
<users>
<user id='398'>
<name>Foo</name>
<email>foo@bar.com</name>
</user>
<user id='867'>
<name>Foobar</name>
<email>foobar@foo.com</name>
</user>
</users>";
//load the xml string using simplexml
$xml = simplexml_load_string($xml_string);
//loop through the each node of user
foreach ($xml->user as $user)
{
//access attribute
echo $user['id'], ' ';
//subnodes are accessed by -> operator
echo $user->name, ' ';
echo $user->email, '<br />';
}
相关文章
- php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- 本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
- 其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
- 一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
jQuery+slidereveal实现的面板滑动侧边展出效果
我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15- 翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
- 微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
- 该例子使用 BinaryStream 和 BinaryWriter 对二进制文件进行读写操作先上代码再根据我理解的所分享给各位朋友...2020-06-25
SQLMAP结合Meterpreter实现注入渗透返回shell
sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25- 本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24