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数组,然后输出 ...
随机推荐
- rsync同步Nginx日志遇到问题总结
一.目的 将nginx 日志通过普通用户利用rsync公钥认证的方式实时同步到本地服务器上,之后使用elk程序进行处理. 二.遇到问题及解决方法思路 问题1.文件权限:nginx 的日志默认权限如下: ...
- java抽象类和接口区别
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- SQL Server里Grouping Sets的威力
在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务 ...
- maven异常解决:编码GBK的不可映射字符
直接将项目改为UTF-8编码,无效!要通过修改pom.xml文件,告诉maven这个项目使用UTF-8来编译. 一.问题描述 今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的 ...
- thread_Exchanger数据交换
Exchanger 是一个同步辅助类,用于两个并发线程之间在一个同步点进行数据交换. 允许两个线程在某一个点进行数据交换. 可以视作双向的同步队列: 可应用于基因算法.流水线设计等场景 Exchan ...
- [CLR via C#]14. 字符、字符串和文本处理
一.字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构(一个值类型) 的一个实例.System ...
- DOM LOAD测试笔记
DOM时间:1823ms LOAD时间:4912ms COMP时间:5427ms 1585 4757 5650 1859 3487 3910 1600 4648 5099 1610 4428 4878 ...
- 1、Flat UI Getting started(文档翻译)
下载链接:http://www.bootcss.com/p/flat-ui/ 一.什么是Flat UI? Flat UI 是一种漂亮的Boostrap主题.我们重新设计了它的很多组件,使得其看起来扁平 ...
- sass开发过程中遇到的几个坑
1.安装sass被墙的问题 安装完`ruby`后,打开`ruby cmd` 输入`gem install sass`,安装失败,有可能是镜像源的问题,也有可能是墙的问题. 因为公司内网的奇葩限制,各种 ...
- win10应用部署到手机出现问题Exception from HRESULT: 0x80073CFD
今天把应用部署到手机上时,出现了这样的问题 Exception from HRESULT: 0x80073CFD 具体错误是: Error Error : DEP0001 : Unexpected E ...