一、XML起源和目的
- XML 是 Extensible Markup Language 的縮寫,即可擴展標記語言。它是一種用來創建的標記的標記語言。1996 年,萬維網協會(或者叫 W3C,http://www.w3c.org)開始設計一種可擴展的標記語言,1998 年 2 月,XML1.0 成爲了 W3C 的推薦標準
- 使用 XML 標記語言可以做到數據或數據結構在任何編程語言環境下的共享。例如我們在某個計算機平臺上用某種編程語言編寫了一些數據或數據結構,然後用 XML 標記語言進行處理,那樣的話,其他人就可以在其他的計算機平臺上來訪問這些數據或數據結構,甚至可以用其他的編程語言來操作這些數據或數據結構了。這就是XML標記語言作爲一種數據交換語言存在的價值
二、XML與HTML的區別
- XML 和 HTML 都是用於操作數據或數據結構,在結構上大致是相同的,但它們在本質上卻存在着明顯的區別,它們的區別主要有以下幾點:
- 1. 語法要求不同:
- 在HTML中不區分大小寫,在XML中對大小寫要求非常嚴格
- XML中必須要有結束標籤(必須成對),HTML可以沒有結束標籤
- 2. 標記不同:HTML使用固有的標記,而XML沒有固有標記(下面會有介紹)
- 3. 作用不同:HTML用於顯示頁面,而XML用於描述頁面內容的數據或數據的結構。HTML把數據和顯示合在一起,在頁面中把這些數據顯示出來,而XML則將數據和顯示分開
- 1. 語法要求不同:
三、XML的優勢
- 每種語言的產生都能完成某些特定的功能,XML 作爲一種標記語言也不例外。XML最大的優勢在於它能對各種編程語言編寫的數據進行管理,使得在任何平臺下都能通過解析器來讀取 XML 數據
- 它的優勢可歸納爲以下幾點:
- 1. 數據的搜索:在 XML 中可以提取文檔中任何位置的數據
- 2. 數據的顯示:XML 將數據的結構和數據的顯示形式分開,根據需要使數據呈現出多種顯示方式。如 HTML、PDF 等格式
- 3. 數據的交換: XML 標記語言的語法非常簡單,可以通過解析器在任何機器上解讀。並可以在各種計算機平臺上使用。逐漸成爲一種數據交換的語言
四、XML的使用場景
- 隨着 json、protobuf 等協議的繼續推出和發展,目前 XML 大多用於本地化場景。主要是 xml 相對於 json 格式,數據冗餘度大,解析速度也比不上 json、protobuf 等協議
文件配置
- 比如Android的應用配置文件:
- 比如Java中的pom.xml應用配置文件:
- 比如tomcat中的server.xml應用配置文件:
界面配置
- Android和QT都是用XML來配置界面
- 比如下面是QT的界面配置:
- 比如下面是Android的界面配置:
遊戲配置
- 像遊戲中的關卡,英雄等級,裝備之類,顯示框大小,顏色之類等
五、XML文檔的組成
- XML 文檔也屬於純文本文件,該文檔一般如下四部分組成:
- 1. XML 文檔的聲明(可選的)
- 2. XML 文檔類型定義(可選的)
- 3. XML 文檔註釋(可選的)
- 4. XML 標識及其內容(主體)
演示案例
- 下面是一個XML文件
<?xml version="1.0" encoding="UTF-8"?> <?xml:stylesheet type="text/xsl"href="stu.xsl"?> <!--XML 文檔註釋: 班級中學生的信息--> <class> <student> <name>Jone</name> <age>20</age> </student> </class>
六、XML的基本語法
- XML 的語法規則既簡單又嚴格,非常容易學習,在使用過程中只需認真仔細,沒有多大困難
- 一般 XML 的語法規則大致可歸納爲以下幾點:
- 1. 結束標記不可忽略:在 HTML 中某個標記有起始標記,卻可以沒有結束標記, 但在 XML 文檔中卻不可以
- 2. 區分大小寫:在 XML 中嚴格區分大小寫,主要表現在開始標記和結束標記的大小寫必須相同。還包括文檔的聲明部分和文檔類型定義部分的大小寫區分
- 3. 正確的嵌套包含
- 有很多的XML語法檢測/在線格式化工具,例如:https://tool.oschina.net/codeformat/xml/
註釋
- 在 XML 中編寫註釋的語法與 HTML 的語法很相似:
<!-- This is a comment -->
所有XML元素都必須有關閉標籤
- 在 XML 中,省略關閉標籤是非法的。所有元素都必須有關閉標籤
<p>This is a paragraph</p> <p>This is another paragraph</p>
元素/標籤
- 元素是 XML 文檔的重要組成部分,在 XML 文檔中必須存在元素
- XML 文檔的元素一般是由標記頭、標記末和標記間的字符串數據構成,如下代碼所示:
- XML 文檔中的第一個元素被稱爲根元素,在任何一個 XML 文檔中有且只有一個元素被稱爲根元素。其餘所有的元素都是子元素,子元素必須正確的嵌套在根元素中
- 標記間的字符串數據就是該元素的值。在XML中,如果元素的值中存在空格,那麼這些空格將按原樣解析出來
XML標籤大小寫敏感
- XML 元素使用 XML 標籤進行定義
- XML 標籤對大小寫敏感。在 XML 中,標籤<Letter>與標籤<letter>是不同的
- 必須使用相同的大小寫來編寫打開標籤和關閉標籤
必須正確地嵌套
- 在 XML 中,所有元素都必須彼此正確地嵌套:
<b><i>This text is bold and italic</i></b>
- 在上例中,正確嵌套的意思是:由於元素是在 元素內打開的,那麼它必 須在元素內關閉。
實體
- 有些字符具有特殊的意義,例如小於號“<”和大於號“>”,因此不能在xml直接使用,需要使用實體來代替
- 預定義實體表如下所示:
- 實體在 XML 文檔中的一般引用格式如下:
&實體名;
- 例如:
<?xml version="1.0" encoding="UTF-8"?> <test> <test1> 1 < 2</test1> </test>
屬性
- 屬性是用來修飾某個元素的。如:
- 關於元素的屬性需注意如下幾個問題:
- 屬性的值必須用引號括起來,如: attribute1=“aa” 或 attribute3=‘aa'
- 元素的屬性以名和值成對出現
- 用來修飾同一個元素的屬性的屬性名不能相同
- 屬性值不能包含“&”、“’”、“<”等字符
XML樹結構
- XML 文檔形成了一種樹結構,它從“根部”開始,然後擴展到“枝葉”
- 一個 XML 文檔實例,XML 使用了簡單的具有自我描述性的語法:
- 第一行是 XML 聲明。它定義 XML 的版本(1.0)和所使用的編碼(utf-8)
- 下一行描述文檔的根元素<note>。接下來 4 行描述根的 4 個子元素(to、from、heading、body)
- 最後一行定義根元素的結尾</note>
<?xml version="1.0" encoding="utf-8"?> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
- XML樹結構語法如下:
- XML文檔必須包含根元素。該元素是所有其他元素的父元素
- XML 文檔中的元素形成了一棵文檔樹。這棵樹從根部開始,並擴展到樹的最底端。所有元素均可擁有子元素
- 父、子以及同胞等術語用於描述元素之間的關係。父元素擁有子元素。相同層級上的子元素成爲同胞(兄弟或姐妹)
- 所有元素均可擁有文本內容和屬性
<root> <child> <subchild>.....</subchild> </child> </root>
- 實例:
七、XML的元素
什麼是XML元素
- XML 元素指的是從(且包括)開始標籤直到(且包括)結束標籤的部分
- 元素可包含其他元素、文本或者兩者的混合物。元素也可以擁有屬性
- 例如在下面的例子中:
- <bookstore>和<book>都擁有元素內容,因爲它們包含了其他元素。 只有文本內容,因爲它僅包含文本
- 只有<book>元素擁有屬性 (category="CHILDREN")
<bookstore> <book category="CHILDREN"> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore>
元素命名規則
- XML 元素必須遵循以下命名規則:
- 名稱可以含字母、數字以及其他的字符
- 名稱不能以數字或者標點符號開始
- 名稱不能以字符 “xml”(或者 XML、Xml)開始
- 名稱不能包含空格
- 可使用任何名稱,沒有保留的字詞
- 最佳命名習慣:
- 使名稱具有描述性。使用下劃線的名稱也很不錯
- 名稱應當比較簡短,比如:<book_title>,而不是:<the_title_of_the_book>
- 避免 "-" 字符。如果您按照這樣的方式進行命名:"first-name",一些軟件會認爲你需要提取第一個單詞
- 避免 "." 字符。如果您按照這樣的方式進行命名:"first.name",一些軟件會認爲 "name" 是對象 "first" 的屬性
- 避免 ":" 字符。冒號會被轉換爲命名空間來使用(稍後介紹)
- XML 文檔經常有一個對應的數據庫,其中的字段會對應 XML 文檔中的元素。 有一個實用的經驗,即使用數據庫的名稱規則來命名 XML 文檔中的元素。
八、XML的屬性
概述
- 屬性概述:
- XML 元素可以在開始標籤中包含屬性,類似 HTML
- 屬性 (Attribute) 提供關於元素的額外信息
- XML 屬性
- 屬性通常提供不屬於數據組成部分的信息。在下面的例子中,文件類型與數據無關, 但是對需要處理這個元素的軟件來說卻很重要:
<file type="gif">computer.gif</file>
XML屬性必須加引號
- 屬性值必須被引號包圍,不過單引號和雙引號均可使用。比如一個人的性別person標籤下面兩種形式都是可以的
<person sex="female"></person> <person sex='female'></person>
- 註釋:如果屬性值本身包含雙引號,那麼有必要使用單引號包圍它,就像這個例子:
<gangster name='George "Shotgun" Ziegler'>
- 或者可以使用實體引用:
<gangster name="George "Shotgun" Ziegler">
XML屬性與XML元素的對比
- 請看下面兩個例子:
- 在第一個例子中,sex 是一個屬性
- 在第二個例子中,sex 則是一個子元素
<person sex="female"> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
<person> <sex>female</sex> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
- 兩個例子均可提供相同的信息
避免XML屬性?
- 因使用屬性而引起的一些問題:
- 屬性無法包含多個值(子元素可以)
- 屬性無法描述樹結構(子元素可以)
- 屬性不易擴展(爲未來的變化)
- 屬性難以閱讀和維護
- 請儘量使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息,比如可以類似QT那樣用屬性標識類別,以及對象名
針對元數據的XML屬性
- 有時候會向元素分配ID引用。這些 ID 索引可用於標識 XML 元素,它起作用的方式與 HTML 中ID屬性是一樣的
- 演示案例,下面的ID僅僅是一個標識符,用於標識不同的便籤。它並不是便籤數據的組成部分
<messages> <note id="501"> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> <note id="502"> <to>John</to> <from>George</from> <heading>Re: Reminder</heading> <body>I will not</body> </note> </messages>
九、XSD
- XML Schema 是基於 XML 的 DTD 替代者
- XML Schema 描述 XML 文檔的結構
- XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition,XSD)
什麼是XML Schema
- XML Schema 的作用是定義 XML 文檔的合法構建模塊,類似 DTD
- XML Schema 在 2001 年 5 月 2 日成爲 W3C 標準
XML Schema:
- 定義可出現在文檔中的元素
- 定義可出現在文檔中的屬性
- 定義哪個元素是子元素
- 定義子元素的次序
- 定義子元素的數目
- 定義元素是否爲空,或者是否可包含文本
- 定義元素和屬性的數據類型
- 定義元素和屬性的默認值以及固定值
XML Schema 是 DTD 的繼任者,理由如下:
- XML Schema 可針對未來的需求進行擴展
- XML Schema 更完善,功能更強大
- XML Schema 基於 XML 編寫
- XML Schema 支持數據類型
- XML Schema 支持命名空間
爲什麼要使用XML Schema
- XML Schema 比 DTD 更強大
- XML Schema 支持數據類型,通過對數據類型的支持:
- 可更容易地描述允許的文檔內容
- 可更容易地驗證數據的正確性
- 可更容易地與來自數據庫的數據一併工作
- 可更容易地定義數據約束(data facets)
- 可更容易地定義數據模型(或稱數據格式)
- 可更容易地在不同的數據類型間轉換數據
- XML Schema 使用 XML 語法,好處有:
- 不必學習新的語言
- 可使用 XML 編輯器來編輯 Schema 文件
- 可使用 XML 解析器來解析 Schema 文件
- 可通過 XML DOM 來處理 Schema
- 可通過 XSLT 來轉換 Schema
- XML Schema 可保護數據通信:
- 當數據從發送方被髮送到接受方時,其要點是雙方應有關於內容的相同的“期望值”。
- 通過 XML Schema,發送方可以用一種接受方能夠明白的方式來描述數據。
- 一種數據,比如 "03-11-2004",在某些國家被解釋爲11月3日,而在另一些國家爲當作3月11日。
- 但是一個帶有數據類型的 XML 元素,比如:<date type="date">2004-03-11</date>,可確保對內容一致的理解,這是因爲 XML 的數據類型 "date" 要求的格式是 "YYYY-MM-DD"
- XML Schema 可擴展:XML Schema 是可擴展的,因爲它們由 XML 編寫。通過可擴展的 Schema 定義,您可以:
- 在其他 Schema 中重複使用您的 Schema
- 創建由標準類型衍生而來的您自己的數據類型
- 在相同的文檔中引用多重的 Schema
<schema>元素
- <schema> 元素是每一個 XML Schema 的根元素:
<?xml version="1.0"?> <xs:schema> ... ... </xs:schema>
- <schema> 元素可包含屬性。一個 schema 聲明往往看上去類似這樣:
- xmlns:xs:指當前xsd所要遵循的標籤規範,一般是http://www.w3.org/2001/XMLSchema
- xmlns:一般值爲targetNamespace,作用是註明文件內引用類型時的命名空間,防止與其他xsd混淆
- xmlns:?:引用其它命名空間,一般要與import同時使用,之後可以在文件內調用其它文件的類型
- targetNamespace:當前xsd的命名空間,由作者自定義,供XML調用
- elementFormDefault(qualified/unqualified):使用qualified即可,配置更清晰簡單
- attributeFormDefault(qualified/unqualified)
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn" xmlns="http://www.w3school.com.cn" elementFormDefault="qualified"> ... ... </xs:schema>
演示案例
- 下面是一個名爲note.xsd的XML Schema文件:
- note 元素是一個複合類型,因爲它包含其他的子元素
- 其他元素 (to, from, heading, body) 是簡易類型,因爲它們沒有包含其他元素
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn" xmlns="http://www.w3school.com.cn" elementFormDefault="qualified"> <xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
- 以下文件包含對 XML Schema 的引用:
<?xml version="1.0"?> <note xmlns="http://www.w3school.com.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3school.com.cn note.xsd"> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
十、C++ XML解析庫(TinyXml2庫)
- TinyXML2 是簡單實用的開源的 C++XML 文件解析庫,可以很方便的應用到現有的項 目之中
- 具體使用參閱:https://blog.csdn.net/qq_41453285/article/details/106726476