一直想系統性的學XML,就沒時間學,今晚抽出幾個小時時間學完了XML。過幾天再過來看看,背一背應該就差很少,記得東西較多,沒什麼難理解的。php
當咱們看到 XML 標準日新月異的開發進度,以及大批的軟件開發商採用這個標準的突飛猛進的速度時,真的是不由感嘆這真是使人歎爲觀止。html
目前,XML 在 Web 中起到的做用不會亞於一直做爲 Web 基石的 HTML。數據庫
XML 無所不在。XML 是各類應用程序之間進行數據傳輸的最經常使用的工具,而且在信息存儲和描述領域變得愈來愈流行。編程
XML的主要用途有哪些?數組
1.程序之間的數據傳輸通信(能夠是跨語言傳輸)2.配置文件config.xmlless
3.存儲數據,充當小型數據庫函數
優點:工具
規範數據格式,是數據具備結構性,易讀易處理
XML 指可擴展標記語言(eXtensible Markup Language),被設計用來傳輸和存儲數據;XML 須要自行定義標籤,且標籤名稱具備自我描述性;XML 是 W3C 推薦的數據傳輸存放標準。post
XML和HTML的區別?編碼
1.html標籤不能自定義,XML只能自定義標籤。2.html語法要求不嚴格,xml對於語法的要求很是嚴格,標籤必須是閉合的。
3.XML 被設計用來傳輸和存儲數據,其焦點是數據內容;HTML 被設計用來顯示數據,其焦點是數據的外觀呈現。
1.XML 文檔必須有根元素,根元素是全部其餘元素的父元素。
2.XML聲明語句是可選部分,若是存在須要放在文檔的第一行
所謂的文檔聲明就是告訴解析器當前文檔格式、版本號以及編碼格式。
3.全部的 XML 元素都必須是成對閉合標籤;非閉合標籤是非法的,解析器將報錯,不無正常解析.
4.XML 標籤對大小寫敏感,必須頭尾標籤一致。
5.XML標籤不容許有交叉嵌套,也就是父子標籤關係不能交叉嵌套。
6.XML標籤名不要使用特殊字符,儘可能只用數字字母下劃線。
7.XML 中的註釋與HTML中註釋一個語法格式。
8.實體引用 & 特殊字符
在 XML 中,一些字符擁有特殊的意義,若是您把字符 "<" 放在 XML 元素中,會發生錯誤,這是由於解析器會把它看成新元素的開始<age>46 < 100 </age>
這樣會產生 XML 錯誤;爲了不錯誤,要用實體引用來代替特殊字符,格式與HTML中的實體字符用法同樣
實體引用 | 實體字符 | 含義 |
---|---|---|
< | < | 小於-less than |
> | > | 大於-greater than |
& | & | 與--ampersand |
&apos | ' | 單引號-apostrophe |
" | " | 雙引號-quotation mark |
XML 元素中,能夠隨意添加一個或多個屬性,前提是
屬性值必定要用引號(單引號或雙引號)引發來屬性名稱的命名規範與元素的命名規範相同
元素中的屬性是不容許重複的
屬性也是用來存儲數據信息的但實際開發經驗是 在HTML中,屬性用起來很便利,而在 XML 中,應該儘可能避免使用屬性,緣由是
1.一個屬性不能包含多個值(元素能夠)2.屬性值不能是結構化數據(元素能夠)
3.屬性不容易擴展(爲將來的變化)
4.屬性難以閱讀和維護。
總結:將數據放在屬性中和放在子元素中,目的都是爲了傳輸數據,而子元素更加容易被解析,更好維護,更便於引用。
要處理大量特殊字符時,不能再用實體引用來處理了(主要是太麻煩,工做量大)可使用CDATA將數據包裹就能夠按原格式輸出。
格式:
<test><![CDATA[第一題題1:已知 c<4,d>5,問:c和d那個更好看? ]]> </test>
實體引用和CDATA的使用時機:
1.對於內容比較少的狀況,可使用實體引用對特殊字符進行直接替換操做。2.對於內容比較多的狀況,建議採用CDATA區段。
在PHP5版本之後,其提供了一個很是很是強大的類庫,SimpleXML類庫,專門用於實現對XML文檔的解析操做。PHP中使用這個類庫來處理XML數據。
XML在解析時一共要經歷三個步驟:
- 讀取XML文檔到內存
2.造成DOM樹結構(DOM樹能夠簡單理解文檔的父子結構)
3.生成SimpleXML對象
語法:simplexml_load_file('test.xml');
<?xml version="1.0" encoding="UTF-8"?> <user> <man> <name>aklman</name> <age>20</age> <sex>男</sex> </man> <man sex="男"> <name>ak</name> <age>22</age> </man> </user>
$xml=simplexml_load_file('test.xml');//引入文件並讀取 var_dump($xml);//輸出,輸出個格式就是一個對象
1.若是當前讀取的節點是對象就經過->來進行訪問;2.若是當前讀取的節點是數組就經過[]來進行訪問;
1.foreach循環遍歷
$xml=simplexml_load_file('test.html); foreach($xml->man as $v){ echo 'Name:'.$v->name.'Age:'.$v->age.'<br>'; }
2.for循環遍歷
$xml=simplexml_load_file('test.html); $length=count($xml); for($i=0;$i<$length;$i++){ echo $xml->man[$i]->name; }
讀取節點的屬性時XML屬性要加到父節點,PHP才能解析
$xml=simplexml_load_file('test.xml'); echo $xml->man[1]->attributes()->sex; //attributes()方法是用來獲取節點屬性, //內存中節點屬性存放在attributes中,它是一個覺得數組,可使用attributes()方法獲取
$xml=simplexml_load_file('test.html); $man= //建立添加子節點 $man = $xml->addChild('man'); //爲節點添加屬性 $man->addAttribute('sex','女'); //建立添加子節點及節點值 $man->addChild('name','aklman'); $man->addChild('age','23'); var_dump($xml);//打印,已經添加到內存 $xml->asXML('test1.xml');//保存數據進XML文件,沒有文件,則建立;
查詢手機歸屬地案例,數據來源聚合網
<form action="03.5.php" method="get"> <input type="text" name="num"><br> <input type="submit" value="提交"> </form>
//接受前臺提交的數據 $tel = $_GET['num']; //組裝請求地址 $url = 'http://v.juhe.cn/telephone/index?telephoneNumber='.$tel.'&dtype=xml&format=&key=810c3b2c488bc37d5f521196d8799a7211';//地址已經打亂了,須要從聚合網購買 //發送請求並接受返回的數據 $s = file_get_contents($url); // echo $s; //打印返回的XML數據 //使用 simplexml_load_string 函數讀入並解析XML數據 $xml = simplexml_load_string($s); //找到並打印咱們想要的數據 echo '歸屬省:'.$xml->result->place->city111.'<hr>'; echo '歸屬城市:'.$xml->result->place->city.'<hr>';
XPath是一門在 XML 文檔中查找信息的語言,XPath可用來在 XML 文檔中對元素和屬性進行遍歷。
使用注意事項:
1.使用絕對路徑實現數據查詢
$xml = simplexml_load_file('user.xml'); //按節點的絕對路徑查找 $data = $xml->xpath('/user/man/name');//返回數組 foreach($data as $v){ echo $v.'<hr>'; } /* *若是路徑以斜線 / 開始, 那麼該路徑就表示到一個元素的絕對路徑, *絕對路徑實現數據查詢必須一級一級的查詢下去,不能越級。 */
2.使用相對路徑實現數據查詢
$xml = simplexml_load_file('user.xml'); //按節點的相對路徑查找 $data = $xml->xpath('//name');//返回數組 foreach($data as $v){ echo $v.'<hr>'; } /* *若是路徑以雙斜線 // 開頭, 則表示選擇文檔中全部知足雙斜線//以後規則的元素(不管層級關係) */
3.使用*來匹配全部節點
$xml = simplexml_load_file('user.xml'); //匹配man節點下的全部元素節點。 $data = $xml->xpath('//man/*');//返回數組 foreach($data as $v){ echo $v.'<hr>'; }
4.使用[]方括號的形式來實現數據查詢
$xml = simplexml_load_file('user.xml'); //匹配man節點下的最後一個節點。 $data = $xml->xpath('//man[last()]');//返回數組 var_dump($data); echo $data[0]->name; //man[1] : 獲取第一個man元素 //man[last()]:獲取最後一個man元素 //man[age > 200] :獲取age>200的man節點 /* *方塊號裏的表達式能夠進一步的指定元素, 其中數字表示元素在選擇集裏的位置 *默認從1開始,而last()函數則表示選擇集中的最後一個元素,括號內還能夠放置表達式 */
5.使用屬性來獲取元素
$xml = simplexml_load_file('user.xml'); //匹配man節點下含有sex屬性的節點。 $data = $xml->xpath('//man[@sex]');//返回數組 var_dump($data); echo $data[0]->name;