XML入門整理
XML學(xué)習(xí)
XML,或稱為可擴(kuò)展標(biāo)記語言(Extensible Markup Language),是一種您可以用來創(chuàng)建自己的標(biāo)記的標(biāo)記語言。它由萬維網(wǎng)協(xié)會(huì)(W3C)創(chuàng)建,用來克服 HTML(即超文本標(biāo)記語言(Hypertext Markup Language),它是所有網(wǎng)頁的基礎(chǔ))的局限。和 HTML 一樣,XML 基于 SGML — 標(biāo)準(zhǔn)通用標(biāo)記語言(Standard Generalized Markup Language)。XML 是為 Web 設(shè)計(jì)的。
1.XML文檔規(guī)則
XML 規(guī)范需要解析器拒絕任何沒有遵守基本規(guī)則的 XML 文檔。
區(qū)別于HTML:大多數(shù) HTML 解析器接受隨意的標(biāo)記,它們會(huì)猜測(cè)文檔作者的意圖。為了避免一般的 HTML 文檔中松散結(jié)構(gòu)所造成的混亂,XML 的創(chuàng)造者們決定從一開始就強(qiáng)制文檔結(jié)構(gòu)。
三種XML文檔:
- 無效文檔
- 有效文檔既遵守 XML 語法規(guī)則也遵守在其 DTD(文檔類型定義) 或模式中定義的規(guī)則。
- 格式良好的文檔遵守 XML 語法,但沒有 DTD 或模式。
根元素(唯一性)
XML文檔必須包含且只包含一個(gè)根元素。否則,XML 解析器都會(huì)拒絕解析。
元素不重疊
結(jié)束標(biāo)記必需有
XML 元素區(qū)分大小寫
區(qū)別于HTML:在 HTML 中,<h1>和<H1>是相同的;在 XML 中,它們是不同的。如果您試圖用</H1>標(biāo)記結(jié)束<h1>元素,將會(huì)出錯(cuò)。
屬性規(guī)則:
XML 文檔中的屬性有兩個(gè)規(guī)則:
- 屬性必須有值
- 那些值必須用引號(hào)括起。
可以使用單引號(hào),也可以使用雙引號(hào),但要始終保持一致。
XML聲明
建議使用 XML 聲明,但它不是必需的。
聲明包括三個(gè)屬性:XML版本,字符集,standalone
;
standalone
(可以是yes或no)定義了是否可以在不讀取任何其它文件的情況下處理該文檔。默認(rèn)情況下是no。
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
XML 文檔中的其它項(xiàng)
您或許會(huì)在一個(gè) XML 文檔中發(fā)現(xiàn)其它幾項(xiàng):
- 注釋:注釋可以出現(xiàn)在文檔的任何位置;它們甚至可以出現(xiàn)在根元素的前面或后面。注釋以<!--開始,以-->結(jié)束。下面是包含注釋的標(biāo)記:
<!-- Here's a PI for Cocoon: -->
<?cocoon-process type="sql"?>
- 處理指令:處理指令是為使用一段特殊代碼而設(shè)計(jì)的標(biāo)記。在上面的示例中,有一個(gè)用于 Cocoon 的處理指令(有時(shí)稱為 PI),Cocoon 是來自 Apache 軟件基金會(huì)(Apache Software Foundation)的 XML 處理框架。當(dāng) Cocoon 處理 XML 文檔時(shí),它會(huì)尋找以cocoon-process開頭的處理指令,然后相應(yīng)地處理 XML 文檔。在該示例中,type="sql"屬性告訴 Cocoon:XML 文檔包含一個(gè) SQL 語句。
<!-- Here's an entity: -->
<!ENTITY dw "developerWorks">
- 實(shí)體:上面的示例為文檔定義了一個(gè)實(shí)體。無論 XML 處理器在何處找到字符串&dw;,它都會(huì)用字符串developerWorks代替該實(shí)體。XML 規(guī)范還定義了五個(gè)您可以用來替代不同的特殊字符的實(shí)體。這些實(shí)體是:
< 代表小于符號(hào)
> 代表大于符號(hào)
" 代表一個(gè)雙引號(hào)
' 代表一個(gè)單引號(hào)(或撇號(hào))
& 代表一個(gè)“與”符號(hào)。
名稱空間:
對(duì)于一個(gè)通訊錄,書店,研究所可能具有相同的元素<title>。如何分辨這個(gè)特定的<title>指的是人、書籍還是某項(xiàng)研究條目呢?解決這個(gè)問題,可以使用名稱空間。
<?xml version="1.0"?>
<object_summary
xmlns:addr="http://www.sun.com/addresses/"
xmlns:books="http://www.sun.com/books/"
xmlns:research="http://www.sun.com/title/"
>
... <addr:name><title>Mrs.</title> ... </addr:name> ...
... <books:title>Transformers</books:title> ...
... <research:title>Vega Information Grid</research:title> ...
在該示例中,三個(gè)名稱空間前綴是 addr、books 和research。請(qǐng)注意,為特定元素定義名稱空間意味著該元素的所有子元素都屬于同一名稱空間。第一個(gè) <title> 元素屬于 addr 名稱空間,因?yàn)槠涓冈?/span> <addr:Name> 屬于該名稱空間。
最后要指出的是:名稱空間定義中的字符串僅僅是字符串。如:xmlns:addr="http://www.sun.com/addresses/看似 URL,其實(shí)不是。您可以定義 xmlns:addr="tmac",那也是有效的。名稱空間唯一的重要性在于其唯一性;這就是為什么大多數(shù)名稱空間定義看起來象 URL 的原因。
2.定義文檔內(nèi)容
- 一種方法是使用文檔類型定義(Document Type Definition),或簡(jiǎn)稱 DTD。DTD 定義可以在 XML 文檔中出現(xiàn)的元素、這些元素出現(xiàn)的次序、它們可以如何相互嵌套以及 XML 文檔結(jié)構(gòu)的其它詳細(xì)信息。DTD 是最初的 XML 規(guī)范的一部分,與 SGML DTD 非常相似。
- 另一種方法是使用 XML Schema。模式可以定義您能在 DTD 中使用的所有文檔結(jié)構(gòu),它還可以定義數(shù)據(jù)類型和比 DTD 更復(fù)雜的規(guī)則。W3C 在提出最初的 XML 規(guī)范的幾年之后開發(fā)了 XML Schema 規(guī)范。
DTD
允許您指定 XML 文檔的基本結(jié)構(gòu)。
特性:有序性。
符號(hào)說明:“?”表示可選(0次或1次)
“+”表示可多次出現(xiàn)(>=1次)
“*”表示可以出現(xiàn)可以不出現(xiàn)(>=0次)
“(A|B)?”表示A或B是可選項(xiàng),只能選擇其中之一
定義屬性:
· 定義哪些屬性是必需的
· 定義屬性的缺省值
· 列出給定屬性的所有有效值
<!ELEMENT city (#PCDATA)>
<!ATTLIST city postal-code CDATA #REQUIRED
state CDATA (AZ|CA|NV|OR|UT|WA) "CA">
#PCDATA代表已解析字符數(shù)據(jù),不能在這些元素中包含另一個(gè)元素;
該示例將 state 和 postal-code 都定義為 <city> 元素的屬性;
#REQUIRED 告訴解析器 postal-code 屬性包含文本并且是必需的(如果它是可選的,用 CDATA #IMPLIED 即可);
state僅支持來自亞利桑那州(AZ)、加利福尼亞州(CA)、內(nèi)華達(dá)州(NV)、俄勒岡州(OR)、猶他州(UT)和華盛頓州(WA)的地址,并且缺省值是加利福尼亞州。
文檔示例的基本結(jié)構(gòu)的 DTD:
<!-- address.dtd -->
<!ELEMENT address (name, street, city, state, postal-code)>
<!ELEMENT name (title? first-name, last-name)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT postal-code (#PCDATA)>
DTD 語法不同于普通的 XML 語法。(相反,XML Schema 文檔本身就是 XML,這導(dǎo)致一些有趣的結(jié)果)。
XML
與 DTD 相比有幾個(gè)優(yōu)勢(shì):
- XML 模式使用 XML 語法。換句話說,XML 模式是一個(gè) XML 文檔。這意味著您可以象處理任何其它文檔一樣處理模式。例如,您可以編寫一個(gè) XSLT 樣式表,該樣式表將 XML 模式轉(zhuǎn)換成具有自動(dòng)生成的 JavaScript 代碼的 Web 表單,其中的 JavaScript 代碼可以驗(yàn)證您輸入的數(shù)據(jù)。
- XML 模式支持?jǐn)?shù)據(jù)類型。盡管 DTD 確實(shí)支持?jǐn)?shù)據(jù)類型,但很明顯這些數(shù)據(jù)類型是從發(fā)布的角度開發(fā)的。XML 模式支持 DTD 中的所有原始數(shù)據(jù)類型(諸如標(biāo)識(shí)和標(biāo)識(shí)引用之類的類型)。它們還支持整數(shù)、浮點(diǎn)數(shù)、日期、時(shí)間、字符串、URL 和其它對(duì)數(shù)據(jù)處理和驗(yàn)證有用的數(shù)據(jù)類型。
- XML 模式是可擴(kuò)展的。除了 XML 模式規(guī)范中定義的數(shù)據(jù)類型以外,您還可以創(chuàng)建自己的數(shù)據(jù)類型,并且可以基于其它數(shù)據(jù)類型派生出新的數(shù)據(jù)類型。
- XML 模式有更強(qiáng)的表達(dá)能力。
要點(diǎn):如要定義一個(gè) XML 文檔的結(jié)構(gòu),您應(yīng)該象在應(yīng)用程序中設(shè)計(jì)數(shù)據(jù)庫模式或數(shù)據(jù)結(jié)構(gòu)那樣事先考慮 DTD 或模式。您事先考慮的未來需求越多,以后實(shí)現(xiàn)它們就越容易而且成本越低。
3.XML編程接口
文檔對(duì)象模型(Document Object Model (DOM));
用于 XML 的簡(jiǎn)單 API(Simple API for XML (SAX));
JDOM ;
用于 XML 解析的 Java API(Java API for XML Parsing (JAXP))。
如何確定哪種編程接口適合:
- 要用 Java 編寫應(yīng)用程序嗎?JAXP 使用 DOM、SAX 和 JDOM;如果您用 Java 編寫代碼,那么您應(yīng)使用 JAXP 將您的代碼與各種解析器實(shí)現(xiàn)的細(xì)節(jié)隔離。
- 應(yīng)用程序?qū)⑷绾尾渴穑?/span>如果您的應(yīng)用程序?qū)⒁鳛?/span> Java applet 部署,那么您會(huì)希望使要下載的代碼數(shù)量最小,別忘了 SAX 解析器比 DOM 解析器小。還要知道使用 JDOM 時(shí),除了 SAX 或 DOM 解析器之外還要求編寫少量的代碼。
- 一旦解析了 XML 文檔,還需要多次訪問那些數(shù)據(jù)嗎?如果您需要回過頭來訪問 XML 文件的已解析版本,DOM 可能是正確的選擇。而 SAX 事件被觸發(fā)時(shí),如果您以后需要它,則由您(開發(fā)人員)自己決定以某種方式保存它。如果您需要訪問不曾保存的事件,則必須再次解析該文件。而 DOM 自動(dòng)保存所有的數(shù)據(jù)。
- 只需要 XML 源文件的少量?jī)?nèi)容嗎?如果您只需要 XML 源文件的少量?jī)?nèi)容,那么 SAX 可能是正確的選擇。SAX 不會(huì)為源文件中的每個(gè)東西創(chuàng)建對(duì)象;您要確定什么是重要的。使用 SAX,您要檢查每個(gè)事件以了解它是否與您的需要有關(guān),然后相應(yīng)地處理它。更妙的是,一旦找到您正在尋找的東西,您的代碼就會(huì)拋出一個(gè)異常來完全停止 SAX 解析器。
- 您正在一臺(tái)內(nèi)存很少的機(jī)器上工作嗎?若是的話,不管您可能考慮到的其它因素是什么,SAX 是您的最佳選擇。
4.XML標(biāo)準(zhǔn)
XML 規(guī)范、XML Schema、 XSL、XSLT 和 XPath 、DOM 、SAX、JDOM 和 JAXP 、鏈接和引用、安全性、Web 服務(wù)
參考資料
XML 標(biāo)準(zhǔn):下面是本教程中提到的所有 XML 標(biāo)準(zhǔn)的字母順序列表。
- DOM,文檔對(duì)象模型:
- 核心規(guī)范: w3.org/TR/DOM-Level-2-Core/
- 事件規(guī)范: w3.org/TR/DOM-Level-2-Events/
- 樣式規(guī)范: w3.org/TR/DOM-Level-2-Style/
- 遍歷和范圍規(guī)范: w3.org/TR/DOM-Level-2-Traversal-Range/
- 視圖規(guī)范: w3.org/TR/DOM-Level-2-Views/
- HR-XML.org,人力資源 XML 協(xié)會(huì)(Human Resources XML Consortium):hr-xml.org
- JAXP,用于 XML 解析的 Java API(Java API for XML Parsing):java.sun.com/xml/jaxp/
- JDOM,不代表任何縮寫形式:jdom.org/
- SAX,用于 XML 的簡(jiǎn)單 API(Simple API for XML):saxproject.org/
- SMIL,同步多媒體集成語言(Synchronized Multimedia Integration Language):www.w3.org/TR/smil20/
- SOAP,過去用于代表簡(jiǎn)單對(duì)象訪問協(xié)議(Simple Object Access Protocol),但現(xiàn)在正式不代表任何縮寫形式:w3.org/TR/SOAP/
- SVG,可伸縮向量圖(Scalable Vector Graphics):www.w3.org/TR/SVG/
- UDDI,統(tǒng)一描述、發(fā)現(xiàn)和集成協(xié)議(Universal Description, Discovery, and Integration Protocol):uddi.org
- WSDL,Web 服務(wù)描述語言(Web Services Description Language):w3.org/TR/wsdl(結(jié)尾沒有斜杠符號(hào))
- XLink,XML 鏈接語言(XML Linking Language):w3.org/TR/xlink/
- XML,最基礎(chǔ)的標(biāo)準(zhǔn):w3.org/TR/REC-xml
- XML 數(shù)字簽名(XML Digital Signature):w3.org/TR/xmldsig-core/
- XML 加密(XML Encryption):w3.org/TR/xmlenc-core/
- XML 名稱空間(XML Namespaces):w3.org/TR/REC-xml-names/
- DTD 和模式的 XML 資源庫(XML Repository):xml.org/xml/registry.jsp
- XML Schema:
- 第 0 部分 — 入門:w3.org/TR/xmlschema-0
- 第 1 部分 — 文檔結(jié)構(gòu):w3.org/TR/xmlschema-1
- 第 2 部分 — 數(shù)據(jù)類型:w3.org/TR/xmlschema-2
- XPath,XML 路徑語言(XML Path Language):w3.org/TR/xpath(結(jié)尾沒有斜杠符號(hào))
- XPointer,XML 指針語言(XML Pointer Language):www.w3.org/TR/xptr/
- XSL-FO,用于格式化對(duì)象的可擴(kuò)展樣式表語言(Extensible Stylesheet Language for Formatting Objects):w3.org/TR/xsl/
- XSLT,可擴(kuò)展樣式表語言(Extensible Stylesheet Language):w3.org/TR/xslt(結(jié)尾沒有斜杠符號(hào))
posted on 2007-11-10 22:17 sun 閱讀(267) 評(píng)論(0) 編輯 收藏