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的值是什么?
解答:一個一維數組,值依次為piece1 等。12、$data?=?"foo:*:1023:1000::/home/foo:/bin/sh"; list($user,?$pass,?$uid,?$gid,?$gecos,?$home,?$shell)?=?explode(":",?$data); $user的值是什么?
解答:echo?$user;?//?foo;? echo?$pass;?//?*13、$rest?=?substr("abcdef",?-3,?1);的返回值是什么?
解答:返回?"d"14、echo?substr('abcdef',?0,?4);的返回值是什么?
解答:abcd?
轉載于:https://www.cnblogs.com/Renyi-Fan/p/9112945.html
總結
以上是生活随笔為你收集整理的PHP怎么读写XML?(四种方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python函数默认参数陷阱
- 下一篇: PHP学习记录(字符串函数)