沉淀再出發:xml的意義和存在的價值
一、前言
學習了那么多的語言、框架、語法和基礎知識,我們對於數據的理解或許有了一定的認識,但是如何描述、包裝、傳輸、存儲數據的手法和流程我們了解的或許並不多,其中xml就是一種我們經常使用的用來傳輸和存儲數據來描述信息的方法了。
二、xml的意義
2.1、xml簡介
XML 指可擴展標記語言(eXtensible Markup Language),XML 被設計用來傳輸和存儲數據。HTML 被設計用來顯示數據。
1 XML 指可擴展標記語言(EXtensible Markup Language)。 2 XML 是一種很像HTML的標記語言。 3 XML 的設計宗旨是傳輸數據,而不是顯示數據。 4 XML 標簽沒有被預定義。您需要自行定義標簽。 5 XML 被設計為具有自我描述性。 6 XML 是 W3C 的推薦標准。
XML 和 HTML 之間的差異:
1 XML 不是 HTML 的替代,XML 和 HTML 為不同的目的而設計: 2 XML 被設計用來傳輸和存儲數據,其焦點是數據的內容。 3 HTML 被設計用來顯示數據,其焦點是數據的外觀。 4 HTML 旨在顯示信息,而 XML 旨在傳輸信息。 5 XML 被設計用來結構化、存儲以及傳輸信息,XML 不會做任何事情,並且具有自我描述性。 6 XML 語言沒有預定義的標簽,通過 XML 可以發明自己的標簽,這些標簽是由 XML 文檔的創作者發明的。HTML 中使用的標簽都是預定義的。HTML 文檔只能使用在 HTML 標准中定義過的標簽。 7 XML 允許創作者定義自己的標簽和自己的文檔結構。 8 XML 不是對 HTML 的替代,XML 是對 HTML 的補充。 9 XML 不會替代 HTML,在大多數 Web 應用程序中,XML 用於傳輸數據,而 HTML 用於格式化並顯示數據。
對 XML 最好的描述是:
1 XML 是獨立於軟件和硬件的信息傳輸工具。 2 XML 是 W3C 的推薦標准,XML 於 1998 年 2 月 10 日成為 W3C 的推薦標准。 3 目前,XML 在 Web 中起到的作用不會亞於一直作為 Web 基石的 HTML。XML 是各種應用程序之間進行數據傳輸的最常用的工具。
XML 應用於 Web 開發的許多方面,常用於簡化數據的存儲和共享。
1、XML 把數據從 HTML 分離:如果需要在 HTML 文檔中顯示動態數據,那么每當數據改變時將花費大量的時間來編輯 HTML。通過 XML,數據能夠存儲在獨立的 XML 文件中。這樣就可以專注於使用 HTML/CSS 進行顯示和布局,並確保修改底層數據不再需要對 HTML 進行任何的改變。通過使用幾行 JavaScript 代碼,就可以讀取一個外部 XML 文件,並更新的網頁的數據內容。
2、XML 簡化數據共享:在真實的世界中,計算機系統和數據使用不兼容的格式來存儲數據。XML 數據以純文本格式進行存儲,因此提供了一種獨立於軟件和硬件的數據存儲方法,這讓創建不同應用程序可以共享的數據變得更加容易。
3、XML 簡化數據傳輸:對開發人員來說,其中一項最費時的挑戰一直是在互聯網上的不兼容系統之間交換數據。由於可以通過各種不兼容的應用程序來讀取數據,以 XML 交換數據降低了這種復雜性。
4、XML 簡化平台變更升級到新的系統(硬件或軟件平台),總是非常費時的。必須轉換大量的數據,不兼容的數據經常會丟失。XML 數據以文本格式存儲。這使得 XML 在不損失數據的情況下,更容易擴展或升級到新的操作系統、新的應用程序或新的瀏覽器。
5、XML 使數據更有用:不同的應用程序都能夠訪問數據,不僅僅在 HTML 頁中,也可以從 XML 數據源中進行訪問。通過 XML,數據可供各種閱讀設備使用(掌上計算機、語音設備、新聞閱讀器等),還可以供盲人或其他殘障人士使用。
6、XML 用於創建新的互聯網語言:很多新的互聯網語言是通過 XML 創建的。
XHTML 用於描述可用的 Web 服務 的 WSDL 作為手持設備的標記語言的 WAP 和 WML 用於新聞 feed 的 RSS 語言 描述資本和本體的 RDF 和 OWL 用於描述針針對 Web 的多媒體 的 SMIL
2.2、xml的結構和語法
XML 文檔形成一種樹結構,XML 文檔必須包含根元素。該元素是所有其他元素的父元素。XML 文檔中的元素形成了一棵文檔樹。這棵樹從根部開始,並擴展到樹的最底端。
所有的元素都可以有子元素:
1 <root> 2 <child> 3 <subchild>.....</subchild> 4 </child> 5 </root>
比如:
1 <bookstore> 2 <book category="COOKING"> 3 <title lang="en">Everyday Italian</title> 4 <author>Giada De Laurentiis</author> 5 <year>2005</year> 6 <price>30.00</price> 7 </book> 8 <book category="CHILDREN"> 9 <title lang="en">Harry Potter</title> 10 <author>J K. Rowling</author> 11 <year>2005</year> 12 <price>29.99</price> 13 </book> 14 <book category="WEB"> 15 <title lang="en">Learning XML</title> 16 <author>Erik T. Ray</author> 17 <year>2003</year> 18 <price>39.95</price> 19 </book> 20 </bookstore>
在 HTML 中,某些元素不必有一個關閉標簽:<br>;在 XML 中,省略關閉標簽是非法的,所有的 XML 元素都必須有一個關閉標簽。打開標簽和關閉標簽通常被稱為開始標簽和結束標簽。
1 XML 標簽對大小寫敏感; 2 XML 必須正確嵌套; 3 XML 文檔必須有根元素; 4 XML 屬性值必須加引號; 5 在 XML 中,一些字符擁有特殊的意義。 6 如果把字符 "<" 放在 XML 元素中,會發生錯誤,這是因為解析器會把它當作新元素的開始。為了避免這個錯誤,請用實體引用來代替 "<" 字符: 7 在 XML 中,有 5 個預定義的實體引用: 8 < < less than 9 > > greater than 10 & & ampersand 11 ' ' apostrophe 12 " " quotation mark 13 在 XML 中,只有字符 "<" 和 "&" 確實是非法的。大於號是合法的,但是用實體引用來代替它是一個好習慣。 14 XML 中的注釋:在 XML 中編寫注釋的語法與 HTML 的語法很相似。 15 <!-- This is a comment --> 16 HTML 會把多個連續的空格字符裁減(合並)為一個,在 XML 中,空格會被保留,不會被刪減。 17 XML 以 LF 存儲換行:在 Windows 應用程序中,換行通常以一對字符來存儲:回車符(CR)和換行符(LF)。在 Unix 和 Mac OSX 中,使用 LF 來存儲新行。在舊的 Mac 系統中,使用 CR 來存儲新行。XML 以 LF 存儲換行。
2.3、XML 命名規則
1 XML 元素必須遵循以下命名規則: 2 名稱可以包含字母、數字以及其他的字符 3 名稱不能以數字或者標點符號開始 4 名稱不能以字母 xml(或者 XML、Xml 等等)開始 5 名稱不能包含空格 6 可使用任何名稱,沒有保留的字詞。 7 最佳命名習慣: 8 使名稱具有描述性。使用下划線的名稱也很不錯:<first_name>、<last_name>。 9 名稱應簡短和簡單,比如:<book_title>,而不是:<the_title_of_the_book>。 10 避免 "-" 字符。如果您按照這樣的方式進行命名:"first-name",一些軟件會認為您想要從 first 里邊減去 name。 11 避免 "." 字符。如果您按照這樣的方式進行命名:"first.name",一些軟件會認為 "name" 是對象 "first" 的屬性。 12 避免 ":" 字符。冒號會被轉換為命名空間來使用。 13 XML 文檔經常有一個對應的數據庫,其中的字段會對應 XML 文檔中的元素。有一個實用的經驗,即使用數據庫的命名規則來命名 XML 文檔中的元素。
XML 元素是可擴展的,以攜帶更多的信息。
請看下面的 XML 實例:
<note> <to>Tove</to> <from>Jani</from> <body>Don't forget me this weekend!</body> </note>
讓我們設想一下,我們創建了一個應用程序,可將 <to>、<from> 以及 <body> 元素從 XML 文檔中提取出來,並產生以下的輸出:
MESSAGE To: Tove From: Jani Don't forget me this weekend!
XML 文檔的作者再添加的一些額外信息:
<note> <date>2018-10-1</date> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
那么這個應用程序不會中斷或崩潰,這個應用程序仍然可以找到 XML 文檔中的 <to>、<from> 以及 <body> 元素,並產生同樣的輸出。XML 的優勢之一,就是可以在不中斷應用程序的情況下進行擴展。
2.4、xml的元素和屬性的選用
XML元素具有屬性,類似 HTML,屬性(Attribute)提供有關元素的額外信息。
屬性通常提供不屬於數據組成部分的信息。文件類型與數據無關,但是對需要處理這個元素的軟件來說卻很重要。屬性值必須被引號包圍,不過單引號和雙引號均可使用。比如一個人的性別,person 元素可以這樣寫:
<person sex="female"> <person sex='female'>
如果屬性值本身包含雙引號,可以使用單引號:
<gangster name='George "Shotgun" Ziegler'> <gangster name="George "Shotgun" Ziegler">
XML 元素和屬性:
<person sex="female"> <firstname>Anna</firstname> <lastname>Smith</lastname> </person> <person> <sex>female</sex> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
在第一個實例中,sex 是一個屬性。在第二個實例中,sex 是一個元素。這兩個實例都提供相同的信息。
沒有什么規矩可以告訴我們什么時候該使用屬性,而什么時候該使用元素。在 HTML 中,屬性用起來很便利,但是在 XML 中,應該盡量避免使用屬性。如果信息感覺起來很像數據,那么請使用元素吧。
下面的三個 XML 文檔包含完全相同的信息:
第一個實例中使用了 date 屬性: <note date="10/01/2008"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> 第二個實例中使用了 date 元素: <note> <date>10/01/2008</date> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> 第三個實例中使用了擴展的 date 元素(建議): <note> <date> <day>10</day> <month>01</month> <year>2008</year> </date> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
避免 XML 屬性的原因是使用屬性而引起的一些問題:
屬性不能包含多個值(元素可以) 屬性不能包含樹結構(元素可以) 屬性不容易擴展 屬性難以閱讀和維護。
盡量使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息。
不要做這樣的蠢事(這不是 XML 應該被使用的方式): <note day="10" month="01" year="2008" to="Tove" from="Jani" heading="Reminder" body="Don't forget me this weekend!"> </note>
針對元數據的 XML 屬性:有時候會向元素分配 ID 引用。這些 ID 索引可用於標識 XML 元素,它起作用的方式與 HTML 中 id 屬性是一樣的。這個實例向我們演示了這種情況:
<messages> <note id="501"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> <note id="502"> <to>Jani</to> <from>Tove</from> <heading>Re: Reminder</heading> <body>I will not</body> </note> </messages>
上面的 id 屬性僅僅是一個標識符,用於標識不同的便簽,它並不是便簽數據的組成部分。元數據(有關數據的數據)應當存儲為屬性,而數據本身應當存儲為元素。
2.5、xml DTD和shema
XML DTD:擁有正確語法的 XML 被稱為"形式良好"的 XML。通過 DTD(文檔類型定義) 驗證的XML是"合法"的 XML。"形式良好"的 XML 文檔擁有正確的語法。
<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
DOCTYPE 聲明是對外部 DTD 文件的引用。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE note SYSTEM "Note.dtd"> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
DTD 的目的是定義 XML 文檔的結構。它使用一系列合法的元素來定義文檔結構:
<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]>
XML Schema:W3C 支持一種基於 XML 的 DTD 代替者,它名為 XML Schema:
<xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
一個通用的 XML 驗證器:為了幫助您檢查 XML 文件的語法,我們創建了 XML 驗證器,以便您對任何 XML 文件進行語法檢查。使用我們的 XML 驗證器來對您的 XML 文件進行語法檢查。XML 文檔中的錯誤會終止您的 XML 應用程序。
1 var xt="",h3OK=1 2 function checkErrorXML(x) 3 { 4 xt="" 5 h3OK=1 6 checkXML(x) 7 } 8 9 function checkXML(n) 10 { 11 var l,i,nam 12 nam=n.nodeName 13 if (nam=="h3") 14 { 15 if (h3OK==0) 16 { 17 return; 18 } 19 h3OK=0 20 } 21 if (nam=="#text") 22 { 23 xt=xt + n.nodeValue + "\n" 24 } 25 l=n.childNodes.length 26 for (i=0;i<l;i++) 27 { 28 checkXML(n.childNodes[i]) 29 } 30 } 31 32 function validateXML(txt) 33 { 34 // code for IE 35 if (window.ActiveXObject) 36 { 37 var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 38 xmlDoc.async=false; 39 xmlDoc.loadXML(document.all(txt).value); 40 41 if(xmlDoc.parseError.errorCode!=0) 42 { 43 txt="Error Code: " + xmlDoc.parseError.errorCode + "\n"; 44 txt=txt+"Error Reason: " + xmlDoc.parseError.reason; 45 txt=txt+"Error Line: " + xmlDoc.parseError.line; 46 alert(txt); 47 } 48 else 49 { 50 alert("沒有找到錯誤!"); 51 } 52 } 53 // code for Mozilla, Firefox, Opera, etc. 54 else if (document.implementation.createDocument) 55 { 56 var parser=new DOMParser(); 57 var text=document.getElementById(txt).value; 58 var xmlDoc=parser.parseFromString(text,"text/xml"); 59 60 if (xmlDoc.getElementsByTagName("parsererror").length>0) 61 { 62 checkErrorXML(xmlDoc.getElementsByTagName("parsererror")[0]); 63 alert(xt) 64 } 65 else 66 { 67 alert("沒有找到錯誤!"); 68 } 69 } 70 else 71 { 72 alert('您的瀏覽器不支持 XML 驗證器'); 73 } 74 }
W3C 的 XML 規范聲明:如果 XML 文檔存在錯誤,那么程序就不應當繼續處理這個文檔。理由是,XML 軟件應當輕巧,快速,具有良好的兼容性。如果使用 HTML,創建包含大量錯誤的文檔是有可能的(比如忘記了結束標簽)。其中一個主要的原因是 HTML 瀏覽器相當臃腫,兼容性也很差,並且它們有自己的方式來確定當發現錯誤時文檔應該顯示為什么樣子。使用 XML 時,這種情況不應當存在。
查看 XML 文件:在所有主流的瀏覽器中,均能夠查看原始的 XML 文件。不要指望 XML 文件會直接顯示為 HTML 頁面。XML 文檔將顯示為代碼顏色化的根以及子元素。通過點擊元素左側的加號(+)或減號( - ),可以展開或收起元素的結構。要查看原始的 XML 源(不包括 + 和 - 符號),選擇"查看頁面源代碼"或從瀏覽器菜單"查看源文件"。
查看無效的 XML 文件:如果一個錯誤的XML文件被打開,瀏覽器會報告錯誤。
XML 文檔不會攜帶有關如何顯示數據的信息。由於 XML 標簽由 XML 文檔的作者"發明",瀏覽器無法確定像 <table> 這樣一個標簽究竟描述一個 HTML 表格還是一個餐桌。在沒有任何有關如何顯示數據的信息的情況下,大多數的瀏覽器都會僅僅把 XML 文檔顯示為源代碼。
通過使用 CSS(Cascading Style Sheets 層疊樣式表),可以添加顯示信息到 XML 文檔中。但是使用 CSS 格式化 XML 不是常用的方法。
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
通過使用 XSLT,可以把 XML 文檔轉換成 HTML 格式。XSLT 是首選的 XML 樣式表語言。XSLT(eXtensible Stylesheet Language Transformations)遠比 CSS 更加完善。XSLT 是在瀏覽器顯示 XML 文件之前,先把它轉換為 HTML;在使用 XSLT 來轉換 XML 時,不同的瀏覽器可能會產生不同結果。為了減少這種問題,可以在服務器上進行 XSLT 轉換。
三、其他知識
3.1、XMLHttpRequest 對象
XMLHttpRequest 對象用於在后台與服務器交換數據。XMLHttpRequest 對象是開發者的夢想,因為能夠:
在不重新加載頁面的情況下更新網頁 在頁面已加載后從服務器請求數據 在頁面已加載后從服務器接收數據 在后台向服務器發送數據
所有現代瀏覽器(IE7+、Firefox、Chrome、Safari 和 Opera)都有內建的 XMLHttpRequest 對象。
創建 XMLHttpRequest 對象的語法:
xmlhttp=new XMLHttpRequest();
舊版本的Internet Explorer(IE5和IE6)中使用 ActiveX 對象:
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
3.2、XML 解析器
所有現代瀏覽器都有內建的 XML 解析器。XML 解析器把 XML 文檔轉換為 XML DOM 對象,可通過 JavaScript 操作的對象。
解析 XML 文檔:下面的代碼片段把 XML 文檔解析到 XML DOM 對象中:
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET","books.xml",false); xmlhttp.send(); xmlDoc=xmlhttp.responseXML;
解析 XML 字符串:下面的代碼片段把 XML 字符串解析到 XML DOM 對象中(Internet Explorer 使用 loadXML() 方法來解析 XML 字符串,而其他瀏覽器使用 DOMParser 對象):
txt="<bookstore><book>"; txt=txt+"<title>Everyday Italian</title>"; txt=txt+"<author>Giada De Laurentiis</author>"; txt=txt+"<year>2005</year>"; txt=txt+"</book></bookstore>"; if (window.DOMParser) { parser=new DOMParser(); xmlDoc=parser.parseFromString(txt,"text/xml"); } else // Internet Explorer { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async=false; xmlDoc.loadXML(txt); }
跨域訪問:出於安全方面的原因,現代的瀏覽器不允許跨域的訪問。這意味着,網頁以及它試圖加載的 XML 文件,都必須位於相同的服務器上。
3.3、DOM
XML DOM:XML DOM(XML Document Object Model)定義了訪問和操作 XML 文檔的標准方法。XML DOM 把 XML 文檔作為樹結構來查看。所有元素可以通過 DOM 樹來訪問。可以修改或刪除它們的內容,並創建新的元素。元素,它們的文本,以及它們的屬性,都被認為是節點。
HTML DOM:HTML DOM 定義了訪問和操作 HTML 文檔的標准方法。所有 HTML 元素可以通過 HTML DOM 來訪問。
四、總結
在這里我們簡單的了解了xml這種格式的文本,以及相應的作用,其實還有很多的細節,比如對dom的操作等等方法都是值得我們去學習的。