XML數據格式
XML: 可擴展的標記語言(用戶自定義的標記語言)
用途:數據跨平臺的存儲,傳輸,共享的;在不同的語言之間也可以通信
XML基本語法格式:
文件擴展名必須以.xml結束(.html)
xml中第一個標簽叫文檔標簽
<?xml version=”1.0” encoding=”utf-8”?>
Version:xml版本是1.0
Encoding:xml文檔編碼
xml中所有的標簽都是用戶自定義的,且區分大小寫
<div></DIV> != <DIV></DIV> <div></div> <hr/><br/>
xml中所有的標簽都是成對出現了,有開始,必須有結束,除非中間沒有內容,可以使用單標簽來代替 <br/> <hr/>
<student></student> = <student/>
xml文件中有且只有一個最大的根節點。
xml中嵌套必須合理,且每一個節點有且只有 一個直接的父級節點。
<div><p></p></div> <student><age></age></studetn>
xml中的空格保留,不能隨便亂打空格。
<div></div> <p></p > #這裏p後面多個空格系統就無法識別了#
xml中的屬性必須使用單引號和雙引號括起來。
<font size="2"></font>
XML用途:
RSS訂閱/xml訂閱 - 基本不用了
百度地圖(百度標簽定義) .xml
第三方平臺api接口的提交和返回值, xml格式的數據和json格式
Thinksite
Student
Sid sname addr age
1001 tom UK 30
1002 lily USA 25
【Student.xml】
<?xml version="1.0" encoding="utf-8"?> <thinksite> <student> <stu> <sid>1001</sid> <sname>tom</sname> <addr>UK</addr> <age>30</age> </stu> <stu> <sid>1002</sid> <sname>lily</sname> <addr>USA</addr> <age>25</age> </stu> </student> </thinksite>
XML生成:
字符串的鏈接:
【sutdent.php】
<?php $dsn = "mysql:host=localhost;dbname=thinkshop"; $user= "root"; $pwd = "123456"; try{ $pdo = new PDO($dsn,$user,$pwd); }catch(PDOException $e){ echo $e -> getMessage(); } $pdo -> exec("set names utf8"); $sql = "select * from marks"; $result = $pdo -> query($sql); $result -> setFetchMode(PDO::FETCH_ASSOC); $data = $result-> fetchAll(); $xml = "<?xml version=‘1.0‘ encoding=‘utf-8‘?>"; $xml .= "<thinkshop>"; $xml .= "<marks>"; foreach($data as $key=>$vo){ $xml .= "<records>"; foreach($vo as $k=> $v) $xml .= "<{$k}>".$v."</$k>"; $xml .= "</records>"; } $xml .= "</marks>"; $xml .= "</thinkshop>"; $fp = fopen("markxml.xml","w"); fwrite($fp,$xml); fclose($fp);
DOM生成:
$dom = new DOMDocument(版本號, 編碼)
$dom -> createElement("創建元素節點");
$dom -> createTextNode("創建文本節點");
$dom節點對象 -> setAttribute("屬性名","值");
節點 -> appendChild(子節點) 將子節點,追加到節點上
Save(文件名): 將domxml對象保存成某個文件
Savexml():使用dom生成xml內容的字符串
【marks.php】
<?php $dsn = "mysql:host=localhost;dbname=thinkshop"; $user= "root"; $pwd = ""; try{ $pdo = new PDO($dsn,$user,$pwd); }catch(PDOException $e){ echo $e -> getMessage(); } $pdo -> exec("set names utf8"); $sql = "select * from marks"; $result = $pdo -> query($sql); $result -> setFetchMode(PDO::FETCH_ASSOC); $data = $result-> fetchAll(); $dom = new DomDocument("1.0","utf-8"); $root = $dom -> createElement("thinkshop"); $dom -> appendChild($root); $marks = $dom -> createElement("marks"); $root -> appendChild($marks); foreach($data as $vo){ $records = $dom -> createElement("records"); $marks->appendChild($records); foreach($vo as $k=>$v){ $nodes = $dom -> createElement($k); $nodes -> setAttribute("name","s"); $records -> appendChild($nodes); $nodes_text = $dom -> createTextNode($v); $nodes -> appendChild($nodes_text); } } $dom -> save("domxml.xml"); ?>
<a href="./domxml.xml">xml訂閱</a>
XML的發布:
就是在外部網站中使用a鏈接,將需要發布的xml文件,做a鏈接指向就行。
XML的解析: 將xml文件解析成網頁或者得到需要的數據格式。
simplexml解析: php內置的一個xml解析擴展類庫(默認開啟了)
children(): 返回某個simplexml節點對象的所有子節點對象。
simplexml_load_stirng(xml內容字符串): 將xml字符串轉換成simplexml節點對象
【marks1.php】
<?php $dsn = "mysql:host=localhost;dbname=thinkshop"; $user= "root"; $pwd = ""; try{ $pdo = new PDO($dsn,$user,$pwd); }catch(PDOException $e){ echo $e -> getMessage(); } $pdo -> exec("set names utf8"); $sql = "select * from marks"; $result = $pdo -> query($sql); $result -> setFetchMode(PDO::FETCH_ASSOC); $data = $result-> fetchAll(); $xml = "<?xml version=‘1.0‘ encoding=‘utf-8‘?>"; $xml .= "<thinkshop>"; $xml .= "<marks>"; foreach($data as $key=>$vo){ $xml .= "<records>"; foreach($vo as $k=> $v) $xml .= "<{$k}>".$v."</$k>"; $xml .= "</records>"; } $xml .= "</marks>"; $xml .= "</thinkshop>"; // 就是將xml內容取出具體的數據信息,這種操作就是xml解析. $simple = simplexml_load_string($xml); foreach($simple ->children() as $vo){ foreach($vo ->children() as $v){ echo $v -> mid."/".$v->sid."/".$v->cid."/".$v->mark; echo "<hr/>"; } }
Simplexml_load_file(文件路徑+文件名): 將xml文件讀取轉換成simplexml節點對象
【marks2.php】
<?php $file = "domxml.xml"; // 就是將xml內容取出具體的數據信息,這種操作就是xml解析. $simple = simplexml_load_file($file); foreach($simple ->children() as $vo){ foreach($vo ->children() as $v){ echo $v -> mid."/".$v->sid."/".$v->cid."/".$v->mark; echo "<hr/>"; } } ?>
Simplexml_import_dom(): 將DOM對象DOM節點對象轉換成simplexml節點對象。
【marks3.php】
<?php $dsn = "mysql:host=localhost;dbname=thinkshop"; $user= "root"; $pwd = ""; try{ $pdo = new PDO($dsn,$user,$pwd); }catch(PDOException $e){ echo $e -> getMessage(); } $pdo -> exec("set names utf8"); $sql = "select * from marks"; $result = $pdo -> query($sql); $result -> setFetchMode(PDO::FETCH_ASSOC); $data = $result-> fetchAll(); $dom = new DomDocument("1.0","utf-8"); $root = $dom -> createElement("thinkshop"); $dom -> appendChild($root); $marks = $dom -> createElement("marks"); $root -> appendChild($marks); foreach($data as $key=>$vo){ $records = $dom -> createElement("records"); $marks->appendChild($records); foreach($vo as $k=>$v){ $nodes = $dom -> createElement($k); $nodes -> setAttribute("name","s"); $records -> appendChild($nodes); $nodes_text = $dom -> createTextNode($v); $nodes -> appendChild($nodes_text); } } // 就是將xml內容取出具體的數據信息,這種操作就是xml解析. $simple = simplexml_import_dom($dom); foreach($simple ->children() as $vo){ foreach($vo ->children() as $v){ echo $v -> mid."/".$v->sid."/".$v->cid."/".$v->mark; echo "<hr/>"; } } ?>
DOM解析: PHP內置的一個使用DOM解析xml的擴展類庫
創建DOM對象:
$dom = new DomDocument();
$dom -> load(“文件/字符串”): 將xml文件或者是字符串加載成dom對象
$root = $dom -> documentElement
遍歷內部所有節點
childNodes:返回的是某個節點下的所有的子節點
getAttribute();
NodeType
Nodevalue
xml層級比較多,遍歷時很麻煩,這個時候再simplexml中提供了xpath定位,在dom中有getElementByTagName() 方法。
【dom.php】
<?php $file = "domxml.xml"; $dom = new DomDocument(); $dom -> load($file); $root = $dom -> documentElement; foreach($root->childNodes as $vo){ foreach($vo->childNodes as $v){ foreach($v->childNodes as $v1){ if($v1 -> nodeType ==1){ echo $v1 -> nodeValue; } echo "<hr/>"; } } } // 層級太多,使用xpath $objs = $dom -> getElementsByTagName("records"); foreach($objs as $vo){ foreach($vo -> childNodes as $v){ if($v -> nodeType ==1){ echo $v -> nodeValue; } } } ?>
css解析:就是使用css,將xml內容解析成需要的網頁樣式(XSL)。
<?xml-stylesheet type="text/css" href="cssfile"?> 使用標簽選擇器比較多。
xmlreader(xmlwriter):PHP內置的一個xml解析擴展類庫
Simplexml和dom都是將xml內容一次性讀入內存中進行解析。缺點就是如果文件很大,那麽浪費資源很嚴重,且速度很慢。
Xmlreader可以邊加載,邊讀取xml內容,對於大文件xml解析是一種較好的解決方法.
創建xmlreader對象。
$reader = new XmlReader();
打開xml文件
$reader -> open(“xml文件”);
讀取xml內容
$reader -> read();從xml文件一個個的挨著讀取內容,每讀取一條內容就跳轉到下一條,直到沒有內容,就會報出false錯誤。(php文件按行讀取)
nodeType:返回的是節點類型
xmlReader::ELEMENT 元素節點
xmlReader::TEXT 文本節點
Name: 返回某個節點的標簽名
Value: 返回某個節點的文本內容
expand():讀取一個節點轉變為dom節點對象
XML數據格式