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则是属于基于流的解析器,它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互,这种方式效率高,而且占内存少。