XML&JSON&YAML
引言
XML也好,JOSN、YAML也好,本質上都是文字檔案,用於資料傳輸。它們與txt這種文字檔案的區別是,它們規範了資料格式,使得資料具有結構性,方便讀取和處理。XML、JSON、YAML的不同之處只是它們規定的資料格式不同,即語法不同。
XML
XML定義
XML是可擴充套件性標記語言。
發明XML的目的是傳輸和儲存資料,而非展示資料。
XML的標籤只能自定義。
XML主要用途有三個:
- 資料傳輸
- 用作配置檔案
- 充當小型資料庫儲存資料
XML語法
XML基本語法
如下為一個基本的xml檔案,其基本規則有:
- 標籤全部自定義,myroot, user, msg等標籤全部自定義
- 標籤成對出現,格式為<tag></tag>,其中兩個尖括號之間是具體的內容資訊,成對標籤含義是這兩個標籤唯一的區別就是後邊那個有"/",其它完全一致,比如<tag></mytag>這樣是不對的。
- 必須有根標籤(根節點),比如這裡的<myroot></myroot>,根標籤包括了所有內容,根標籤也是自定義的
- 標籤名大小寫敏感
- 標籤不允許交叉,比如<a><b></a></b>這樣是不對的,只能是一對標籤完全包含另一對標籤。
- xml註釋用把要註釋的內容括起來
<?xml version="1.0" encoding="utf-8" ?>
<myroot>
<user>中國</user>
<msg>睡獅漸已醒</msg>
`<!--<msg>睡獅漸已醒</msg11>-->`
</myroot>
- 上邊第一行是頭宣告,聲明瞭xml的版本的檔案編碼,這一行可以省略。
- 如果標籤中的資訊包含了<>等特殊字元,則需要使用實體轉義,如下表為需要轉義的字元:
XML屬性
屬性是標籤的屬性,比如下圖中name標籤的屬性age。
- 一個標籤可以有多個屬性,屬性的值必須用引號括起來
- 屬性表示標籤的一些額外資訊
- xml中屬性沒啥用,而且會給解析帶來麻煩
CDATA
如果某個標籤中的內容有許多需要轉義的部分,那麼一個個用實體轉義會非常麻煩,這個時候可以用CDATA來括起來這部分,比如<,>等符號,使得其不被解析成xml的內容,而保持原樣。
格式是
<![CDATA[這裡放不解析的內容]]>
JSON
JSON定義
相比於XML,JSON是一種更輕量級的資料傳輸格式,易於機器解析和生成。
JSON資料格式
XML中有標籤,屬性等一系列格式,JSON的資料格式有兩種,即陣列和物件,且二者可以相互巢狀。
JSON陣列格式
JSON陣列格式用方括號[]包括,其中元素用逗號分開,陣列元素型別不做限制。
[1, 2, 3]
JSON物件格式
JSON物件格式用花括號{}括起來,其中的元素是鍵值對,本質與python中的字典一樣。
如下例子,是JSON陣列和物件的巢狀使用。
{"key":[1,2,3]}
JSON語法規則
JSON值可以是:
- 數字
- 字串(雙引號中)
- 邏輯值(true或false)
- 陣列(在中括號中)
- 物件(在花括號中)
- null
一般情況下json檔案中包含的都是一個物件(即鍵值對),但是隻包含一個數組也是允許的。這與XML必須有根節點不同。
YAML
JSON相比於XML更簡潔,YAML相比於JSON更簡潔。比較明顯的一點是,XML中標籤必須是成對的,而JSON中不需要。JSON中會使用很多的花括號和方括號,YAML則可以連這些都省去。
YAML語法規則
- 大小寫敏感
- 使用縮排表示層級關係
- 縮排不允許使用tab,只允許空格
- 空格數不重要,只要對齊即可
- #表示註釋
YAML支援的資料型別:
- 物件,即鍵值對集合,又稱為雜湊,對映,字典
- 陣列
- 純量
YAML物件中的鍵值對用冒號分隔,且冒號後有一個空格。如果一個物件裡只有一個鍵值對,那麼可以不用花括號。
YAML中陣列可以用-開頭的行表示,也可以按傳統方式,所有元素放在中括號中。
- YAML可以用&和來做引用,&用來標識可以引用的地方,用來在具體的位置引用。
XML,JSON,YAML對同一內容的不同表達
注意YAML中“-”表示是一個數組,且陣列中包含4個元素。