CodeGym /Java Blog /Toto sisi /Java 中的 XML
John Squirrels
等級 41
San Francisco

Java 中的 XML

在 Toto sisi 群組發布
你好!今天我們將介紹另一種數據格式,稱為XML。這是一個非常重要的話題。在處理真正的 Java 應用程序時,您幾乎肯定會遇到與 XML 相關的任務。在 Java 開發中,這種格式幾乎被普遍使用(我們將在下面找出原因),所以我建議你不要膚淺地複習這節課,而是深入了解一切,並研究額外的文獻/鏈接 :) 這個絕對不會浪費時間。那麼,讓我們從簡單的事情開始:“什麼”和“為什麼”!

什麼是 Java XML?

XML 代表可擴展標記語言。您可能已經熟悉一種標記語言——您聽說過用於創建網頁的 HTML :) 什麼是XML? - 1HTML 和 XML 甚至具有相似的外觀:
HTML 1

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 1

<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML 2

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 2

<chief>title</chief>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
換句話說,XML 是一種描述數據的語言。

為什麼需要 XML?

XML 最初是為了更方便地存儲和發送數據而發明的,包括通過 Internet。它有幾個優勢可以幫助您實現這一目標。首先,它很容易被人和計算機閱讀。我想你可以很容易地理解這個 XML 文件描述的內容:

<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
計算機也很容易理解這種格式。其次,由於數據是以純文本形式存儲的,當我們將其從一台計算機傳輸到另一台計算機時,不會出現兼容性問題。了解 XML 不是可執行代碼很重要——它是一種數據描述語言。使用 XML 描述數據後,您需要編寫可以發送/接收/處理此數據的代碼(例如,在 Java 中)。

XML 是如何構造的?

主要組成部分是標籤:這些是尖括號中的東西:

<book>
</book>
有開始標籤和結束標籤。結束標記有一個附加符號 (" / "),如上例所示。每個開始標籤都必須有一個結束標籤。它們顯示文件中每個元素的描述開始和結束的位置。標籤可以嵌套!在我們的圖書示例中,<book> 標籤有 3 個嵌套標籤:<title>、<author> 和 <year>。這不限於一層嵌套:嵌套標籤可以有自己的嵌套標籤等。這種結構稱為標籤樹。讓我們使用描述汽車經銷商的示例 XML 文件來查看此樹:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
這裡我們有一個頂級標籤:<carstore>。它也被稱為根元素。<carstore> 有一個子標籤:<car>。<car> 也有 3 個子標籤:<model>、<year> 和 <price>。每個標籤都可以有屬性,這些屬性包含額外的重要信息。在我們的示例中,<model> 標籤有一個“lang”屬性,表示用於記錄模型名稱的語言:

<model lang="en">Scania R 770</model>
這裡我們指出名稱是用英文寫的。我們的 <price> 標籤有一個“貨幣”屬性。

<price currency="US dollar">150000.00</price>
這裡我們指出汽車的價格是以美元給出的。因此,XML 具有“自描述”語法。您可以添加描述數據所需的任何信息。此外,在文件的頂部,您可以添加一行指示 XML 版本和用於寫入數據的編碼。這稱為“prolog”,它看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?>
我們使用 XML 1.0 版和 UTF-8 編碼。這不是必需的,但如果您的文件使用不同語言的文本,它會派上用場。我們提到 XML 的意思是“可擴展標記語言”,但是“可擴展”是什麼意思呢?這意味著它非常適合創建新版本的對象和文件。例如,假設我們也想在我們的汽車經銷商處開始銷售摩托車!也就是說,我們需要我們的程序需要支持 <carstore> 的兩個版本:舊版本(沒有摩托車)和新版本。這是我們的舊版本:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
這是新的擴展版:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
這就是將摩托車的描述添加到我們的文件中是多麼容易和簡單:) 而且,我們絕對不需要為摩托車使用與汽車相同的子標籤。請注意,與汽車不同,摩托車有一個 <owner> 元素。這不會阻止計算機(或人)讀取數據。

XML 和 HTML 之間的差異

我們已經說過,XML 和 HTML 在外觀上非常相似。這使得了解它們的不同之處變得非常重要。首先,它們用於不同的目的。HTML 用於標記網頁。例如,在創建網站時,您可以使用 HTML 指定:“菜單應該在右上角。它應該有這樣那樣的按鈕”。換句話說,HTML 的工作是顯示數據。XML 用於以方便人類和計算機的形式存儲和發送信息。此格式不包含任何有關應如何顯示此數據的指示:這取決於讀取它的程序代碼。其次,存在重大的技術差異。HTML 標籤是預定義的。換句話說,創建 HTML 標頭(例如,頁面頂部的大標題)僅使用 <h1></h1> 標籤(<h2></h2> 和 <h3></h3> 用於較小的標題)。您不能使用其他標記創建 HTML 標頭。XML 不使用預定義的標籤。您可以給標籤起任何您想要的名稱:<header>、<title>、<idontknow2121>。

解決衝突

XML 提供的自由可能會導致一些問題。例如,同一個實體(例如,一輛汽車)可以被程序用於不同的目的。例如,我們有一個描述汽車的 XML 文件。但是,我們的程序員之間並沒有事先達成一致。現在,除了關於真車的數據外,我們還可以在 XML 中找到關於玩具車的數據!而且,它們具有相同的屬性。假設我們的程序讀取這樣一個 XML 文件。我們如何區分真車和玩具車?

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
這裡的前綴和命名空間將幫助我們。為了在我們的程序中區分玩具汽車和真實汽車(實際上是任何玩具與其真實對應物),我們引入了兩個前綴:“real”和“toy”。

<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
現在我們的程序就能區分不同的實體了!所有帶有 toy 前綴的都將被視為玩具 :) 然而,我們還沒有完成。要使用前綴,我們需要將它們中的每一個註冊為一個命名空間。實際上,“註冊”是一個很重要的詞 :) 我們只需要為它們中的每一個起一個唯一的名字。這就像類:一個類有一個短名稱 ( Cat ) 和一個包含所有包的完全限定名稱 ( zoo.animals.Cat). URI 通常用於創建唯一的名稱空間名稱。有時這是使用 Internet 地址完成的,其中描述了此名稱空間的功能。但它不必是有效的 Internet 地址。通常,項目只是使用類似 URI 的字符串來幫助跟踪命名空間層次結構。這是一個例子:

<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
當然,在“http://testproject.developersgroup1.companyname/department2/namespaces/real”處沒有網站,但這個字符串確實包含有用的信息:部門 2 中的 Group 1 的開發人員負責創建“real”命名空間. 如果我們需要引入新名稱或討論可能的衝突,我們會知道該去哪裡。有時,開發人員使用真實的描述性網址作為唯一的命名空間名稱。例如,一家大公司的項目可能會被全球數百萬人使用。但這當然並不總是如此:Stack Overflow對此問題進行了討論。通常,沒有嚴格要求使用 URI 作為名稱空間名稱:您也可以簡單地使用隨機字符串。這個選項也可以工作:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
也就是說,使用 URI 有幾個優點。您可以在此處閱讀更多相關信息。

基本的 XML 標準

XML 標準是一組向 XML 文件添加額外功能的擴展。XML 有很多標準,但我們只看最重要的標準,就會發現它們使 AJAX 成為可能,AJAX 是最著名的 XML 標準之一。它使您無需重新加載即可更改網頁的內容!XSLT 允許您將 XML 文本轉換為其他格式。例如,您可以使用 XSLT 將 XML 轉換為 HTML!正如我們所說,XML 的目的是描述數據,而不是顯示數據。但是使用 XSLT 我們可以繞過這個限制!XML DOM 允許您從 XML 文件中檢索、修改、添加或刪除單個元素。這是一個如何工作的小例子。我們有一個 books.xml 文件:

<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J. K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
它有兩本書。書籍有一個 <title> 元素。在這裡,我們可以使用 JavaScript 從我們的 XML 文件中獲取所有的書名,並將第一個打印到控制台:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
DTD(“文檔類型定義”)允許您為 XML 文件中的實體定義允許的元素列表。例如,假設我們正在一個書店網站上工作,並且所有開發團隊都同意只應為 XML 文件中的書籍元素指​​定標題、作者和年份屬性。但是我們如何保護自己免受粗心大意呢?好簡單!

<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
這裡我們為 <book> 定義了一個有效屬性列表。嘗試在那裡添加一個新元素,你會立即得到一個錯誤!

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
錯誤!“Element mainhero is not allowed here” 還有很多其他的 XML 標準。您可以熟悉它們中的每一個,並嘗試更深入地研究代碼。不管怎樣,如果您需要有關 XML 的信息,幾乎可以在那裡找到所有信息 :) 至此,我們的課程就結束了。是時候回到任務中了!:) 直到下一次!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION