前言
一直想系統性的學XML,就沒時間學,今晚抽出幾個小時時間學完了XML。過幾天再過來看看,背一背應該就差不多,記得東西較多,沒什麼難理解的。
XML資料傳輸格式
第一章 XML概述
1.1 引入
當我們看到 XML 標準突飛猛進的開發進度,以及大批的軟體開發商採用這個標準的日新月異的速度時,真的是不禁感嘆這真是令人歎為觀止。
目前,XML 在 Web 中起到的作用不會亞於一直作為 Web 基石的 HTML。
XML 無所不在。XML 是各種應用程式之間進行資料傳輸的最常用的工具,並且在資訊儲存和描述領域變得越來越流行。
XML的主要用途有哪些?
1.程式之間的資料傳輸通訊(可以是跨語言傳輸)
2.配置檔案config.xml
3.儲存資料,充當小型資料庫
優勢:
規範資料格式,是資料具有結構性,易讀易處理
1.2 什麼是XML
XML 指可擴充套件標記語言(eXtensible Markup Language),被設計用來傳輸和儲存資料;XML 需要自行定義標籤,且標籤名稱具有自我描述性;XML 是 W3C 推薦的資料傳輸存放標準。
XML和HTML的區別?
1.html標籤不能自定義,XML只能自定義標籤。
2.html語法要求不嚴格,xml對於語法的要求非常嚴格,標籤必須是閉合的。
3.XML 被設計用來傳輸和儲存資料,其焦點是資料內容;HTML 被設計用來顯示資料,其焦點是資料的外觀呈現。
第二章 XML的基本語法
2.1 語法規則
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 |
2.2 元素屬性
XML 元素中,可以隨意新增一個或多個屬性,前提是
屬性值一定要用引號(單引號或雙引號)引起來
屬性名稱的命名規範與元素的命名規範相同
元素中的屬性是不允許重複的
屬性也是用來儲存資料資訊的但實際開發經驗是 在HTML中,屬性用起來很便利,而在 XML 中,應該儘量避免使用屬性,原因是
1.一個屬性不能包含多個值(元素可以)
2.屬性值不能是結構化資料(元素可以)
3.屬性不容易擴充套件(為未來的變化)
4.屬性難以閱讀和維護。
總結:將資料放在屬性中和放在子元素中,目的都是為了傳輸資料,而子元素更加容易被解析,更好維護,更便於引用。
2.3 CDATA
要處理大量特殊字元時,不能再用實體引用來處理了(主要是太麻煩,工作量大)可以使用CDATA將資料包裹就可以按原格式輸出。
格式:
<test><![CDATA[第一題題1:已知 c<4,d>5,問:c和d那個更好看? ]]> </test>
實體引用和CDA他的使用時機:
1.對於內容比較少的情況,可以使用實體引用對特殊字元進行直接替換操作。
2.對於內容比較多的情況,建議採用CDATA區段。
第三章 使用PHP解析XML文件
在PHP5版本以後,其提供了一個非常非常強大的類庫,SimpleXML類庫,專門用於實現對XML文件的解析操作。PHP中使用這個類庫來處理XML資料。
3.1 XML解析原理
XML在解析時一共要經歷三個步驟:
- 讀取XML文件到記憶體
2.形成DOM樹結構(DOM樹可以簡單理解文件的父子結構)
3.生成SimpleXML物件
3.2 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.如果當前讀取的節點是陣列就通過[]來進行訪問;
3.3 遍歷XML資料
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()方法獲取
3.4 使用SImpleXML增加節點
$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檔案,沒有檔案,則建立;
3.5 案例
查詢手機歸屬地案例,資料來源聚合網
<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語言
4.1 概述
XPath是一門在 XML 文件中查詢資訊的語言,XPath可用來在 XML 文件中對元素和屬性進行遍歷。
4.2 使用及語法
使用注意事項:
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;