JavaRush /Java Blog /Random-TW /Java 中的 XML:它是什麼?

Java 中的 XML:它是什麼?

在 Random-TW 群組發布
你好!今天我們將了解另一種資料格式,稱為 XML。這是一個非常重要的主題。在開發真正的 Java 應用程式時,您幾乎肯定會遇到與 XML 相關的問題。這種格式在 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>。它也稱為“root”——根標籤。<carstore> 有一個子標籤 <car>。反過來,<car> 也有 3 個自己的子標籤 - <model>、<year> 和 <price>。每個標籤都可以有屬性 - 附加的重要資訊。在我們的範例中,<model> 標籤有一個屬性「lang」 - 模型名稱的書寫語言:
<model lang="en">Scania R 770</model>
這樣我們就可以表明標題是用英文寫的。我們的 <price> 標籤有一個「currency」屬性。
<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>
現在我們的程式將能夠區分實體!任何帶有玩具前綴的東西都將被歸類為玩具:)但是,我們還沒有完成。要使用前綴,我們需要將每個前綴註冊為命名空間。好吧,實際上,「註冊」是一個很強烈的詞:)您只需為每個都想出一個唯一的名稱。就像類別一樣:類別有一個短名稱 ( Cat) 和一個包含所有套件的全名稱 ( zoo.animals.Cat) 。為了創建唯一的命名空間,通常使用 URI。有時,此處會替換網際網路位址,其中詳細描述了該名稱空間的功能和用途。但這不一定是有效的網路位址。很多時候,專案只是使用類似 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 的站點 ,但有有用的資訊:來自「department2」部門的開發人員群組「developersgroup1」負責建立「真正的」命名空間。如果您需要新增名稱,或與他們討論可能的衝突,我們知道該向何處尋求協助。有時,帶有此名稱空間描述的真實互聯網位址被用作名稱空間的唯一名稱。例如,如果它是一家大公司,它的專案將被全球數百萬人使用。但這並不總是可行:Stackoverflow上對此問題進行了討論。原則上,使用 URI 作為命名空間名稱的要求並不嚴格:您可以只使用隨機字串。此選項也將起作用:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
但使用 URI 有許多優點。您可以在此處閱讀有關此內容的更多資訊。

基本 XML 標準

XML 標準是一組為 xml 檔案新增附加功能的擴充。 XML 有許多標準,但我們只專注於最重要的標準,並了解它們允許 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 文件中的某些實體定義允許的元素清單。例如,我們正在開發一個書店網站,所有開發團隊都同意對於 book 元素,只應在 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」 還有許多其他 XML 標準。您可以熟悉它們中的每一個,並嘗試深入研究WC3 網站上的程式碼(「重要 XML 標準」部分)。一般來說,如果您需要有關 XML 的信息,您幾乎可以在那裡找到所有內容 :) 好了,我們的講座已經結束了。是時候回去執行任務了!:) 再見!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION