XML學習3:XML基本語法(二)
三XML屬性
XML元素可以在開始標籤中包含屬性,類似HTML。屬性(Attribute)提供關於元素的額外(附加)資訊。
XML屬性基本語法:<元素 屬性1=”屬性值” 屬性2=”屬性值”>元素內容</元素>
注意事項:
1)屬性值用雙引號(")或單引號(')分隔(如果屬性值中有',用"分隔;有",用'分隔)。
2)一個元素可以有多個屬性。
3)屬性名稱在同一個元素標記中只能出現一次。
4)屬性值不能包括<, >, &之類的特殊字元,否則需要使用轉義字元。
(1)XML屬性
從HTML的學習中,你會回憶起這個:<img src="computer.gif">。"src"屬性提供有關<img>元素的額外資訊。在
HTML中(以及在XML中),屬性提供有關元素的額外資訊:
<img src="computer.gif">
<a href="demo.asp">
屬性通常提供不屬於資料組成部分的資訊。在下面的例子中,檔案型別與資料無關,但是對需要處理這個元素的
軟體來說卻很重要:
<file type="gif">computer.gif</file>
(2)XML屬性必須加引號
屬性值必須被引號包圍,不過單引號和雙引號均可使用。比如一個人的性別,person 標籤可以這樣寫:
<person sex="female">
或者這樣也可以:
<person sex='female'>
註釋:如果屬性值本身包含雙引號,那麼有必要使用單引號包圍它,就像這個例子:
<gangster name='George "Shotgun" Ziegler'>
或者可以使用實體引用:
<gangster name="George"Shotgun"Ziegler">
(3)XML元素與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中,您應該儘量避免使用屬性。如果資訊感覺起來很像資料,那麼請使用子元素吧。
(4)W3C推薦的方式
下面的三個 XML 文件包含完全相同的資訊:
第一個例子中使用了 date 屬性:
<note date="08/08/2008">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
第二個例子中使用了 date 元素:
<note>
<date>08/08/2008</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
第三個例子中使用了擴充套件的 date 元素(這是W3C推薦使用的):
<note>
<date>
<day>08</day>
<month>08</month>
<year>2008</year>
</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
(5)避免XML屬性
因使用屬性而引起的一些問題:
1)屬性無法包含多重的值(元素可以)
2)屬性無法描述樹結構(元素可以)
3)屬性不易擴充套件(為未來的變化)
4)屬性難以閱讀和維護
請儘量使用元素來描述資料。而僅僅使用屬性來提供與資料無關的資訊。不要做這樣的蠢事(這不是XML應該被使
用的方):
<note day="08" month="08" year="2008" to="George" from="John" heading="Reminder" body="Don't forget the
meeting!"></note>
(6)針對元資料的XML屬性
有時候會向元素分配ID引用。這些ID索引可用於標識XML元素,它起作用的方式與HTML中ID屬性是一樣的。這個
例子向我們演示了這種情況:
<messages>
<note id="501">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
<note id="502">
<to>John</to>
<from>George</from>
<heading>Re: Reminder</heading>
<body>I will not</body>
</note>
</messages>
上面的ID僅僅是一個識別符號,用於標識不同的便籤。它並不是便籤資料的組成部分。在此我們極力向您傳遞的理
念是:元資料(有關資料的資料)應當儲存為屬性,而資料本身應當儲存為元素。
四XML驗證
擁有正確語法的XML被稱為"形式良好"的XML。
通過DTD驗證的XML是"合法"的XML。
(1)形式良好的XML文件
"形式良好"或"結構良好"的XML文件擁有正確的語法。
"形式良好"(Well Formed)的XML文件會遵守前幾章介紹過的XML語法規則:1)XML文件必須有根元素;
2)ML文件必須有關閉標籤;
3)XML標籤對大小寫敏感;4)XML元素必須被正確的巢狀;
5)XML屬性必須加引號;例項:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
(2)驗證XML文件
合法的XML文件是"形式良好"的XML文件,同樣遵守文件型別定義(DTD)的語法規則:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
在上例中,DOCTYPE宣告是對外部DTD檔案的引用。下面的段落展示了這個檔案的內容。(3)XML DTD
DTD的作用是定XML文件的結構。它使用一系列合法的元素來定義文件結構:
<!DOCTYPE note [
<!ELEMENT note(to,from,heading,body)>
<!ELEMENT to(#PCDATA)>
<!ELEMENT from(#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body(#PCDATA)>
]>
(4)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>
上述的DTD和Schema我們會在後面的文章中詳細講解。
五基本語法補充
(1)CDATA區
有些內容可能不想讓解析引擎解析執行,而是當作原始內容處理,用於把整段文字解釋為純字元資料而不是標記的
情況。包含大量<、>、&或者"字元。CDATA區中的所有字元都會被當作元素字元資料的常量部分,而不是XML標
記。
CDATA區可以用於傳遞特殊字元,傳遞檔案資料。可以通過將圖片這類二進位制檔案以byte[]的形式放入CDATA區
中,需要使用時在以byte[]的方式讀出。在特殊的標籤CDATA下,所有的標籤、實體引用都被忽略,而被XML處理程
序一視同仁地當作字元資料看待。
CDATA區的形式如下:<! [CDATA[文字內容]]>
(2)處理指令(PI)
處理指令,簡稱PI (Processing Instruction)。處理指令用來指揮解析引擎如何解析XML文件內容。指示當前的
XML檔案的內容,如何被顯示或者處理。
處理指令必須以“<?”作為開頭,以“?>”作為結尾,XML宣告語句就是最常見的一種處理指令。 例如,在XML文件
中可以使用xml-stylesheet指令,通知XML解析引擎,應用css檔案顯示xml文件內容。
語法格式:<?target arg*?>
例子:使用XSTL處理當前的XML檔案:
<?xml-stylesheet type="text/xsl" href="book.xsl"?>
綜合XML例項:
<?xml version="1.0" encoding="UTF-8"?>
<!--註釋-->
<書籍列表>
<計算機書籍>
<bookname isbn="0001">XML應用大全</bookname>
<price>39.00</price>
</計算機書籍>
<計算機書籍>
<bookname isbn="0002">Java應用大全</bookname>
<price>139.00</price>
</計算機書籍>
<計算機書籍>
<bookname isbn="0003">Oracle應用大全</bookname>
<price>59.00</price>
</計算機書籍>
<計算機書籍>
<bookname><<MySQL應用大全>></bookname>
<price>59.00</price>
</計算機書籍>
<![CDATA[
<計算機書籍>
<bookname>C++應用大全</bookname>
<price>59.00</price>
</計算機書籍>
]]>
</書籍列表>
瀏覽器顯示:
六XML顯示
在所有現代瀏覽器中,均能夠檢視原始的 XML 檔案。不要指望 XML 檔案會直接顯示為 HTML 頁面。
(1)檢視XML檔案
例項:
<?xml version="1.0" encoding="UTF-8"?>
<書籍列表>
<計算機書籍>
<書名>XML的今生今世</書名>
<價格>66.66</價格>
<簡要介紹>概述詳細描寫XML的從出生到衰老的整個過程</簡要介紹>
</計算機書籍>
</書籍列表>
瀏覽器顯示:
(2)使用CSS顯示XML檔案
通過使用CSS,可為XML檔案新增顯示資訊。
在上面的XML程式碼中的XML宣告下面增加一行程式碼:
<?xml-stylesheet href="XML2.css" type="text/css"?>
XML2.css檔案:
書名{
font-size: 20px;
font-weight: bold;
color: red;
}
價格 {
font-size: 30px;
font-weight: bolder;
color: blue;
}
簡要介紹{
font-size: 25px;
font-weight: bolder;
color: blue;
}
瀏覽器顯示:
使用CSS格式化XML不是常用的方法,更不能代表XML文件樣式化的未來。W3C推薦使用XSLT。
(3)使用XSLT顯示XML檔案
通過使用XSLT,您可以向XML文件新增顯示資訊。
使用XSLT顯示XML;XSLT是首選的XML樣式表語言。XSLT(eXtensible Stylesheet Language Transformations)
遠比CSS更加完善。
在上面的XML程式碼中的XML宣告下面增加一行程式碼:
<?xml-stylesheet href="book.xsl" type="text/xsl"?>
book.xsl檔案程式碼:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns="http://www.w3.org/TR/REC-html40" result-ns="">
<xsl:template><xsl:apply-templates/></xsl:template>
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>我的藏書</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates select="書籍列表"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="書籍列表">
<xsl:for-each select="計算機書籍">
<UL>
<LI><xsl:value-of select="書名"/></LI>
<UL>
<LI>價格:<xsl:value-of select="價格"/></LI>
<LI>簡要介紹:<xsl:value-of select="簡要介紹"/></LI>
</UL>
</UL>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
瀏覽器顯示: