現代網絡技術的世界中,XML(可擴展標記語言)和 HTML(超文本標記語言) 是兩個非常重要的技術。盡管它們都使用標簽和屬性的格式來描述數據,但它們在形式和用途上有顯著的區別。
XML,即 Extensible Markup Language(可擴展標記語言),是一種用于存儲和傳輸數據的文本格式。XML 的設計宗旨是強調數據的結構化和準確性,提供了一種公認的標準格式。最主要的特點是它的自我描述性,即數據和數據的定義集成在一起,使得它在數據交換和數據存儲方面具有極大優勢。
而 HTML,即 HyperText Markup Language(超文本標記語言),則是一種用于創建網頁的標準標記語言。HTML 的主要用途是描述網頁的內容和結構,通過與 CSS(層疊樣式表)和 JavaScript(腳本語言)的結合,實現豐富和互動的網絡應用。
<book>
<title>Learning XML</title>
<author>John Doe</author>
<price>29.99</price>
</book>
<!DOCTYPE html>
<html>
<head>
<title>My Web Page</title>
</head>
<body>
<h1>Welcome to My Web Page</h1>
<p>This is an introductory paragraph.</p>
</body>
</html>
下面使用 Apifox 來修正和測試基于 XML 的 API 請求。
假設您需要向服務器發送 XML 格式的注冊信息。您可以按照以下步驟使用 Apifox 進行設置:
<userRegistration>
<username>john_doe</username>
<password>securePassword123</password>
<email>john_doe@example.com</email>
</userRegistration>
<userRegistrationResponse>
<userId>12345</userId>
<username>john_dane</username>
<status>success</status>
</userRegistrationResponse>
打開 Apifox,選擇開始新項目或者繼續現有項目。接著點擊“新建接口”,在接口設置頁面,選擇 POST 作為請求方法,并輸入正確的請求 URL,比如 https://api.example.com/register (這里的 URL 應替換為真實可用的 URL)。在配置請求體時,選擇 XML 格式,并將上述 XML 數據粘貼到配置區。
配置完成后,轉到“運行測試”頁面,點擊“發送”按鈕以向服務器發送構建的請求。請求發送后,檢查響應部分,您應該看到類似于提供的 XML 格式的響應數據。
您還可以使用響應界面上的預覽功能,該功能能讓您以更直觀的方式查看服務器返回的數據。
XML 和 HTML 雖然在標簽和屬性的語法上有所相似,但它們在使用場景、結構和功能上有顯著的區別。XML 強調數據的準確傳輸和結構化存儲,適合用于數據的交換和持久化存儲等場景。而 HTML 強調內容呈現和用戶交互,主要用于網頁設計和開發。
這些趨勢中可以推斷,JSON 的發展將統一 Web 的信息交換格式,XML 的使用率將繼續降低。我相信 JSON 很快就會在 Web 開發中超過 XML。至于其他領域,XML 比 JSON 更好的情況并不多。
-- Tom Strassner
XML 和 JSON 是現今互聯網中最常用的兩種數據交換格式。XML 格式由 W3C 于 1996 年提出。JSON 格式由 Douglas Crockford 于 2002 年提出。雖然這兩種格式的設計目標并不相同,但它們常常用于同一個任務,也就是數據交換中。XML 和 JSON 的文檔都很完善( RFC 7159 、 RFC 4825 ),且都同時具有 人類可讀性(human-readable)和 機器可讀性(machine-readable)。這兩種格式并沒有哪一個比另一個更強,只是各自適用的領域不用。(LCTT 譯注:W3C 是 互聯網聯盟 ,制定了各種 Web 相關的標準,如 HTML、CSS 等。Douglas Crockford 除了制定了 JSON 格式,還致力于改進 JavaScript,開發了 JavaScript 相關工具 JSLint 和 JSMin )
XML 與 JSON 相比有很多優點。二者間最大的不同在于 XML 可以通過在標簽中添加屬性這一簡單的方法來存儲 元數據(metadata)。而使用 JSON 時需要創建一個對象,把元數據當作對象的成員來存儲。雖然二者都能達到存儲元數據的目的,但在這一情況下 XML 往往是更好的選擇,因為 JSON 的表達形式會讓客戶端程序開發人員誤以為要將數據轉換成一個對象。舉個例子,如果你的 C++ 程序需要使用 JSON 格式發送一個附帶元數據的整型數據,需要創建一個對象,用對象中的一個 名稱/值對(name/value pair)來記錄整型數據的值,再為每一個附帶的屬性添加一個名稱/值對。接收到這個 JSON 的程序在讀取后很可能把它當成一個對象,可事實并不是這樣。雖然這是使用 JSON 傳遞元數據的一種變通方法,但他違背了 JSON 的核心理念:“ JSON 的結構與常規的程序語言中的結構相對應,而無需修改。(JSON’s structures look like conventional programming language structures. No restructuring is necessary.)” 1
雖然稍后我會說這也是 XML 的一個缺點,但 XML 中對命名沖突、 前綴(prefix)的處理機制賦予了它 JSON 所不具備的能力。程序員們可以通過前綴來把統一名稱給予兩個不同的實體。 2 當不同的實體在客戶端中使用的名稱相同時,這一特性會非常有用。
XML 的另一個優勢在于大多數的瀏覽器可以把它以 具有高可讀性和強組織性的方式(highly readable and organized way)展現給用戶。XML 的樹形結構讓它易于結構化,瀏覽器也讓用戶可以自行展開或折疊樹中的元素,這簡直就是調試的福音。
XML 對比 JSON 有一個很重要的優勢就是它可以記錄 混合內容(mixed content)。例如在 XML 中處理包含結構化標記的字符串時,程序員們只要把帶有標記的文本放在一個標簽內就可以了。可因為 JSON 只包含數據,沒有用于指明標簽的簡單方式,雖然可以使用處理元數據的解決方法,但這總有點濫用之嫌。
JSON 自身也有很多優點。其中最顯而易見的一點就是 JSON 比 XML 簡潔得多。因為 XML 中需要打開和關閉標簽,而 JSON 使用名稱/值對表示數據,使用簡單的 { 和 } 來標記對象,[ 和 ] 來標記數組,, 來表示數據的分隔,: 表示名稱和值的分隔。就算是使用 gzip 壓縮,JSON 還是比 XML 要小,而且耗時更少。 3 正如 Sumaray 和 Makki 在實驗中指出的那樣,JSON 在很多方面都比 XML 更具優勢,得出同樣結果的還有 Nurseitov、Paulson、Reynolds 和 Izurieta。首先,由于 JSON 文件天生的簡潔性,與包含相同信息的 XML 相比,JSON 總是更小,這意味著更快的傳輸和處理速度。第二,在不考慮大小的情況下,兩組研究 45 表明使用 JSON 執行序列化和反序列化的速度顯著優于使用 XML。第三,后續的研究指出 JSON 的處理在 CPU 資源的使用上也優于 XML。研究人員發現 JSON 在總體上使用的資源更少,其中更多的 CPU 資源消耗在用戶空間,系統空間消耗的 CPU 資源較少。這一實驗是在 RedHat 的設備上進行的,RedHat 表示更傾向于在用戶空間使用 CPU 資源。 6 不出意外,Sumaray 和 Makki 在研究里還說明了在移動設備上 JSON 的性能也優于 XML。 7 這是有道理的,因為 JSON 消耗的資源更少,而移動設備的性能也更弱。
JSON 的另一個優點在于其對對象和數組的表述和 宿主語言(host language)中的數據結構相對應,例如 對象(object)、 記錄(record)、 結構體(struct)、 字典(dictionary)、 哈希表(hash table)、 鍵值列表(keyed list)還有 數組(array)、 向量(vector)、 列表(list),以及對象組成的數組等等。 8 雖然 XML 里也能表達這些數據結構,也只需調用一個函數就能完成解析,而往往需要更多的代碼才能正確的完成 XML 的序列化和反序列化處理。而且 XML 對于人類來說不如 JSON 那么直觀,XML 標準缺乏對象、數組的標簽的明確定義。當結構化的標記可以替代嵌套的標簽時,JSON 的優勢極為突出。JSON 中的花括號和中括號則明確表示了數據的結構,當然這一優勢也包含前文中的問題,在表示元數據時 JSON 不如 XML 準確。
雖然 XML 支持 命名空間(namespace)與 前綴(prefix),但這不代表 JSON 沒有處理命名沖突的能力。比起 XML 的前綴,它處理命名沖突的方式更簡潔,在程序中的處理也更自然。在 JSON 里,每一個對象都在它自己的命名空間中,因此不同對象內的元素名稱可以隨意重復。在大多數編程語言中,不同的對象中的成員可以包含相同的名字,所以 JSON 根據對象進行名稱區分的規則在處理時更加自然。
也許 JSON 比 XML 更優的部分是因為 JSON 是 JavaScript 的子集,所以在 JavaScript 代碼中對它的解析或封裝都非常的自然。雖然這看起來對 JavaScript 程序非常有用,而其他程序則不能直接從中獲益,可實際上這一問題已經被很好的解決了。現在 JSON 的網站的列表上展示了 64 種不同語言的 175 個工具,它們都實現了處理 JSON 所需的功能。雖然我不能評價大多數工具的質量,但它們的存在明確了開發者社區擁抱 JSON 這一現象,而且它們切實簡化了在不同平臺使用 JSON 的難度。
簡單地說,XML 的目標是標記文檔。這和 JSON 的目標想去甚遠,所以只要用得到 XML 的地方就盡管用。它使用樹形的結構和包含語義的文本來表達混合內容以實現這一目標。在 XML 中可以表示數據的結構,但這并不是它的長處。
JSON 的目標是用于數據交換的一種結構化表示。它直接使用對象、數組、數字、字符串、布爾值這些元素來達成這一目標。這完全不同于文檔標記語言。正如上面說的那樣,JSON 沒有原生支持 混合內容(mixed content)的記錄。
這些主流的開放 API 僅提供 XML: 亞馬遜產品廣告 API(Amazon Product Advertising API)。
這些主流 API 僅提供 JSON: 臉書圖 API(Facebook Graph API)、 谷歌地圖 API(Google Maps API)、 推特 API(Twitter API)、AccuWeather API、Pinterest API、Reddit API、Foursquare API。
這些主流 API 同時提供 XML 和 JSON: 谷歌云存儲(Google Cloud Storage)、 領英 API(Linkedin API)、Flickr API。
根據 可編程網絡(Programmable Web) 9 的數據,最流行的 10 個 API 中只有一個是僅提供 XML 且不支持 JSON 的。其他的要么同時支持 XML 和 JSON,要么只支持 JSON。這表明了大多數應用開發者都更傾向于使用支持 JSON 的 API,原因大概是 JSON 更快的處理速度與良好口碑,加之與 XML 相比更加輕量。此外,大多數 API 只是傳遞數據而非文檔,所以 JSON 更加合適。例如 Facebook 的重點在于用戶的交流與帖子,谷歌地圖則主要處理坐標和地圖信息,AccuWeather 就只傳遞天氣數據。總之,雖然不能說天氣 API 在使用時究竟是 JSON 用的多還是 XML 用的多,但是趨勢明確偏向了 JSON。 10 11
這些主流的桌面軟件仍然只是用 XML:Microsoft Word、Apache OpenOffice、LibraOffice。
因為這些軟件需要考慮引用、格式、存儲等等,所以比起 JSON,XML 優勢更大。另外,這三款程序都支持混合內容,而 JSON 在這一點上做得并不如 XML 好。舉例說明,當用戶使用 Microsoft Word 編輯一篇論文時,用戶需要使用不同的文字字形、文字大小、文字顏色、頁邊距、段落格式等,而 XML 結構化的組織形式與標簽屬性生來就是為了表達這些信息的。
這些主流的數據庫支持 XML:IBM DB2、Microsoft SQL Server、Oracle Database、PostgresSQL、BaseX、eXistDB、MarkLogic、MySQL。
這些是支持 JSON 的主流數據庫:MongoDB、CouchDB、eXistDB、Elastisearch、BaseX、MarkLogic、OrientDB、Oracle Database、PostgreSQL、Riak。
在很長一段時間里,SQL 和關系型數據庫統治著整個數據庫市場。像 甲骨文(Oracle)和 微軟(Microsoft)這樣的軟件巨頭都提供這類數據庫,然而近幾年 NoSQL 數據庫正逐步受到開發者的青睞。也許是正巧碰上了 JSON 的普及,大多數 NoSQL 數據庫都支持 JSON,像 MongoDB、CouchDB 和 Riak 這樣的數據庫甚至使用 JSON 來存儲數據。這些數據庫有兩個重要的特性是它們適用于現代網站:一是它們與關系型數據庫相比 更容易擴展(more scalable);二是它們設計的目標就是 web 運行所需的核心組件。 12 由于 JSON 更加輕量,又是 JavaScript 的子集,所以很適合 NoSQL 數據庫,并且讓這兩個品質更容易實現。此外,許多舊的關系型數據庫增加了 JSON 支持,例如 Oracle Database 和 PostgreSQL。由于 XML 與 JSON 間的轉換比較麻煩,所以大多數開發者會直接在他們的應用里使用 JSON,因此開發數據庫的公司才有支持 JSON 的理由。(LCTT 譯注:NoSQL 是對不同于傳統的關系數據庫的數據庫管理系統的統稱。 參考來源 ) 13
對互聯網的種種變革中,最讓人期待的便是 物聯網(Internet of Things)(IoT)。這會給互聯網帶來大量計算機之外的設備,例如手表、溫度計、電視、冰箱等等。這一勢頭的發展良好,預期在不久的將來迎來爆發式的增長。據估計,到 2020 年時會有 260 億 到 2000 億的物聯網設備被接入互聯網。 14 15 幾乎所有的物聯網設備都是小型設備,因此性能比筆記本或臺式電腦要弱很多,而且大多數都是嵌入式系統。因此,當它們需要與互聯網上的系統交換數據時,更輕量、更快速的 JSON 自然比 XML 更受青睞。 16 受益于 JSON 在 web 上的快速普及,與 XML 相比,這些新的物聯網設備更有可能從使用 JSON 中受益。這是一個典型的梅特卡夫定律的例子,無論是 XML 還是 JSON,抑或是什么其他全新的格式,現存的設備和新的設備都會從支持最廣泛使用的格式中受益。
Node.js 是一款服務器端的 JavaScript 框架,隨著她的誕生與快速成長,與 MongoDB 等 NoSQL 數據庫一起,讓全棧使用 JavaScript 開發成為可能。這些都預示著 JSON 光明的未來,這些軟件的出現讓 JSON 運用在全棧開發的每一個環節成為可能,這將使應用更加輕量,響應更快。這也是任何應用的追求之一,所以,全棧使用 JavaScript 的趨勢在不久的未來都不會消退。 17
此外,另一個應用開發的趨勢是從 SOAP 轉向 REST。 18 19 20 XML 和 JSON 都可以用于 REST,可 SOAP 只能使用 XML。
從這些趨勢中可以推斷,JSON 的發展將統一 Web 的信息交換格式,XML 的使用率將繼續降低。雖然不應該把 JSON 吹過頭了,因為 XML 在 Web 中的使用依舊很廣,而且它還是 SOAP 的唯一選擇,可考慮到 SOAP 到 REST 的遷移,NoSQL 數據庫和全棧 JavaScript 的興起,JSON 卓越的性能,我相信 JSON 很快就會在 Web 開發中超過 XML。至于其他領域,XML 比 JSON 更好的情況并不多。
via: https://www.cs.tufts.edu/comp/150IDS/final_papers/tstras01.1/FinalReport/FinalReport.html
作者: TOM STRASSNER 選題: lujun9972 譯者: wwhio 校對: wxy
本文由 LCTT 原創編譯, Linux中國 榮譽推出
軟件開發領域,XML(eXtensible Markup Language)和JSON(JavaScript Object Notation)是兩種常用的結構化數據表示格式。它們在存儲和傳輸數據時起到了至關重要的作用,但它們各自有著不同的特點和適用場景。本文將深入探討XML和JSON,并通過使用C#設計典型的應用實例代碼來進一步說明它們的用法和區別。
XML是一種可擴展的標記語言,旨在提供一種方法來描述數據結構和存儲數據。它使用起始標簽和結束標簽來定義數據的層次結構,類似于HTML。以下是XML的一個示例:
<bookstore>
<book category="fiction">
<title>Harry Potter</title>
<author>J.K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="non-fiction">
<title>Introduction to XML</title>
<author>John Smith</author>
<year>2010</year>
<price>39.95</price>
</book>
</bookstore>
JSON是一種輕量級的數據交換格式,通常用于Web應用程序中。它采用鍵/值對的方式來表示數據,類似于JavaScript中的對象字面量。以下是JSON的一個示例:
{
"bookstore": {
"book": [
{
"category": "fiction",
"title": "Harry Potter",
"author": "J.K. Rowling",
"year": 2005,
"price": 29.99
},
{
"category": "non-fiction",
"title": "Introduction to XML",
"author": "John Smith",
"year": 2010,
"price": 39.95
}
]
}
}
下面是使用C#讀取XML和JSON數據的示例代碼:
using System;
using System.Xml;
using Newtonsoft.Json.Linq;
class Program
{
static void Main()
{
// 讀取XML數據
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("data.xml");
XmlNodeList bookNodes = xmlDoc.SelectNodes("/bookstore/book");
foreach (XmlNode node in bookNodes)
{
Console.WriteLine("Title: {0}, Author: {1}",
node.SelectSingleNode("title").InnerText,
node.SelectSingleNode("author").InnerText);
}
// 讀取JSON數據
string jsonText = System.IO.File.ReadAllText("data.json");
JObject jsonObject = JObject.Parse(jsonText);
JArray booksArray = (JArray)jsonObject["bookstore"]["book"];
foreach (JToken book in booksArray)
{
Console.WriteLine("Title: {0}, Author: {1}",
book["title"],
book["author"]);
}
}
}
綜上所述,XML和JSON各有優缺點,并且適用于不同的應用場景。在選擇使用哪種結構化文本時,需要根據具體的需求和環境來進行綜合考慮。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。