PHP读写XML文件的四种方法
PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写、DOMDocument读写、
XMLWrite写和XMLReader读、SimpleXML读写,本文将依次对这四种方法进行介绍。
介绍之前首先对本文例子使用的数据和文件进行说明。本文写XML文件的例子都是从MySQL中读取数据然后
写入到XML文件中,读XML文件的例子都是从XML文件中读取数据后组装成数组的格式,数组中每个元素对应数
据库中的一条记录。
MySQL中的数据:
XML文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?xml version= "1.0" encoding= "utf8" ?> <studentcareer> <period> <starttime>2000</starttime> <endtime>2002</endtime> <school>培新小学</school> </period> <period> <starttime>2002</starttime> <endtime>2006</endtime> <school>览表东阳学校</school> </period> <period> <starttime>2006</starttime> <endtime>2009</endtime> <school>惠来慈云实验中学</school> </period> <period> <starttime>2009</starttime> <endtime>2012</endtime> <school>惠来一中</school> </period> <period> <starttime>2012</starttime> <endtime>2016</endtime> <school>华南师范大学</school> </period> </studentcareer> |
读取XML文件后组装成的数据格式:
下面的例子使用的数据、文件都是以上所列数据、文件,介绍各个方法时不再赘述,直接贴代码。
一、PHP字符串方式读写XML文件:
1. 字符串方式写XML文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?php /** * function:使用字符串方式写XML文件 * author:JetWu * date:2016.12.03 **/ $mysqli = mysqli_connect( 'localhost' , 'root' , '123456' , 'wjt' ); if (mysqli_connect_errno()) die ( 'database connect fail:' . mysqli_connect_error()); $sql = 'select * from study order by starttime' ; $res = mysqli_query( $mysqli , $sql ); $study = array (); while ( $row = mysqli_fetch_array( $res )) { $study [] = $row ; } //XML标签配置 $xmlTag = array ( 'starttime' , 'endtime' , 'school' ); $str = "<studentcareer>\n" ; foreach ( $study as $v ) { $str .= "\t<period>\n" ; foreach ( $xmlTag as $x ) { $str .= "\t\t<" . $x . ">" . $v [ $x ] . "</" . $x . ">\n" ; } $str .= "\t</period>\n" ; } $str .= '</studentcareer>' ; $file = './write_str.xml' ; file_put_contents ( $file , $str ); |
2. 字符串方式读XML文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?php /** * function:使用字符串方式读XML文件 * author:JetWu * date:2016.12.03 **/ $file = './write_str.xml' ; $con = file_get_contents ( $file ); //XML标签配置 $xmlTag = array ( 'starttime' , 'endtime' , 'school' ); $arr = array (); foreach ( $xmlTag as $x ) { preg_match_all( "/<" . $x . ">.*<\/" . $x . ">/" , $con , $temp ); $arr [] = $temp [0]; } //去除XML标签并组装数据 $data = array (); foreach ( $arr as $key => $value ) { foreach ( $value as $k => $v ) { $a = explode ( $xmlTag [ $key ]. '>' , $v ); $v = substr ( $a [1], 0, strlen ( $a [1])-2); $data [ $k ][ $xmlTag [ $key ]] = $v ; } } echo '<pre>' ; print_r( $data ); |
二、DOMDocument读写XML文件
1. DOMDocument写XML文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<?php /** * function:DOMDocument写XML文件 * author:JetWu * date:2016.12.03 **/ $mysqli = mysqli_connect( 'localhost' , 'root' , '123456' , 'wjt' ); if (mysqli_connect_errno()) die ( 'database connect fail:' . mysqli_connect_error()); $sql = 'select * from study order by starttime' ; $res = mysqli_query( $mysqli , $sql ); $study = array (); while ( $row = mysqli_fetch_array( $res )) { $study [] = $row ; } //XML标签配置 $xmlTag = array ( 'starttime' , 'endtime' , 'school' ); $dom = new DOMDocument( '1.0' , 'utf8' ); $dom ->formatOutput = true; $studentcareer = $dom ->createElement( 'studentcareer' ); $dom ->appendChild( $studentcareer ); foreach ( $study as $s ) { $period = $dom ->createElement( 'period' ); $studentcareer ->appendChild( $period ); foreach ( $xmlTag as $x ) { $element = $dom ->createElement( $x ); $period ->appendChild( $element ); $text = $dom ->createTextNode( $s [ $x ]); $element ->appendChild( $text ); } } $dom ->save( './write_dom.xml' ); |
2. DOMDocument读XML文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php /** * function:DOMDocument读XML文件 * author:JetWu * date:2016.12.03 **/ //XML标签配置 $xmlTag = array ( 'starttime' , 'endtime' , 'school' ); $dom = new DOMDocument(); $dom ->load( './write_dom.xml' ); $periods = $dom ->getElementsByTagName( 'period' ); $study = array (); foreach ( $periods as $k => $p ) { foreach ( $xmlTag as $x ) { $node = $p ->getElementsByTagName( $x ); $study [ $k ][ $x ] = $node ->item(0)->nodeValue; } } echo '<pre>' ; print_r( $study ); |
三、XMLWriter和XMLReader读写XML文件
1. XMLWriter写XML文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<?php /** * function:XMLWriter写XML文件 * author:JetWu * date:2016.12.03 **/ $mysqli = mysqli_connect( 'localhost' , 'root' , '123456' , 'wjt' ); if (mysqli_connect_errno()) die ( 'database connect fail:' . mysqli_connect_error()); $sql = 'select * from study order by starttime' ; $res = mysqli_query( $mysqli , $sql ); $study = array (); while ( $row = mysqli_fetch_array( $res )) { $study [] = $row ; } //XML标签配置 $xmlTag = array ( 'starttime' , 'endtime' , 'school' ); $xml = new XMLWriter(); $xml ->openUri( './write_WR.xml' ); $xml ->setIndentString( ' ' ); //设置缩进格式化使用的符号 $xml ->setIndent(true); $xml ->startDocument( '1.0' , 'utf8' ); $xml ->startElement( 'studentcareer' ); foreach ( $study as $s ) { $xml ->startElement( 'period' ); foreach ( $xmlTag as $x ) { $xml ->startElement( $x ); $xml ->text( $s [ $x ]); $xml ->endElement(); } $xml ->endElement(); } $xml ->endElement(); $xml ->endDocument(); $xml -> flush (); |
2. XMLReader读XML文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?php /** * function:XMLReader读XML文件 * author:JetWu * date:2016.12.03 **/ //XML标签配置 $xmlTag = array ( 'starttime' , 'endtime' , 'school' ); $xml = new XMLReader(); $xml ->open( './write_WR.xml' ); $study = array (); $count = 0; //记录数:方便组装数据 $name = '' ; while ( $xml ->read()) { $n = $xml ->name; if ( $xml ->nodeType == XMLReader::ELEMENT) { if ( $n == 'period' ) { //开始下一条记录的读取 $count ++; } else if (in_array( $n , $xmlTag )) { //记录需要获取文本值的标签名 $name = $n ; } } else if ( $xml ->nodeType == XMLReader::TEXT) { if (in_array( $name , $xmlTag )) { $study [ $count ][ $name ] = $xml ->value; } } } $xml ->close(); echo '<pre>' ; print_r( $study ); |
四、SimpleXML读写XML文件
1. SimpleXML写XML文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?php /** * function:SimpleXML写XML文件 * author:JetWu * date:2016.12.03 **/ $mysqli = mysqli_connect( 'localhost' , 'root' , '123456' , 'wjt' ); if (mysqli_connect_errno()) die ( 'database connect fail:' . mysqli_connect_error()); $sql = 'select * from study order by starttime' ; $res = mysqli_query( $mysqli , $sql ); $study = array (); while ( $row = mysqli_fetch_array( $res )) { $study [] = $row ; } //XML标签配置 $xmlTag = array ( 'starttime' , 'endtime' , 'school' ); $xml = new SimpleXMLElement( '<?xml version="1.0" encoding="UTF-8"?><studentcareer />' ); foreach ( $study as $s ) { $period = $xml ->addChild( 'period' ); foreach ( $xmlTag as $x ) { $period ->addChild( $x , $s [ $x ]); } } $xml ->asXml( './write_sim.xml' ); //输出XML文件(没有格式化) |
2. SimpleXML读XML文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php /** * function:SimpleXML读XML文件 * author:JetWu * date:2016.12.03 **/ //XML标签配置 $xmlTag = array ( 'starttime' , 'endtime' , 'school' ); $study = array (); $xml = simplexml_load_file( './write_sim.xml' ); foreach ( $xml ->children() as $period ) { $study [] = get_object_vars( $period ); //获取对象全部属性,返回数组 } echo '<pre>' ; print_r( $study ); |
总结:这四种方法中,字符串的方式是最原始的方法。SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储
为树的数据结构中,需要把整个文档都加载到内存中才能工作,所以当处理大型XML文档的时候,性能会剧减。XMLReader
则是属于基于流的解析器,它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互,这种
方式效率高,而且占内存少。
PHP读写XML文件的四种方法的更多相关文章
- PHP怎么读写XML?(四种方法)
PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...
- 精----Java读取xml文件的四种方法
xml文件: Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VA ...
- java读取xml文件的四种方法
Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> ...
- java读取XML文件的四种方式
java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...
- [转载]C#读写txt文件的两种方法介绍
C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...
- .net中创建xml文件的两种方法
.net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...
- C#读写txt文件的两种方法介绍
C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...
- C#读写txt文件的两种方法介绍[转]
C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...
- C#读写txt文件的两种方法介绍 v
C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...
随机推荐
- C#ASP.NET 通用扩展函数之 IsWhat 简单好用
好东西都需要人去整理.分类 注意:需要引用命名空间 SyntacticSugar 用法: /***扩展函数名细***/ //[IsInRange] int num = 100; //以前写法 if ( ...
- 阅读《深入理解JavaScript定时机制》
鸟哥的这篇<深入理解JavaScript定时机制>从javascript线程角度分析了setTimeout和setInterval两个定时触发器的实现原理. 看完的体验就是主要要记住两点: ...
- servlet、filter、listener、interceptor之间的区别和联系
一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter: ...
- Silverlight开源项目与第三方控件收集
http://easysl.codeplex.com/ http://compositewpf.codeplex.com/ http://silverlight.codeplex.com/releas ...
- Winform开发框架的重要特性总结
从事Winform开发框架的研究和推广,也做了有几个年头了,从最初的项目雏形到目前各种重要特性的加入完善,是经过了很多项目的总结归纳和升华,有些则是根据客户需要或者应用前景的需要进行的完善,整个Win ...
- 【iOS】编译静态库
与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...
- net 数据库连接详解 相当经典啊
ADO.NET与抽水的故事 ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写.ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一 ...
- 重新想象 Windows 8 Store Apps (66) - 后台任务: 下载和上传
[源码下载] 重新想象 Windows 8 Store Apps (66) - 后台任务: 下载和上传 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台任务 后台 ...
- 页面UI注意事项,你在乎吗?
早上打开微信,看到一篇文章,下面就和大家分享一下,该文章属于前端文章系列,希望做后台开发系统的程序员也可以学习一下,只会写代码把功能实现是第一,接下来也要把界面做做好. 现在的界面风格对于手机而言,一 ...
- Titanium开发环境搭建第三个坑
Nodejs版本的问题 首先,如下引用:http://docs.appcelerator.com/titanium/latest/#!/guide/Installing_Node To run all ...