1. 程式人生 > >資訊標記與提取方法(XML、JSON、YAML)

資訊標記與提取方法(XML、JSON、YAML)

資訊標記

        實際應用中的原始資料往往是雜亂無章的,為了更加方便組織和儲存各種資訊,以及為計算機處理、傳播訊息提供一種統一的方法。必須對資訊進行一定的標記,資訊標記的特點一般有以下幾點:

1、標記後的資訊可形成資訊組織結構,增加了資訊維度

2、標記的結構與資訊一樣具有重要價值

3標記後的資訊可用於通訊、儲存或展示

4、標記後的資訊更利於程式理解和運用

常用的資訊標記主要有XML、JSON、YAML三種,基於WWW(World Wide Web)的資訊組織方式是HTML(HyperText Markup Language,超文字標記語言)。

XML(可擴充套件標記語言)

XML簡介

XMLExtensible Markup Language)即可擴充套件標記語言,標準通用標記語言的子集,是一種用於標記電子檔案使其具有結構性的標記語言。

在電子計算機中,標記指計算機所能理解的資訊符號,通過此種標記,計算機之間可以處理包含各種的資訊比如文章等。它可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。 它非常適合全球資訊網傳輸,提供統一的方法來描述和交換獨立於應用程式或供應商的結構化資料。是Internet環境中跨平臺的、依賴於內容的技術,也是當今處理分散式結構資訊的有效工具。

1998年2月,W3C正式批准了可擴充套件標記語言的標準定義,可擴充套件標記語言可以對文件和資料進行結構化處理,從而能夠在部門、客戶和供應商之間進行交換,實現動態內容生成,企業整合和應用開發。可擴充套件標記語言可以使我們能夠更準確的搜尋,更方便的傳送軟體元件,更好的描述一些事物。例如電子商務交易等。

XML和HTML都是標準通用標記語言的子集,XML是被設計用來傳輸和儲存資料,而HTML是被設計用來顯示資料的。

XML語言具有如下一些特點:

1、可擴充套件標記語言是一種很像超文字標記語言的標記語言。

2、它的設計宗旨是傳輸資料,而不是顯示資料。

3它的標籤沒有被預定義。需要自行定義標籤。

4、它被設計為具有自我描述性。

5、它是W3C的推薦標準。

XML與HTML的區別

1XML不是HTML的替代。而是對HTML的補充。

2、它和HTML為不同的目的而設計:XML被設計用來傳輸和儲存資料,其焦點是資料的內容。HTML被設計用來顯示資料,其焦點是資料的外觀。

3、HTML旨在顯示資訊,而XML旨在傳輸資訊。對XML最好的描述是:它是獨立於軟體和硬體的資訊傳輸工具。

XML語法

XML去掉了之前令許多開發人員頭疼的標準通用標記語言的隨意語法。在XML中,採用瞭如下的語法:

1、任何的起始標籤都必須有一個結束標籤。

2、可以採用另一種簡化語法,可以在一個標籤中同時表示起始和結束標籤。這種語法是在大於符號之前緊跟一個斜線(/),例如<簡化語法/>。XML解析器會將其翻譯成<簡化語法></簡化語法>。

3標籤必須按合適的順序進行巢狀,所以結束標籤必須按映象順序匹配起始標籤。這好比是將起始和結束標籤看作是數學中的左右括號:在沒有關閉所有的內部括號之前,是不能關閉外面的括號的。

4、所有的特性都必須有值。

5、所有的特性都必須在值的周圍加上雙引號。

這些規則使得開發一個XML解析器要簡便得多,而且也除去了解析標準通用標記語言中花在判斷何時何地應用那些奇怪語法規則上的工作。僅僅在XML出現後的前六年就衍生出多種不同的語言,包括MathML、SVG、RDF、RSS、SOAP、XSLT、XSL-FO,而同時也將HTML改進為XHTML。XML運用廣泛,它的相關技術比較豐富,例如DTD、 XPath、XLink、XPoint、XSLT等;

XML例項

<person>
        <firstName>Tian</firstName>
        <lastName>Song</lastName>
        <address>
                <streetAddr>中關村南大街5號</streetAddr>
                <city>北京市</city>
                <zipcode>100081</zipcode>
        </address>
        <prof>Computer System</prof><prof>Security</prof>
</person>

用XML表示中國部分省市資料如下:

<?xml version="1.0" encoding="utf-8"?>
<country>
        <name>中國</name>
        <province>
                <name>黑龍江</name>
                <cities>
                        <city>哈爾濱</city>
                        <city>大慶</city>
                </cities>
        </province>
        <province>
                <name>廣東</name>
                <cities>
                        <city>廣州</city>
                        <city>深圳</city>
                        <city>珠海</city>
                </cities>
        </province>
</country>

JSON(JS物件標記)

        JSON(JavaScript ObjectNotation, JS 物件標記) 是一種輕量級的資料交換格式。它基於ECMAScript (w3c制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。

JSON 語法規則

在 JS 語言中,一切都是物件。因此,任何支援的型別都可以通過 JSON 來表示,例如字串、數字、物件、陣列等。但是物件和陣列是比較特殊且常用的兩種型別:

物件:物件在 JS 中是使用花括號包裹 {} 起來的內容,資料結構為 {key1:value1, key2:value2, ...} 的鍵值對結構。在面向物件的語言中,key 為物件的屬性,value 為對應的值。鍵名可以使用整數和字串來表示。值的型別可以是任意型別。

陣列:陣列在 JS 中是方括號 [] 包裹起來的內容,資料結構為 ["java", "javascript","vb", ...] 的索引結構。在 JS 中,陣列是一種比較特殊的資料型別,它也可以像物件那樣使用鍵值對,但還是索引使用得多。同樣,值的型別可以是任意型別。

1、物件表示為鍵值對

2、資料由逗號分隔

3花括號儲存物件

4、方括號儲存陣列

JSON鍵值對:是用來儲存 JS 物件的一種方式,和 JS 物件的寫法也大同小異,/值對組合中的鍵名寫在前面並用雙引號 "" 包裹,使用冒號 : 分隔,然後緊接著值:

{"firstName":"John"},這很容易理解,等價於這條 JavaScript 語句:{firstName = "John"}。

JSON與JS 物件的關係:很多人搞不清楚 JSON 和 Js 物件的關係,甚至連誰是誰都不清楚。其實,可以這麼理解:JSON 是 JS 物件的字串表示法,它使用文字表示一個 JS 物件的資訊,本質是一個字串。如:

var obj = {a: 'Hello', b:'World'}; // 這是一個 JS物件,注意鍵名也是可以使用引號包裹的。

var json = '{"a":"Hello", "b": "World"}'; // 這是一個 JSON 字串,本質是一個字串,鍵名必須用引號包裹。

JSON和JS 物件互轉:要實現從物件轉換為 JSON 字串,使用 JSON.stringify()方法:

var json = JSON.stringify({a: 'Hello',b: 'World'}); // 結果是 '{"a": "Hello","b": "World"}'

要實現從 JSON 轉換為物件,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a":"Hello", "b": "World"}'); // 結果是 {a: 'Hello', b: 'World'}

JSON和XML的比較

1、可讀性。JSON和XML的可讀性可謂不相上下,一邊是簡易的語法,一邊是規範的標籤形式,很難分出勝負。

2、可擴充套件性。XML天生有很好的擴充套件性,JSON當然也有,沒有什麼是XML可以擴充套件而JSON卻不能擴充套件的。不過JSON在Javascript主場作戰,可以儲存Javascript複合物件,有著xml不可比擬的優勢。

3、編碼難度。XML有豐富的編碼工具,比如Dom4j、JDom等,JSON也有提供的工具。無工具的情況下,相信熟練的開發人員一樣能很快的寫出想要的xml文件和JSON字串,不過,xml文件要多很多結構上的字元。

4、解碼難度。XML的解析方式有兩種:一是通過文件模型解析,也就是通過父標籤索引出一組標記。例如:xmlData.getElementsByTagName("tagName"),但是這樣是要在預先知道文件結構的情況下使用,無法進行通用的封裝。

另外一種方法是遍歷節點(document 以及 childNodes)。這個可以通過遞迴來實現,不過解析出來的資料仍舊是形式各異,往往也不能滿足預先的要求。凡是這樣可擴充套件的結構資料解析起來一定都很困難。

JSON也同樣如此。如果預先知道JSON結構的情況下,使用JSON進行資料傳遞簡直是太美妙了,可以寫出很實用美觀可讀性強的程式碼。如果你是純粹的前臺開發人員,一定會非常喜歡JSON。但是如果你是一個應用開發人員,就不是那麼喜歡了,畢竟xml才是真正的結構化標記語言,用於進行資料傳遞。

而如果不知道JSON的結構而去解析JSON的話,那簡直是噩夢。費時費力不說,程式碼也會變得冗餘拖沓,得到的結果也不盡人意。但是這樣也不影響眾多前臺開發人員選擇JSON。因為json.js中的toJSONString()就可以看到JSON的字串結構。當然不是使用這個字串,這樣仍舊是噩夢。常用JSON的人看到這個字串之後,就對JSON的結構很明瞭了,就更容易的操作JSON。

以上是在Javascript中僅對於資料傳遞的xml與JSON的解析。在Javascript地盤內,JSON畢竟是主場作戰,其優勢當然要遠遠優越於xml。如果JSON中儲存Javascript複合物件,而且不知道其結構的話,我相信很多程式設計師也一樣是哭著解析JSON的。

5、除了上述之外,JSON和XML還有另外一個很大的區別在於有效資料率。JSON作為資料包格式傳輸的時候具有更高的效率,這是因為JSON不像XML那樣需要有嚴格的閉合標籤,這就讓有效資料量與總資料包比大大提升,從而減少同等資料流量的情況下,網路的傳輸壓力。

JSON例項

{
        “firstName” :“Tian” ,
        “lastName” :“Song” ,
        “address” : {
                                “streetAddr” :“中關村南大街5號” ,
                                “city” : “北京市” ,
                                “zipcode” : “100081”
                        } ,
        “prof”  :[ “Computer System” , “Security” ]
}

用JSON表示中國部分省市資料如下:

{
        "name": "中國",
        "province": [{
                                "name": "黑龍江",
                                "cities": {"city":["哈爾濱", "大慶"] }
                           },
                        {
                                  "name":"廣東",
                                "cities":{"city": ["廣州", "深圳", "珠海"] }
        }]
}

YAML(另一種標記語言)

YAML簡介

        YAML(YAML Ain't Markup Language,另一種標記語言),但為了強調這種語言以資料做為中心,而不是以置標語言為重點,而用返璞詞重新命名。它是一種直觀的能夠被電腦識別的資料序列化格式,是一個可讀性高並且容易被人類閱讀,容易和指令碼語言互動,用來表達資料序列的程式語言。

它是類似於標準通用標記語言的子集XML的資料描述語言,語法比XML簡單很多。

YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表,標量等資料形態。它使用空白符號縮排和大量依賴外觀的特色,特別適合用來表達或編輯資料結構、各種設定檔、傾印除錯內容、檔案大綱(例如:許多電子郵件標題格式和YAML非常接近)。

儘管它比較適合用來表達階層式(hierarchical model)的資料結構,不過也有精緻的語法可以表示關聯性(relational model)的資料。

由於YAML使用空白字元和分行來分隔資料,使的他特別適合用grep、Python、Perl、Ruby操作。

其讓人最容易上手的特色是巧妙避開各種封閉符號,如:引號、各種括號等,這些符號在巢狀結構中會變得複雜而難以辨認。

YAML語法

多行縮排:資料結構可以用類似大綱的縮排方式呈現,結構通過縮排來表示,連續的專案通過減號“-”來表示,map結構裡面的key/value對用冒號“:”來分隔。樣例如下:

house:
        family:
                name: Doe
                parents:
                        - John
                        - Jane
                children:
                        - Paul
                        - Mark
                        - Simone
                address:
                        number:34
                        street:Main Street
                        city:Nowheretown
                        zipcode:12345

注意:1、字串不一定要用雙引號標識;

2、在縮排中空白字元的數目並不是非常重要,只要相同階層的元素左側對齊就可以了(不過不能使用TAB字元);

3、允許在檔案中加入選擇性的空行,以增加可讀性;

4、在一個檔案中,可同時包含多個檔案,並用“——”分隔;

5、選擇性的符號“...”可以用來表示檔案結尾(在利用串流的通訊中,這非常有用,可以在不關閉串流的情況下,傳送結束訊號)。

單行縮寫:YAML也有用來描述好幾行相同結構的資料的縮寫語法,陣列用'[]'包括起來,hash用'{}'來包括。因此,上面的這個YAML能夠縮寫成這樣:

house:
        family: { name: Doe, parents: [John, Jane], children: [Paul,Mark, Simone] }
        address: { number: 34, street: Main Street, city: Nowheretown,zipcode: 12345 }

此外YAML使用表達整塊資料表示註釋。

YAML與JSON的區別

雖然YAML是參考JSON,XML和SDL等語言,不過跟這些語言比起來,YAML仍有自己的特色。

JSON的語法是YAML1.2版的子集,同時非常接近YAML1.0與1.1版的子集,因此大部分的JSON檔案都可以被YAML的剖析器剖析。這是因為JSON的語法結構和YAML的內建格式相同。雖然大範圍的分層也可以使用類似JSON的內建格式,不過YAML標準並不建議這樣使用,除非這樣編寫能讓檔案可讀性增加。YAML的許多擴充套件在JSON是找不到的,如:進階資料形態、關係錨點、字串不需要雙引號、對映資料形態會儲存鍵值的順序。

YAML例項

firstName : Tian
lastName : Song
address  :
        streetAddr : 中關村南大街5號
        city  : 北京市
        zipcode : 100081
prof  :
‐Computer System
‐Security


小結

1、XML:最早的通用資訊標記語言,可擴充套件性好,但繁瑣,適用於Internet上的資訊互動與傳遞;

2、JSON:資訊有型別,適合程式處理(js),較XML簡潔,適用於移動應用雲端和節點的資訊通訊,無註釋。

3、YAML:資訊無型別,文字資訊比例最高,可讀性好,適用於各類系統的配置檔案,有註釋易讀。

資訊提取的一般方法

從標記後的資訊(XML JSON YAML)中提取所關注的內容:(標記, 資訊)。

方法一:完整解析資訊的標記形式,再提取關鍵資訊,需要標記解析器。例如:bs4庫的標籤樹遍歷。

優點:資訊解析準確

缺點:提取過程繁瑣,速度慢

方法二:無視標記形式,直接搜尋關鍵資訊。對資訊的文字查詢函式即可。

優點:提取過程簡潔,速度較快

缺點:提取結果準確性與資訊內容相關

融合方法:結合形式解析與搜尋方法,提取關鍵資訊。需要標記解析器及文字查詢函式。