XML學習
XML,或稱為可擴展標記語言(Extensible Markup Language),是一種您可以用來創建自己的標記的標記語言。它由萬維網協會(W3C)創建,用來克服 HTML(即超文本標記語言(Hypertext Markup Language),它是所有網頁的基礎)的局限。和 HTML 一樣,XML 基于 SGML — 標準通用標記語言(Standard Generalized Markup Language)。XML 是為 Web 設計的。
1.XML文檔規則
XML 規范需要解析器拒絕任何沒有遵守基本規則的 XML 文檔。
區別于HTML:大多數 HTML 解析器接受隨意的標記,它們會猜測文檔作者的意圖。為了避免一般的 HTML 文檔中松散結構所造成的混亂,XML 的創造者們決定從一開始就強制文檔結構。
三種XML文檔:
- 無效文檔
- 有效文檔既遵守 XML 語法規則也遵守在其 DTD(文檔類型定義) 或模式中定義的規則。
- 格式良好的文檔遵守 XML 語法,但沒有 DTD 或模式。
根元素(唯一性)
XML文檔必須包含且只包含一個根元素。否則,XML 解析器都會拒絕解析。
元素不重疊
結束標記必需有
XML 元素區分大小寫
區別于HTML:在 HTML 中,<h1>和<H1>是相同的;在 XML 中,它們是不同的。如果您試圖用</H1>標記結束<h1>元素,將會出錯。
屬性規則:
XML 文檔中的屬性有兩個規則:
可以使用單引號,也可以使用雙引號,但要始終保持一致。
XML聲明
建議使用 XML 聲明,但它不是必需的。
聲明包括三個屬性:XML版本,字符集,standalone
;
standalone
(可以是yes或no)定義了是否可以在不讀取任何其它文件的情況下處理該文檔。默認情況下是no。
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
XML 文檔中的其它項
您或許會在一個 XML 文檔中發現其它幾項:
- 注釋:注釋可以出現在文檔的任何位置;它們甚至可以出現在根元素的前面或后面。注釋以<!--開始,以-->結束。下面是包含注釋的標記:
<!-- Here's a PI for Cocoon: -->
<?cocoon-process type="sql"?>
- 處理指令:處理指令是為使用一段特殊代碼而設計的標記。在上面的示例中,有一個用于 Cocoon 的處理指令(有時稱為 PI),Cocoon 是來自 Apache 軟件基金會(Apache Software Foundation)的 XML 處理框架。當 Cocoon 處理 XML 文檔時,它會尋找以cocoon-process開頭的處理指令,然后相應地處理 XML 文檔。在該示例中,type="sql"屬性告訴 Cocoon:XML 文檔包含一個 SQL 語句。
<!-- Here's an entity: -->
<!ENTITY dw "developerWorks">
- 實體:上面的示例為文檔定義了一個實體。無論 XML 處理器在何處找到字符串&dw;,它都會用字符串developerWorks代替該實體。XML 規范還定義了五個您可以用來替代不同的特殊字符的實體。這些實體是:
< 代表小于符號
> 代表大于符號
" 代表一個雙引號
' 代表一個單引號(或撇號)
& 代表一個“與”符號。
名稱空間:
對于一個通訊錄,書店,研究所可能具有相同的元素<title>。如何分辨這個特定的<title>指的是人、書籍還是某項研究條目呢?解決這個問題,可以使用名稱空間。
<?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> ...
在該示例中,三個名稱空間前綴是 addr、books 和research。請注意,為特定元素定義名稱空間意味著該元素的所有子元素都屬于同一名稱空間。第一個 <title> 元素屬于 addr 名稱空間,因為其父元素 <addr:Name> 屬于該名稱空間。
最后要指出的是:名稱空間定義中的字符串僅僅是字符串。如:xmlns:addr="http://www.sun.com/addresses/看似 URL,其實不是。您可以定義 xmlns:addr="tmac",那也是有效的。名稱空間唯一的重要性在于其唯一性;這就是為什么大多數名稱空間定義看起來象 URL 的原因。
2.定義文檔內容
- 一種方法是使用文檔類型定義(Document Type Definition),或簡稱 DTD。DTD 定義可以在 XML 文檔中出現的元素、這些元素出現的次序、它們可以如何相互嵌套以及 XML 文檔結構的其它詳細信息。DTD 是最初的 XML 規范的一部分,與 SGML DTD 非常相似。
- 另一種方法是使用 XML Schema。模式可以定義您能在 DTD 中使用的所有文檔結構,它還可以定義數據類型和比 DTD 更復雜的規則。W3C 在提出最初的 XML 規范的幾年之后開發了 XML Schema 規范。
DTD
允許您指定 XML 文檔的基本結構。
特性:有序性。
符號說明:“?”表示可選(0次或1次)
“+”表示可多次出現(>=1次)
“*”表示可以出現可以不出現(>=0次)
“(A|B)?”表示A或B是可選項,只能選擇其中之一
定義屬性:
· 定義哪些屬性是必需的
· 定義屬性的缺省值
· 列出給定屬性的所有有效值
<!ELEMENT city (#PCDATA)>
<!ATTLIST city postal-code CDATA #REQUIRED
state CDATA (AZ|CA|NV|OR|UT|WA) "CA">
#PCDATA代表已解析字符數據,不能在這些元素中包含另一個元素;
該示例將 state 和 postal-code 都定義為 <city> 元素的屬性;
#REQUIRED 告訴解析器 postal-code 屬性包含文本并且是必需的(如果它是可選的,用 CDATA #IMPLIED 即可);
state僅支持來自亞利桑那州(AZ)、加利福尼亞州(CA)、內華達州(NV)、俄勒岡州(OR)、猶他州(UT)和華盛頓州(WA)的地址,并且缺省值是加利福尼亞州。
文檔示例的基本結構的 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,這導致一些有趣的結果)。
XML
與 DTD 相比有幾個優勢:
- XML 模式使用 XML 語法。換句話說,XML 模式是一個 XML 文檔。這意味著您可以象處理任何其它文檔一樣處理模式。例如,您可以編寫一個 XSLT 樣式表,該樣式表將 XML 模式轉換成具有自動生成的 JavaScript 代碼的 Web 表單,其中的 JavaScript 代碼可以驗證您輸入的數據。
- XML 模式支持數據類型。盡管 DTD 確實支持數據類型,但很明顯這些數據類型是從發布的角度開發的。XML 模式支持 DTD 中的所有原始數據類型(諸如標識和標識引用之類的類型)。它們還支持整數、浮點數、日期、時間、字符串、URL 和其它對數據處理和驗證有用的數據類型。
- XML 模式是可擴展的。除了 XML 模式規范中定義的數據類型以外,您還可以創建自己的數據類型,并且可以基于其它數據類型派生出新的數據類型。
- XML 模式有更強的表達能力。
要點:如要定義一個 XML 文檔的結構,您應該象在應用程序中設計數據庫模式或數據結構那樣事先考慮 DTD 或模式。您事先考慮的未來需求越多,以后實現它們就越容易而且成本越低。
3.XML編程接口
文檔對象模型(Document Object Model (DOM));
用于 XML 的簡單 API(Simple API for XML (SAX));
JDOM ;
用于 XML 解析的 Java API(Java API for XML Parsing (JAXP))。
如何確定哪種編程接口適合:
- 要用 Java 編寫應用程序嗎?JAXP 使用 DOM、SAX 和 JDOM;如果您用 Java 編寫代碼,那么您應使用 JAXP 將您的代碼與各種解析器實現的細節隔離。
- 應用程序將如何部署?如果您的應用程序將要作為 Java applet 部署,那么您會希望使要下載的代碼數量最小,別忘了 SAX 解析器比 DOM 解析器小。還要知道使用 JDOM 時,除了 SAX 或 DOM 解析器之外還要求編寫少量的代碼。
- 一旦解析了 XML 文檔,還需要多次訪問那些數據嗎?如果您需要回過頭來訪問 XML 文件的已解析版本,DOM 可能是正確的選擇。而 SAX 事件被觸發時,如果您以后需要它,則由您(開發人員)自己決定以某種方式保存它。如果您需要訪問不曾保存的事件,則必須再次解析該文件。而 DOM 自動保存所有的數據。
- 只需要 XML 源文件的少量內容嗎?如果您只需要 XML 源文件的少量內容,那么 SAX 可能是正確的選擇。SAX 不會為源文件中的每個東西創建對象;您要確定什么是重要的。使用 SAX,您要檢查每個事件以了解它是否與您的需要有關,然后相應地處理它。更妙的是,一旦找到您正在尋找的東西,您的代碼就會拋出一個異常來完全停止 SAX 解析器。
- 您正在一臺內存很少的機器上工作嗎?若是的話,不管您可能考慮到的其它因素是什么,SAX 是您的最佳選擇。
4.XML標準
XML 規范、XML Schema、 XSL、XSLT 和 XPath 、DOM 、SAX、JDOM 和 JAXP 、鏈接和引用、安全性、Web 服務
參考資料
XML 標準:下面是本教程中提到的所有 XML 標準的字母順序列表。
- XSLT,可擴展樣式表語言(Extensible Stylesheet Language):w3.org/TR/xslt(結尾沒有斜杠符號)