最近接觸到了TVML,平時(shí)也會(huì)使用過XML。在這里也整理XML簡易語法規(guī)則以便回顧查閱。文章主要介紹 XML 文檔的基礎(chǔ)結(jié)構(gòu),以及創(chuàng)建構(gòu)造良好的 XML 需要遵循的規(guī)則,包括命名約定、正確的標(biāo)記嵌套、屬性規(guī)則、聲明和實(shí)體。
XML 與 HTML
標(biāo)記語言從早期的私有公司和政府制定形式逐漸演變成標(biāo)準(zhǔn)通用標(biāo)記語言(Standard Generalized Markup Language,SGML)、超文本標(biāo)記語言(Hypertext Markup Language,HTML),并且最終演變成 XML。SGML 比較復(fù)雜,HTML(實(shí)際上僅是一組元素集)在識(shí)別信息方面不夠強(qiáng)大。XML 則是一種易于使用和易于擴(kuò)展的標(biāo)記語言。
總之,我們可以使用 XML 創(chuàng)建自己的元素,從而能夠更精確地表示自己的信息。
構(gòu)建 XML
XML 文件由 內(nèi)容 和 標(biāo)記 組成。通常,標(biāo)記包圍內(nèi)容。
創(chuàng)建 XML 文件
XML 文檔的第一行通常是一個(gè) XML 聲明。
形式:<?xml version="1.0" encoding="utf-8"?>
作用:將文件識(shí)別為 XML 文件,有助于工具和人類識(shí)別 XML(不會(huì)誤認(rèn)為是 SGML 或其他標(biāo)記)。
PS:什么情況下通常忽略這個(gè)可選信息?打算將多個(gè)小的 XML 文件合并為一個(gè)大 XML 文件。
創(chuàng)建根元素
一個(gè)文件只能有一個(gè)根元素,并且需要使用 “包裝器” 包含它。一個(gè)文件只能有一個(gè)根元素,并且需要使用 “包裝器” 包含它。內(nèi)容和其他標(biāo)記必須放在 根元素 中間。
命名元素
命名時(shí)需要注意的地方:
· 元素名中不能出現(xiàn)空格。
· 名稱只能以英文字母開始,不能是數(shù)字或符號。
· 對大小寫沒有限制,但前后要保持一致,以免造成混亂。
嵌套元素
把某個(gè)元素放到其他元素的內(nèi)部。這些新的元素稱為子 元素,包含它們的元素稱為父 元素。
PS:注意兩個(gè)錯(cuò)誤嵌套(1.任何子元素都要完全包含在其父元素的開始和結(jié)束標(biāo)記內(nèi)部。2.每個(gè)同胞(Sibling)元素必須在下一個(gè)同胞元素開始之前結(jié)束。)
添加屬性
屬性是在使用元素時(shí)存儲(chǔ)額外信息的一種方式。
屬性由一個(gè)名稱-值對構(gòu)成,值包含在雙引號中("),比如:type="dessert"。
可以在元素的開始標(biāo)記內(nèi)部輸入一個(gè)或多個(gè)屬性。
例如:<recipename cuisine="american" servings="1">這是一個(gè)開始標(biāo)記哈。
PS:進(jìn)行分類的時(shí)候用的比較多。
使用實(shí)體
實(shí)體是對數(shù)據(jù)的引用。所有實(shí)體(除參數(shù)實(shí)體外)都以一個(gè)與字符(&)開始,以一個(gè)分號(;)結(jié)束。
實(shí)體的作用:
1.用實(shí)體代替特殊字符
2.定義實(shí)體來簡化創(chuàng)作
3.定義實(shí)體來簡化創(chuàng)作
實(shí)體的分類:
1.字符實(shí)體
由于我們不能直接在內(nèi)容中輸入特殊字符。如果要在文本中使用符號,必須使用它的字符代碼將它設(shè)置為實(shí)體。例如,大寫字母 A 是 Unicode 字符 U+0065。如果想將其表示為一個(gè)字符實(shí)體,可以輸入 A(十進(jìn)制值)或 A(十六進(jìn)制值)。另一個(gè)更有用的字符也許是 ? —— 版權(quán)符號。這個(gè)版權(quán)符號的字符實(shí)體是 & #169; 或 & #xa9;(如果將空格去掉那就會(huì)變成?)。
2.命名實(shí)體
命名實(shí)體在 DTD 或內(nèi)部子集(即文檔中 <!DOCTYPE> 語句的一部分)中聲明,在文檔中用作引用。在 XML 文檔解析過程中,實(shí)體引用將由它的表示替代。
簡單來說,實(shí)體就是宏,它們在我們處理文檔時(shí)得到擴(kuò)展。
<!ENTITY ndash "–">
– 為 “–”
如上所示,命名實(shí)體由字符實(shí)體替代。我們在文檔中使用 – 時(shí),它由 Unicode 字符 U+2013(短橫線 - 字符)替代。由于 – 的替代文本是一個(gè)字符引用,因此它等同于輸入一個(gè)短橫線字符。
3.外部實(shí)體
外部實(shí)體表示外部文件的內(nèi)容。外部實(shí)體在有些情況下很有用,比如說,您在創(chuàng)建一本圖書并且想將每一章存儲(chǔ)為一個(gè)單獨(dú)的文件。
<!ENTITY chap1 SYSTEM "chapter-1.xml">//外部實(shí)體引用其他文件
<!ENTITY chap2 SYSTEM "chapter-2.xml">
<!ENTITY chap3 SYSTEM "chapter-3.xml">
現(xiàn)在,當(dāng)您在主圖書 XML 文件(參見下清單)中將這些實(shí)體放到一起時(shí),這些文件的內(nèi)容將插入在引用點(diǎn)。
<?xml version="1.0" encoding="utf-8"?>
<!-- Pull in the chapter content: -->
&chap1;
&chap2;
&chap3;
由于這些文件的內(nèi)容被插入到 XML 文檔中,因此它們也必須是有效的 XML,而且它們必須是平衡的。也就是說,在一個(gè)外部實(shí)體的引用文件中開始的任何元素也必須在那個(gè)文件中結(jié)束。當(dāng)上面代碼清單中的 XML 文檔被解析時(shí),它將被讀取為一個(gè)大文檔,包含 chapter-1.xml、chapter-2.xml 和 chapter-3.xml 文件的內(nèi)容;XML 處理應(yīng)用程序并不介意文檔寫入到 4 個(gè)單獨(dú)的文件中。
4.參數(shù)實(shí)體
參數(shù)實(shí)體只用于 DTD 和文檔的內(nèi)部子集中。它們使用百分號(%)而不是與字符,可以是命名實(shí)體或外部實(shí)體。
作用:
1.引用在外部文件中聲明的 Latin 1, Special Characters and Symbols 實(shí)體集
2.用作快捷方式以重用 DTD 的某些部分,比如每個(gè) XHTML 元素都支持的標(biāo)準(zhǔn)屬性集
例如:
<!ENTITY % attrs "%coreattrs; %i18n; %events;">
<!ENTITY % coreattrs
"id ID #IMPLIED
class CDATA #IMPLIED
style %StyleSheet; #IMPLIED
title %Text; #IMPLIED"
>
<!ENTITY % i18n
"lang %LanguageCode; #IMPLIED
xml:lang %LanguageCode; #IMPLIED
dir (ltr|rtl) #IMPLIED"
>
如上,參數(shù)實(shí)體可以引用其他參數(shù)實(shí)體。與命名實(shí)體一樣,參數(shù)實(shí)體在整個(gè)文檔被讀取之后才被擴(kuò)展。
如何在DTD中聲明實(shí)體
<!-- 6.1 Named entity for site name: -->
<!ENTITY dw "developerWorks">
<!-- 6.2 External entity for re-use: -->
<!ENTITY bio SYSTEM "dw-author-bio.xml">
<!-- 6.3 Parameter entity for use in DTD -->
<!ENTITY % English "en-US|en-CA|en-UK">
內(nèi)部子集中的實(shí)體聲明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[
<!ENTITY test-entity "This <em>is</em> an entity.">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8"/>
<title>Entities in XML</title>
</head>
<body>
<h1>Entities in XML</h1>
<p>&test-entity;</p>
<p>You can use it anywhere you'd use a standard XHTML entity:</p>
<pre>&test-entity;</pre>
</body>
</html>
XHTML 文檔(在系統(tǒng)上保存為 entities.xml)在其內(nèi)部子集中聲明了一個(gè)名為 test-entity 的新實(shí)體。內(nèi)部子集是 <!DOCTYPE> 聲明的一部分,位于 DTD 的 PUBLIC 和/或 SYSTEM 標(biāo)識(shí)符之后的方括號中。
通過實(shí)體減少輸入
在需要反復(fù)輸入相同的文本時(shí),可以嘗試?yán)脤?shí)體。以下是一些不錯(cuò)的實(shí)體示例:公司的正式名稱、正在進(jìn)行文檔記錄的產(chǎn)品的名稱、版權(quán)、商標(biāo)、注冊商標(biāo)通知,以及電子郵件地址。
<!ENTITY co "Father Karass' Olde Tyme Steambots, LLC">
<!ENTITY prod "Semi-Autonomous Security Servant (SASSbot)">
<!ENTITY c "Copyright © 2010 &co; All Rights Reserved.">
<!ENTITY author "Chris Herborth (chrish@pobox.com)">
使用實(shí)體輕松更新不斷變化的文檔
<!-- Current name: -->
<!ENTITY prod "Semi-Autonomous Security Servant (SASSbot)">
<!-- Old names preserved for posterity: -->
<!-- Original R&D name: -->
<!--ENTITY prod "Security Bot"-->
<!-- Marketing name v1 -->
<!--ENTITY prod "Security Servant Bot"-->
<!-- Marketing name v2 -->
<!--ENTITY prod "Autonomous Security Servant Bot"-->
總之,命名實(shí)體的作用類似于宏,允許您使用實(shí)體引用替代重復(fù)或難以輸入的文本。盡管 Web 瀏覽器不支持外部實(shí)體,但是我們可以通過其他 XML 應(yīng)用程序來使用它們創(chuàng)建復(fù)合文檔,這使得標(biāo)準(zhǔn)化和重用文檔的某些部分變得更容易。
構(gòu)造良好并且有效的 XML
要實(shí)現(xiàn)構(gòu)造良好的 XML 取決于如何處理 XML。例如我們要根據(jù)菜譜類型進(jìn)行分類。那就需要確保每個(gè) <recipe> 元素都包含 type 屬性,以對菜譜進(jìn)行分類。能夠正確驗(yàn)證并確保存在屬性值(避免出現(xiàn)雙關(guān)語)。
所謂 驗(yàn)證 就是根據(jù)元素規(guī)則檢查文檔的結(jié)構(gòu),以及如何為每個(gè)父元素定義子元素。這些規(guī)則是在 文檔類型定義(Document Type Definition,DTD)或模式(schema )中定義的。
思路:驗(yàn)證要求您創(chuàng)建自己的 DTD 或 schema ,然后在 XML 文件中引用 DTD 或 schema 文件。
為了實(shí)現(xiàn)驗(yàn)證,必須在 XML 文檔的頂部附近包含文檔類型(DOCTYPE)。這行代碼將引用用于驗(yàn)證文檔的 DTD 或 schema (元素和規(guī)則列表)。例如,DOCTYPE可能類似于 <!DOCTYPE MyDocs SYSTEM "filename.dtd">
另外,整體規(guī)則很簡單,但是一定要注意錯(cuò)誤的發(fā)生。我們根據(jù)可分類性和可搜索性找出文檔中有價(jià)值的內(nèi)容,然后根據(jù)我們的需要設(shè)計(jì)元素和屬性。當(dāng)我們有了明確的目標(biāo),并知道如何標(biāo)記內(nèi)容的時(shí)候,我們就可以構(gòu)建高效的元素和屬性了。
The End .