PHP怎么读写XML?(四种方法)
PHP怎么读写XML?(四种方法)
一、总结
1、这四种方法中,字符串的方式是最原始的方法。SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内存中才能工作,所以当处理大型XML文档的时候,性能会剧减。XMLReader则是属于基于流的解析器,它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互,这种方式效率高,而且占内存少。
二、PHP怎么读写XML?(四种方法)
零、数据及需求说明
PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写、DOMDocument读写、XMLWrite写和XMLReader读、SimpleXML读写,本文将依次对这四种方法进行介绍。
介绍之前首先对本文例子使用的数据和文件进行说明。本文写XML文件的例子都是从MySQL中读取数据然后写入到XML文件中,读XML文件的例子都是从XML文件中读取数据后组装成数组的格式,数组中每个元素对应数据库中的一条记录。
MySQL中的数据:

XML文件:
<?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文件:
<?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文件:
<?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文件:
<?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文件:
<?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文件:
<?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文件:
<?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文件:
<?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文件:
<?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则是属于基于流的解析器,它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互,这种方式效率高,而且占内存少。
三、测试题-简答题
1、php中的preg_match_all函数的作用是什么?
解答:preg_match_all — 执行一个全局正则表达式匹配。
2、php函数中参数中的 string $pattern 在正则相关函数中是什么意思?
解答:pattern是模式的意思,在正则相关函数中表现为正则字符串,也就是正则模式。
3、php中preg_match_all函数最主要的参数有哪几个?
解答:pattern要搜索的模式,字符串形式。 subject输入字符串。matches多维数组,作为输出参数输出所有匹配结果。
4、php中preg_match_all函数是全局匹配么?
解答:是。preg_match_all — 执行一个全局正则表达式匹配。
5、php中的explode函数的作用是什么?
解答:explode — 使用一个字符串分割另一个字符串
6、php中的explode函数的常用参数是什么?
解答:delimiter边界上的分隔字符。string输入的字符串。
7、php中的substr函数的作用是什么?
解答:substr — 返回字符串的子串
8、php中的substr函数如何使用(参数和返回值)?
解答:string substr ( string $string , int $start [, int $length ] )
9、php中正则表达式和js中的正则表达式的区别是什么?
解答:除了没有gim三个配置参数,其它全部相同。preg_match_all("/<".$x.">.*<\/".$x.">/", $con, $temp); 这里有拼接字符串。
10、php中字符串读取xml的方式是什么?
解答:直接用正则把某个标签对应的数据全部弄到一个数组,全部标签对应的数据就变成了二维数据。
11、$pizza = "piece1 piece2 piece3 piece4 piece5 piece6"; $pieces = explode(" ", $pizza); 问$pieces的值是什么?
12、$data = "foo:*:1023:1000::/home/foo:/bin/sh"; list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data); $user的值是什么?
13、$rest = substr("abcdef", -3, 1);的返回值是什么?
14、echo substr('abcdef', 0, 4);的返回值是什么?
PHP怎么读写XML?(四种方法)的更多相关文章
- 解析Xml四种方法
关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath [引言] 目前在Java中用于解析XML的技术很多,主流的有DOM.SAX.JDOM.DOM4j,下文 ...
- java解析XML四种方法
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML. XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便 ...
- Java学习之路:详细解释Java解析XML四种方法
XML如今已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 对于XML本身的语法知识与技术细节,须要阅读相关的技术文献,这里面包含的内容有DO ...
- PHP读写XML文件的四种方法
PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介 ...
- 【Java】详解Java解析XML的四种方法
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. AD: XML现在已经成为一种通用的数据交换格式,它的平台无关性,语 ...
- Java解析XML的四种方法详解 - 转载
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法 在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化 ...
- 使用Spring Security3的四种方法概述
使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过, ...
- IOS中Json解析的四种方法
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验 ...
- 【AS3】Flash与后台数据交换四种方法整理
随着Flash Player 9的普及,AS3编程也越来越多了,所以这次重新整理AS3下几种与后台数据交换方法.1.URLLoader(URLStream)2.FlashRemoting3.XMLSo ...
随机推荐
- jmeter实现分布式压测步骤
环境说明:安装与控制机相同版本的jdk与jmeter 1.修改控制机中的jmeter.properties文件 将<remote_hosts=127.0.0.1>改为<remote_ ...
- 洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery
洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of he ...
- 【Codeforces Round #451 (Div. 2) D】Alarm Clock
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法+二分. 类似滑动窗口. 即左端点为l,右端点为r. 维护a[r]-a[l]+1总是小于等于m的就好. (大于m就右移左端点) ...
- eclipse中导入zico Maven项目
zico源代码地址:https://github.com/jitlogic/zico 简单的说,git上同步的源代码需要先进行maven编译,然后导入eclipse. 如果没有配置好maven,请参考 ...
- String字符串操作--切割,截取,替换,查找,比较,去空格.....
字符串拼接 直接用+号:String a = "I"; String b = "love"; String c = "you";String ...
- HDU 2577 How to Type (线性dp)
How to Type Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Varnish 实战
Varnish 实战项目 目录 实现基于Keepalived+Haproxy+Varnish+LNMP企业级架构 一.环境准备 1.1 相关配置 1.2 安装服务 1.3 关闭防火墙及selinu ...
- 6、修改应用程序数码相框以支持自动关闭LCD
1. 修改数码相框以自动关闭LCD关闭LCD : 在读取触摸屏的函数中判断:如果15S内无数据,执行: echo auto > /sys/devices/platform/mylcd/power ...
- 一次性能优化将filter转换
有一条SQL性能有问题,在运行计划中发现filter.遇到它要小心了,类似于nestloop.我曾经的blog对它有研究探索运行计划中filter的原理.用exists极易引起filter. 优化前: ...
- swift项目第二天:初始化项目
初始化项目 项目的部署版本 之后项目会运行在哪些系统中 横竖屏的支持 iPhone应用一般只支持横屏 iPhone游戏一般支持竖屏 iPad横竖屏都支持 设置项目的图标和启动图片 项目的图标(美工做好 ...