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則是屬於基於流的解析器,它不會一次把整個文檔加載到內存中,而是每次分別讀取其中的一個節點並允許實時與之交互,這種方式效率高,而且占內存少。