前言:
XML指可擴展標記語言(eXtensible Markup Language),被設計用來傳輸和存儲數據。我們在jQuery中講解了現在流行了JSON,但是爲了更好的學習之後的框架,我們還是來看看XML教程。
首先,我們依舊從一個簡單的例子開始:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heding>Reminder</heding>
<body>Don't forget me this weekend!</boy>
</note>
1、什麼是XML?
1)XML指可擴展標記語言
2)XML是一種很像HTML的標記語言
3)XML的設計宗旨是傳輸數據,而不是顯示數據。
4)XML標籤沒有被預定義,你需要自行定義標籤
5)XML被設計爲具有自我描述性
6)XML是W3C的推薦標準。
那我們很快就可以看出,XML的焦點是數據的內容,HTML的焦點是數據的外觀。
2、XML用途
1)XML把數據從HTML分離
如果您需要在HTML文檔中顯示動態數據,每當數據改變時,需要花費大量時間來編輯HTML,通過XML,數據可以獨立存儲在XML文件中(當然啦,我們肯定是可以通過JavaScript來改變的)。所以通過使用幾行JavaScript代碼,就可以讀取到一個外部XML文件,並更新網頁的數據內容。
3、XML樹結構
我們上面的例子中,第一行是XML聲明,定義版本和使用的編碼,之後就是根元素和子元素。我們很清楚HTML中DOM的樹結構,那麼我們看看XML文檔的樹結構吧。
4、語法
1)文檔必須有根元素
2)XML聲明文件時可選的,如果需要要放到文檔的第一行
3)每一個元素都必須有一個關閉標籤
4)標籤對大小寫敏感。
5)屬性值必須加引號
6)當然,這裏也有實體引用
< | < | less than |
---|---|---|
> | > | greater than |
& | & | ampersand |
' | ' | apostrophe |
" | " | quotation mark |
7)註釋,和HTML一樣<!-- comment -->
8)在HML中,空格會被保留
9)XML以LF存儲換行
在Windows應用程序中,換行通常用一對字符來存儲:回車符(CR)和換行符(LF)
在Unix和Mac OSX中,使用LF來存儲新行。
在舊的Mac系統中,使用CR來存儲新行。
XML以LF存儲換行(我們用'\n'就好~)。
5、XML元素
XML元素指的是從(且包括)開始標籤直到(且包括)結束標籤的部分。
一個元素可以包括:
-
其他元素
-
文本
-
屬性
-
或混合以上所有...
1)命名規則
雖然大多和編程語言命名規則一致,但有所差別:
-
名稱可以包含字母、數字以及其他的字符
-
名稱不能以數字或者標點符號開始
-
名稱不能以字母 xml(或者 XML、Xml 等等)開始
-
名稱不能包含空格
好的命名就是具有描述性,用下換線之類的,避免使用奇怪的字符。
6、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>
1)我們要注意屬性不能包含多個值(元素可以);屬性不能包含樹結構;屬性不容易擴展。
2)針對元數據的XML屬性:
這裏分配ID引用,僅僅是爲了標識XML元素:
<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>
7、驗證
擁有正確語法的XML被稱爲“形式良好”的XML,通過DTD驗證的XML是合法的XML。
1)驗證XML文檔
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>
這個文件的內容如下:
<!DOCTYPE note
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
2)也可以使用XML Schema代替DTD。
<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>
3)驗證器
可以用一個通過的XML驗證器
驗證部分擴展-簡潔DTD教程
DTD(文檔類型定義)的作用是定義XML文檔的合法合併模塊,可以成行的聲明與XML文檔中,也可以作爲一個外部引用。
1、簡介
1)內部DOCTYPE聲明
加入DTD被包含在你的XML源文件中,它正確通過下面的語法包裝在一個DOCTYPE聲明中:
<!DOCTYPE root-element [element-declarations]>
例如:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
-
!DOCTYPE note (第二行)定義此文檔是 note 類型的文檔。
-
!ELEMENT note (第三行)定義 note 元素有四個元素:"to、from、heading,、body"
-
!ELEMENT to (第四行)定義 to 元素爲 "#PCDATA" 類型
-
!ELEMENT from (第五行)定義 from 元素爲 "#PCDATA" 類型
-
!ELEMENT heading (第六行)定義 heading 元素爲 "#PCDATA" 類型
-
!ELEMENT body (第七行)定義 body 元素爲 "#PCDATA" 類型
2)外部文檔聲明
<!DOCTYPE root-element SYSTEM "filename">
<?xml version="1.0"?>
<!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的note.dtd文件:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
通過DTD,你的每一個XML文件均可攜帶一個有相關自身格式的描述,可以一致的使用某個DTD來交換數據,也可以驗證自身的數據。
2、DTD-XML構建模塊
1、XML文檔構造模塊:
-
元素
-
屬性
-
實體
-
PCDATA
-
CDATA
這裏我們解釋PCDATA:
PCDATA的意思是被解析的字符數據(parsed character data)。可以把字符數據想象爲XML元素的開始標籤與結束標籤之間的文本,PCDATA是被解析器解析的文本,這些文本將被解析器檢查實體以及標記。
CDATA:
CDATA的意思是字符數據(character data),CDATA是不會被解析器解析的文本。
3、元素
1)聲明一個元素:
在一個DTD中,元素通過元素聲明來進行聲明:
<!ELEMENT element-name category>
或
<!ELEMENT element-name (element-content)>
4、屬性
在DTD中,屬性通過ATTLIST聲明來進行聲明
<!ATTLIST element-name attribute-name attribute-type attribute-value>
DTD 實例:
<!ATTLIST payment type CDATA "check">
XML 實例:
<payment type="check" />
CDATA | 值爲字符數據 (character data) |
---|---|
(en1|en2|..) | 此值是枚舉列表中的一個值 |
ID | 值爲唯一的 id |
IDREF | 值爲另外一個元素的 id |
IDREFS | 值爲其他 id 的列表 |
NMTOKEN | 值爲合法的 XML 名稱 |
NMTOKENS | 值爲合法的 XML 名稱的列表 |
ENTITY | 值是一個實體 |
ENTITIES | 值是一個實體列表 |
NOTATION | 此值是符號的名稱 |
xml: | 值是一個預定義的 XML 值 |
7、使用XSLT顯示XML
爲了更加直觀的看到我們的XML,我們可以使用CSS,但是不推薦使用這個,所以我們使用XSLT。它是首選的XML樣式表語言,比CSS更加完善,是在瀏覽器顯示XML文件之前,先把它轉換爲HTML。
8、JavaScript-XMLHttpRequest對象
XMLHttpRequest對象用於在後臺與服務器交換數據,是開發者的夢想,因爲能夠:
-
在不重新加載頁面的情況下更新網頁
-
在頁面已加載後從服務器請求數據
-
在頁面已加載後從服務器接收數據
-
在後臺向服務器發送數據
創建一個XMLHttpRequest對象語法:
xmlhttp=new XMLHttpRequest();
9、XML Parser
我們在學習JSON的時候,有parse()方法解析,這裏我們看看XML的解析。
1)解析XML文檔:
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;
2)解析XML字符串
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轉換爲了XML DOM對象。
3)XML DOM
這裏將XML文檔解析到XMLDOM對象中,然後通過JavaScript提取信息:
<html>
<body>
<h1>W3Schools Internal Note</h1>
<div>
<b>To:</b> <span id="to"></span><br />
<b>From:</b> <span id="from"></span><br />
<b>Message:</b> <span id="message"></span>
</div>
<script>
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","note.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
document.getElementById("to").innerHTML=
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
document.getElementById("from").innerHTML=
xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;
document.getElementById("message").innerHTML=
xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue;
</script>
</body>
</html>
10、服務器上的XML
1)從數據庫生成XML
<%
response.ContentType = "text/xml"
set conn=Server.CreateObject("ADODB.Connection")
conn.provider="Microsoft.Jet.OLEDB.4.0;"
conn.open server.mappath("/db/database.mdb")
sql="select fname,lname from tblGuestBook"
set rs=Conn.Execute(sql)
response.write("<?xml version='1.0' encoding='ISO-8859-1'?>")
response.write("<guestbook>")
while (not rs.EOF)
response.write("<guest>")
response.write("<fname>" & rs("fname") & "</fname>")
response.write("<lname>" & rs("lname") & "</lname>")
response.write("</guest>")
rs.MoveNext()
wend
rs.close()
conn.close()
response.write("</guestbook>")
%>
後記:
去了解XML可以很好的幫助我們之後去理解javaweb中xml文件結構。