標籤:

XML到底是幹什麼的?

XML到底是定義數據格式然後把真正數據包進去用於數據的交互傳輸,還是單純的定義了數據的格式的標記語言。好多地方都出現XML,我就有點蒙,比如在框架里XML定義了框架的各種屬性,又定義了數據的格式,但數據傳起來又可以是JSON。大牛們能否直白地解答一下XML的用途,別copy各種網上的講解,我看了,和沒說一樣還是不清晰。


看到各答主都沒認真回答,忍不住出來小秀一把。

簡單概括(可能概括的不是很準確,但是我的語言功底也就到這了,見諒)的話就是,xml本身是一種格式規範,是一種包含了數據以及數據說明的文本格式規範。

接下來煮幾個栗子說明一下。

比如,我們要給對方傳輸一段數據,數據內容是「too young,too simple,sometimes naive」,要將這段話按照屬性拆分為三個數據的話,就是,年齡too young,閱歷too simple,結果sometimes naive。

我們都知道程序不像人,可以體會字面意思,並自動拆分出數據,因此,我們需要幫助程序做拆分,因此出現了各種各樣的數據格式以及拆分方式。

比如,可以是這樣的

數據為「too young,too simple,sometimes naive」

然後按照逗號拆分,第一部分為年齡,第二部分為閱歷,第三部分為結果。

也可以是這樣的

數據為「too_young**too_simple*sometimes_naive」

從數據開頭開始截取前面十一個字元,去掉*號並把下劃線替換為空格作為第一部分,再截取接下來的十一個字元同樣去掉*並替換下劃線為空格作為第二部分,最後把剩下的字元同樣去*號體會空格作為第三部分。

這兩種方式都可以用來容納數據並能夠被解析,但是不直觀,通用性也不好,而且如果出現超過限定字數的字元串就容納不了,也可能出現數據本身就下劃線字元導致需要做轉義。

基於這種情況,出現了xml這種數據格式, 上面的數據用XML表示的話

可以是這樣

&

age="too young" experience="too simple" result="sometimes naive" /&>

也可以是這樣

&


&
&
&
&

兩種方式都是xml,都很直觀,附帶了對數據的說明,並且具備通用的格式規範可以讓程序做解析。

如果用json格式來表示的話,就是下面這樣

{
"age":"too young",
"experience":"too simple",
"result":"sometimes naive"
}

看出來沒,其實數據都是一樣的,不同的只是數據的格式而已,同樣的數據,我用xml格式傳給你,你用xml格式解析出三個數據,用json格式傳給你,你就用json格式解析出三個數據,還可以我本地保存的是xml格式的數據,我自己先解析出三個數據,然後構造成json格式傳給你,你解析json格式,獲得三個數據,再自己構造成xml格式保存起來,說白了,不管是xml還是json,都只是包裝數據的不同格式而已,重要的是其中含有的數據,而不是包裝的格式。


估計沒多少人知道XML其實是微軟做的或者說是主要推動者,而且現在管XML的人就坐在離我10米遠,正在苦逼地調bug。

簡單回答下題主的問題。XML就是種定義數據的標機語言,並沒有定義如何傳輸,你可以把他放在http get的response裡面,也可以直接拷貝一個xml文件到u盤裡。其擴展xsd定義了xml的schema,而xslt又定義了xml的轉換方式,這些使得xml更加強大。比如我見過用xslt來自動生成測試代碼的。

從應用來講,各種config文件是xml的一個重要應用。數據文件也能用xml來保存,比如office文件。另外,SOAP協議的載體也是基於XML;ATOM也是基於XML用來表達要傳輸的數據,雖然現在json用得更多點。


xml的精髓在於幾乎圖靈完備的xsd,這是所有其它類似的結構都不具備的一個強大的功能。


以一種約定的字元串來表示某些常用數據類型,例如Map或者Array、Two-Dimensional Array。

因為雙方都有約定,不同的應用就可以通過這些字元串進行數據的交換。

例如作為配置文件,那麼應用本身可以讀取這些配置,而文本編輯軟體也可以按照約定的格式來編輯這些字元串,那麼就實現了人肉和應用的數據的交換。

又例如作為網路應用,服務端發出這些字元串,客戶端接收到後parse,就可以實現服務端傳輸一個Map的數據(舉例)到客戶端。

另外XML帶有大量信息冗餘,這樣也方便人的閱讀。


XML 就是個有一堆冗餘信息的 S-Exp 嘛(逃


你可以理解為一輛沒有發動機的車。

xml把所有部件按照一定規則集合在一起,就等編譯器這個發動機去啟動這個車。

現在用的比較多的是配置和數據結構定義,其實用途很多。早在十年前我就看到一個js寫的解釋器直接讀xml做一個動態網頁。


記得好像據說,最早是在萬維網剛出現的時候,為了在萬維網上傳輸數據,接收方能理解,人們創造了這種自帶格式說明的文件格式。當時人們期待著xml能一統天下,結果後來html和瀏覽器出現了,html成了標準的網路協議,就沒xml什麼事了。現在xml就是個工具,幹啥都行。可以存儲並檢索數據,可以做傳輸約定格式,可以做配置文件。但似乎什麼都有替代的解決方案


XML是一種數據存儲、交換、表達的標準:

- 存儲:優勢在於半結構化,可以自定義schema,相比關係型二維表,不用遵循第一範式(可以有嵌套關係);

- 交換:可以通過schema實現異構數據集成;

- 表達:本身就可以作為閱讀文檔,當然還可以使用XSLT之類的進行解析和再顯示。

缺點是schema驗證複雜,相比後來的json等格式,相對冗餘。

但是作為半結構化文檔的代表性標準,早期代表的是一種數據思想。


應該從他名稱來理解: 可擴展標記語言.

從兩個角度理解:

  1. 可擴展。你可以把他用作任何用途:配置文件、UI描述文件等等
  2. 標記語言。對,HTML(超文本標記語言)也是標記語言,你可以把HTML看做是XML的子語言。

從以上兩點來看,XML就是一個文檔結構的規範。文檔的內容根據你的需要是什麼都可以。描述配置文件,比如Spring的很多配置文件;UI描述,比如HTML和Android布局文件。

XML他只定義了文檔的結構:成對的標記(),屬性的位置(http://xxx")等等。至於這些標記和屬性你解析成什麼你自己決定。

------------------------------------ 補充

既然有了XML那為什麼還用JSON呢?因為XML有時候描述東西太費勁,而且有大量的冗餘,尤其是結束標記(&)。如果只是幾個元素沒什麼,如果非常多,就不利於網路傳輸了,所以現在網路上用的非常多的是JSON.


XML主要有以下兩種應用:1、用XML來表述底層數據,如配置文件。2、利用XML為文檔添加元數據。


xml是描述數據結構工具,這個數據可以是元數據(如配置文件),也可以是最終數據(如包含文字的網頁,RSS什麼的)。

xml可用於存儲,傳輸,交換數據,因為只描述/關心數據的結構,可以做到平台無關,實現跨平台。

為什麼流行?因為可拓展性好,對人類友好,結構清晰易讀。更因為平台無關,所以Windows平台喜歡,Linux平台喜歡,mac ox喜歡,各種系統(包括非操作系統)都喜歡用它。


有json,還要xml做什麼了。 xml可以進博物館了。


XML is used to store data independent of both hardware and software


應用之一:代替.ini文件作為Application的配置文件,很方便直觀,並且有不少不錯的解析器可以選用。


用來存儲數據,當然也可以用普通的純文本保存,區別是XML做了數據的拆分和歸類,以便讓計算程序區分各部分的內容

拆分方式有多種,可以這樣來表述:

  • 用XML格式拆分數據
  • 用JSON格式拆分數據

選擇用哪種方式存儲數據一般會考慮以下兩點

  • 哪種更容易閱讀
  • 哪種更容易被程序解析(正反序列化)


搜索xml wiki從這出發,看看歷史,你會發現sgml,看看這些標準,你會喜歡的。

結構化的數據都可以用XML,(也有人覺得xml繁碎,unity用了yaml),我的想法是能用標準格式就用,不要總想著用dsl自己搞格式。


提問前不搜類似問題的嗎?

之所以有xml是因為有java這個專業操作xml的語言。

java你們以為它是通用語言,naive!其實它是門dsl,吃進xml,吐出stack trace。

貼個正經的舊答案:

xml解決的問題主要是互操作性(interoperability)

其設計目的是跨越編程語言、編碼方式、操作系統、位元組順序、硬體架構、組織間的界限還有行業標準的阻礙來交換數據

這個數據可以具有複雜的數據結構、充分可自定義可擴展、格式上正規化且可以驗證

xml有點heavy,因為它針對的問題比較heavy

-----

補充一點:

xml玩得風生水起的年頭,js語言低頭一看,md毛還沒長全;rest論文剛剛發表,更不用提json了


推薦閱讀:

關於能否基於XML重新實現TeX?

TAG:XML |