【編者按】本文作者 Yegor Bugayenko 是 Teamed.io 公司的聯(lián)合創(chuàng)始人氨淌,在軟件質(zhì)量和工程管理方法領域有深入的研究。本文中伊磺,作者通過對比 JSON 盛正,向大家更詳細地闡述了 XML 的四大特性,幫助大家在搭建項目時選擇適合的數(shù)據(jù)格式類型屑埋。
很多人都在心里糾結豪筝,如果 JSON 和 XML 相比,誰更好誰更快?在接下來的新項目中到底選擇哪一個壤蚜?別傻了即寡!完全沒有可比性。就像自行車和 AMG S65 袜刷,你能說哪個更好嗎聪富?雖然兩者都是交通工具,但有些情況下著蟹,自行車反而更便捷墩蔓。所以 JSON 和 XML 也一樣,它們都各有所長萧豆,完全沒有必要進行比較奸披。
下面舉一個簡單的 JSON 數(shù)據(jù)(140個字符):
{
"id": 123,
"title": "Object Thinking",
"author": "David West",
"published": {
"by": "Microsoft Press",
"year": 2004
}
}
同樣的數(shù)據(jù)在 XML 中會表示如下(167個字符):
<?xml version="1.0"?>
<book id="123">
<title>Object Thinking</title>
<author>David West</author>
<published>
<by>Microsoft Press</by>
<year>2004</year>
</published>
</book>
很容易看出其中的區(qū)別,前者更簡潔更容易理解涮雷,而且能在JavaScript 中能完美解析阵面。所以,我們便可以簡單粗暴地放棄 XML 選擇 JSON 了嗎洪鸭?誰還會需要已歷時15年的重量級語言呢样刷?
但恰恰相反,本人就非常喜愛 XML 览爵,且聽下文分解置鼻。
但千萬別誤會,本文并不是在反對 JSON 蜓竹。 JSON 的確是很好的數(shù)據(jù)格式箕母,但它僅僅只是一種數(shù)據(jù)格式,經(jīng)常被臨時用于將數(shù)據(jù)從 A 點傳到 B 點俱济。它比 XML 更簡短易讀嘶是,但僅此而已。
XML 是一種非常強大的語言蛛碌,而非只是單純的數(shù)據(jù)格式俊啼。相對于 JSON 和其他簡單的數(shù)據(jù)格式來說,如 YAML 左医,XML 至少有以下四個重要特性。
- XPath
為了從文檔中得到上文類似的出版年份同木,只需要發(fā)送一個簡單的 XPath 請求:/book/published/year/text() 浮梢。但是,必須得有一個 XPath 處理器來解析請求并返回2004彤路。好就好在 XPath2.0是集 functions秕硝、predicates、axes 等為一體的強大檢索引擎洲尊,在不用 Java 代碼編寫任何遍歷的邏輯的情況下远豺,就可以在 XPath 請求中以自然語言形式加入任何邏輯奈偏,例如,你可以直接發(fā)出請求 “How many books were published by David West in 2004?” 躯护,便能通過 XPath 得到答案惊来。而這是 JSON 所不能做到的。
- Attributes and Namespaces
可以將 metadata 加到 XML 數(shù)據(jù)中棺滞,正如上面的 id 屬性一樣裁蚁。數(shù)據(jù)保存在元素中,例如圖書作者的姓名继准,而 metadata(數(shù)據(jù)的數(shù)據(jù))應該保存為屬性枉证,這會大大有利于組織和結構化信息。最重要的是移必,元素和屬性都可以標記為屬于某個 namespaces 室谚,當多個應用使用同一 XML 文檔時,這種技術的優(yōu)勢會非常明顯崔泵。
- XML Schema
試想這樣的情況秒赤,當你在一臺機器上創(chuàng)建了 XML 文檔,在其他電腦上做了數(shù)次修改管削,然后又傳到別的電腦上使用倒脓,所以必須確保文檔結構沒有被中間操作所破壞。比如可能有人用 <year> 保存出版日期含思,但別人又可能使用 ISO-8601 格式的 <date> 崎弃。為了避免這樣的結構混亂,我們可以創(chuàng)建一個說明文檔 XML Schema 含潘,和主文檔一起進行保存饲做。在每次操作主文檔之前,都需要通過 schema 文件檢查其正確性遏弱,這是生產(chǎn)過程中的一種集成測試盆均。 RelaxNG 也是類似的機制,但會簡單很多漱逸,如果覺得 XML Schema 太過復雜不妨嘗試用 RelaxNG泪姨。
- XSL
事實上,可以不用任何 Java/Ruby 等代碼就能完成 XML 文檔的修改饰抒。簡單的說肮砾,你只需要創(chuàng)建一個 XSL transformation 文檔并將其應用于原始 XML ,然后得到一個新的 XML 袋坑。 XSL 語言(純功能性語言)是專為分層數(shù)據(jù)操作設計的仗处,它比 Java 或任何其他面向對象/過程的語言都更適合這一任務。借助 XSL 可以將 XML 轉換為任何形式,包括純文本和 HTML 婆誓。很多人抱怨 XSL 太復雜吃环,但其實沒那么難, XSL 的核心功能其實很簡單洋幻,大家不妨一試郁轻。
以上所述并不是 XML 的全部特征,但這四大特性的確用途非凡鞋屈。它們不僅可以讓文檔的“自給自足”劫谅,還能進行自我驗證(XML Schema)太闺,進而知道如何修改(XSL),最后還能方便地獲得其中的文檔內(nèi)容(Xpath)。
同時布隔,市面上還有很多以 XML 為基礎發(fā)展的語言澳腹、標準和應用江锨,包括 Xforms戏锹、 SVG、 MathML拄氯、 RDF躲查、 OWL、 WSDL 等译柏。但一般的主流項目中都不會用到镣煮,因為它們的針對性都太強。
設計 JSON 的用途并非是滿足以上特性鄙麦,盡管 JSON 領域現(xiàn)在努力嘗試典唇,包括用于查詢的 JSONPath 、一些轉換工具和用于驗證的 json-schema 胯府,但和強大的 XML 相比這只是微不足道的模仿介衔,筆者并不認為會有長遠發(fā)展,而且遲早會消失殆盡骂因。
綜上所述炎咖, JSON 是一種沒有過多附加功能的簡單數(shù)據(jù)格式,其最佳的使用情況是在 AJAX 下寒波,除此之外乘盼,本人都強烈推薦大家使用 XML。
(編譯自:https://dzone.com/articles/stop-comparing-json-and-xml)
OneAPM 為您提供端到端的 Java 應用性能解決方案俄烁,我們支持所有常見的 Java 框架及應用服務器绸栅,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸,定位異常根本原因猴娩。分鐘級部署,即刻體驗,Java 監(jiān)控從來沒有如此簡單卷中。想閱讀更多技術文章矛双,請訪問 OneAPM 官方技術博客。
本文轉自 OneAPM 官方博客