XML學習筆記–背誦版

Aklman發表於2019-02-16

前言

一直想系統性的學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中的實體字元用法一樣

實體引用 實體字元 含義
&lt < 小於-less than
&gt > 大於-greater than
&amp & 與–ampersand
&apos ` 單引號-apostrophe
&quot 雙引號-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在解析時一共要經歷三個步驟:

  1. 讀取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;

參考資料

W3school
菜鳥教程
XML程式設計與應用教程(第2版)

相關文章