標籤:

XML 為什麼很重要?XML 解決了什麼問題?


XML解決的問題主要有兩個:

  • 文檔格式中引入了標準的編碼認定機制,規範了多語言情況下的編碼轉換問題。
  • 語法規則簡單,適合機器處理。所以才會有那麼多的XML分析器存在。

但XML的重要並不是因為它解決了什麼問題,而是因為它被大公司大面積地誤用和濫用了。現在用XML最多的地方是兩個:配置文件和數據傳輸,而這兩者恰恰都是XML不應該被使用的地方。XML語法規則簡單的特性直接導致了它另一面的問題,即信息密度太低,同樣的信息量需要的文本長度更長。配置文件使用XML導致了可讀性下降和過於依賴DOM分析器;而數據傳輸使用XML實際上使得數據流量變大。但由於使用它的都是大公司(從SUN開始,微軟、IBM尤其過頭,蘋果稍好,可惱的是Gnome這個山寨版Mac也開始無聊地到處用XML),所以這兩個問題都被有意忽視了。

實際上現在小項目由於逐步脫離大公司主導的技術框架,程序員們才得以正視這個問題,因此如今我們才有條件造就逐步用JSON代替XML的趨勢。


XML有一個所有語言都支持的xsd可以驗證XML有沒有寫對,為開發高質量軟體省去了大量的重複勞動。


XML提供了一種描述事物的方法,大家都覺得這種方法很好,所以就廣泛使用了,所以XML很重要。

之所以覺得XML好,首先是XML提供了一種比較簡單的描述內容的方法,而且這種方法能表述列表、樹等常見的數據結構,可擴展性好。XML使用純文本方法書寫,人們可以讀懂內容,也可以自行修改裡面的內容。XML是樹形的結構,關於樹,有非常非常多很成熟的演算法進行描述、操作、生成、分析,使得XML描述的數據可以很方便的生成和處理。


  • 有 Schema,可以對數據做基礎的驗證;反觀 json,在複雜的數據集上,很容易把讀取的邏輯和驗證的邏輯揉成一坨翔,又新鮮又熱。

  • 有 XPath 乃至 CSS 作為檢索語言,可以在複雜的數據集中讀取特定想要的數據;反觀 json,檢索比較深的數據需要一坨很臭的循環。

但是數據集合為什麼非要複雜不可呢?有 JSON 和 XML 兩種格式可以選的 API,相信大家都更喜歡 JSON 版的。


XML的NB之處在於它搭建了開發人員與用戶(配置人員)之間的橋樑

和它相比,JSON更技術一些,properties則不支持嵌套


其實,很簡單的說,就是 xml 用來描述樹狀結構的一種文本格式。樹節點由屬性集合和值構成。

【我不打算考慮這樣的情況:解析一個存在部分內容破壞,破損的文件時,對文件內容錯誤的容忍性。】

優點是,適合描述樹結構。具有自我描述信息,使得人可以容易讀懂其含義(尤其是相對於二進位文件來說)(但是讀起來有點累,所以太複雜的 xml 會讓人感到頭大,人編輯 xml 也會很累)。

缺點就是,解析成本高,信息含量占存儲比太低。標籤起始結束的兩端內容重複,空白字元無限制,造成浪費存儲空間,網路傳輸效率低。

--

比如說 ini 文件,設計的很好,但是僅適合於這樣的 sections 組合結構,每個 section 由多個 key - value 對構成。

ini 是 windows 系統早期定義的配置文件格式。後來 windows 主張用註冊表管理配置,廢棄 ini。但是由於 ini 實在太好用,而且很綠色環保(試想下,你不想用一個軟體時只需要簡單的 del 一個文件夾),所以 ini 始終在沿用!

還有一種樹結構描述方法,是用表格描述,裡面有兩個欄位,id ,parent id。通過這兩個欄位,創建樹結構。通常表的行順序隨機,需要全表掃描。

還有一種無描述的文本文件,採用約定好的格式,由程序來讀寫和解釋。例如從 excel 存儲為的 csv 格式,這樣的文件基本不具備自我描述性,因此對人來說,如果不告訴他格式約定,他就沒辦法理解這個文件。

至於二進位文件(通常由 header + sections dir + sections 構成,每個 section 可能又包含有 header),當然更不具備可讀性。優點是,程序按照約定格式,解釋二進位文件,可以完全不存在把字元串解析成數字這樣的過程,因此效率是最高的。

--

在 c++ 中,主要推崇 ini 文件格式和二進位文件,

我個人認為,因為 ini 沒有冗餘信息,簡潔易讀,所以編輯 ini 文件,比編輯 xml 輕鬆多了。

也有一部分人,和個別場合,採用無描述的約定文本格式。

相對於二進位格式,主要是在 windows 平台上比較推崇,linux, unix 理念決定,更推崇文本格式。

在 .net 中,比較推崇 xml 格式。.net 自帶類庫解析和生成 xml,

而 c++ 中解析 xml 需要採用第三方貢獻的開源類庫(如果你不打算自己動手造這個很麻煩的輪子)。

所以定義配置文件時,一個 .net 程序員通常必然會採用 xml 格式。

c++ 程序員通常會採用 ini (因為有 windows api 的支持),在 ini 不適合時,採用自定義格式。


有句話說的好,沒有xml解決不了的問題,沒有xml解決的好的問題

xml就是什麼都能表達,但是怎麼都表達不開心


主要解決的一個問題就是:如何按照大家都理解的方式描述一個事物。這裡的大家指的不僅僅是人。

正因為有了 XML,不同編程語言之間,機器和機器之間,機器和人之間,人和人之間能夠正確地交流。所以它很重要。


是一個自描述的數據格式,更包含了操作數據的指令,還能找到更好的嗎?


用純文本保存結構化數據,是XML最大的優點。相對而言用不用UTF8倒只是個細節。

例子來自《程序員修鍊之道——從小工到專家》14:純文本的威力

對於一個文本,如果是

AC27123456789B11P

...

XY43567890123QTYL

...

6T2190123456788AM

...

壓根看不出什麼意思

如果是&123-45-6789&

一眼就能看出這是社會保險號。

很多人以前上學可能寫過所謂的「學生分數管理系統」之類的作業。當時可能用的是一個學生一行,一個科目一列的方式。無疑,如果1年不看,早就忘光了哪列是什麼科目。而XML能永久保存這類相關係信息,比如

&

&ABC&

&80&

&75&

&

上面有@陳甫鵃 說XML用於配置文件導致可讀性下降,我倒不這麼認為。XML首先能保證格式的完整性,比如如果不小心刪掉一兩行導致標籤不匹配,一下子就能發現。另外很多配置文件本質上就是有結構的,就像論文都有一級標題二級標題那樣。看過mysql的配置文件的都知道,那一眼望不到頭的巨大配置文件,要找一個特定項非常難;如果確保變數名都完全不重名,首先有難度,其次變數名會變長很多。比如mysql_db_host, sybase_db_host, mssql_db_host...

用UltraEdit的都知道UE有個能將任意縮進或換行的XML文字串改成標準縮進格式的功能。那個功能相當好用。

實際上,我之前還見過某印度公司用XML來寫日誌。雖然日誌長了很多,但結構之清晰讓人嘆為觀止。


XML就是牛逼就是通用啊...不管你啥系統啥框架都認識這東西啊...雖然JSON也通用但是那個格式我的狗眼真心看不懂啊...

而且有了XSLT還可以把XML當模板用啊...

而且有了XQuery你要是閑著沒事兒還可以把XML當資料庫用啊...

反正就是可狠了啊...戰五渣看劍!...


XML之所以重要,不是因為它涉及技術很厲害,而是因為XML有一些特點:

這個東西的規則比較簡單,並且人眼看起來也比較容易理解,結構上也比較好操作,並且並無與任何編程語言綁定。

所以,很多編程語言就都為XML這個東西編寫了讀寫XML的庫,所以XML看起來所謂的通用,其實主要不是因為本身通用,而是因為XML本身的特點導致很多人願意編寫操作XML的相關的庫,於是就「通用」了。

此外,在XML基礎上,可以增加很多規則,如XML Schema這東西,可以規定XML哪個元素可以出現,哪個元素不可以出現,哪個元素可以有多個,哪個元素必須要有某某屬性(attribute)等。於是XML的實用性就更強了。

其實,說到XML就必須也要了解JSON,只有兩者都了解了,才能感覺出為何XML,為何JSON。


xml文件可以自由定義屬性和層次關係,使用中可以比較靈活的反應對象的信息。


XML是第一代人和機器都能讀懂的語言,That"s all


純文本,解決了跨平台的問題。


XML各種相關技術確實解決了很多重要問題。但這些問題主要也就是XML自己製造出來的。


簡單是要有代價的。


就像拋棄XX記憶棒,只用SD卡就可以那種感覺


在遊戲行業很重要。大量的內容配置由策劃完成。


說到點上了,XML能讓你在一團亂麻的數據集里比較輕鬆的找出數據,不用一層一層的循環。但是能把數據集做的簡單為什麼不做簡單呢?大家想明白了就都用json了。


推薦閱讀:

有沒有對提高編程能力有幫助的電影?
你是如何自學R語言的?
什麼情況下才應該使用存儲過程而不是用程序來對數據做操作?
程序員們怎麼理解各種計算機書里抽象的概念呢?
c++大作業怎麼用windows API 做個窗口程序?不用MFC或者是QT這些工具。

TAG:編程 | XML |