XML和Schema


2017-11-03 19:33:56

XML:Extensible Markup Language,也就是可擴展標記語言。XML工具使處理和轉化信息變得十分容易和方便。

XML和HTML格式是古老的標記通用語言SGML的衍生語言。

盡管XML和HTML同宗同源,但是兩者之間存在着重要的區別:

  • 與HTML不同,XML是大小寫敏感的,例如<H1>和<h1>是不同的XML標簽。
  • 在HTML中,如果從上下文可以分清哪里是段落或者列表項的結尾,那么結尾標簽如</p>可以省略,而XML中結束標簽絕對不能省略。
  • 在XML中,只有單個標簽而沒有相對應的結束標簽的元素必須以/結尾。這樣解析器就不需要查找形如</p>的標簽了。
  • 在XML中,屬性值必須用引號括起來。在HTML中,引號是可有可無的。例如,<applet code = "CodeDemo.class" width = 300>,這在HTML中是合法的,但是在XML中則是不被允許的,需要加上引號進行約束。所以在XML中應該寫成<applet code = "CodeDemo.class" width = “300”>
  • 在HTML中,屬性名可以沒有值。例如,<input type = "radio" cheacked>。在XML中所有的屬性都必須要有屬性值。比如,<input type = "radio" cheacked=“true”>

一、XML文檔的結構

1、XML應該以一個文檔頭開始,例如:<?xml version="1.0" encoding="UTF-8"?>。嚴格來說,文檔頭是可選的,但是強烈建議使用文檔頭。

2、文檔頭之后通常是文檔的文檔類型定義(Document Type Definition,DTD)。文檔的類型定義語句可以簡化XML文檔的解析,之后的DTD會被Schema替代,在Spring中也是采用的Schema進行文檔的類型定義。

3、最后,XML文檔的正文包含根元素,根元素包含一些其他的元素。例如

<?xml version="1.0"?> --文檔頭

<!DOCTYPE configuration ...>  --文檔的類型定義DTD
<configuration>
  <title>
    <font>
      <name>Java</name>
      <size>36</size>
    </font>
  </title>
...
</configuration>    

元素可以有子元素(child element),文本或者兩者皆有。在上述的例子中,font元素有兩個子元素,它們是name和size。

[提示]

  • 在設計XML的時候,應該盡量使元素要么包含子元素,要么包含文本。換句話說,你應該避免以下的情況:
<font>
  Java
  <size>36</size>
</font>

在XML規范里,這叫做混合式內容(mixed content)。如果包含混合式的內容那么在樹形遍歷子節點的時候就會出現需要進行判別的情況。所以要避免混合式內容,這樣可以簡化解析的過程。

  • 何時使用元素,何時使用屬性

這個問題在XML設計人員中存在着分歧。例如將font做如下的描述:

<font name="Java" size="36"/>

似乎要比下面的更簡單一些:

    <font>
      <name>Java</name>
      <size>36</size>
    </font>

但是屬性的靈活性要差很多,假設你想把單位添加到size中去。如果使用屬性,那么必須把單位添加到屬性值中去:

<font name="Java" size="36 pt">

o no!這時候就需要對字符串“36 pt”進行解析,而這正是XML設計用來避免的麻煩。但是,如果把屬性加到size元素中就會非常的方便:

    <font>
      <name>Java</name>
      <size unit="pt">36</size>
    </font>

一個常用的經驗法則是,屬性值應該用來修改值的解釋,而不是用來指定值。

在HTML中屬性的使用規范很簡單:凡是不顯示在網頁上的都是屬性。

 

二、XML中的其他標記

  • 字符引用

字符引用的形式是&#十進制值,或者&#x十六進制值。例如,字符a,&#97,或者&#x61。

  • 實體引用

實體引用的形式是&name,例如&lt;&gt;&amp;&quot;&apos,都有預訂的含義:小於,大於,&,引號,省略號。

  • CDATA部分

CDATA部分用<![CDATA[...]]>來限定其界限。它們是字符數據的一種特殊形式。你可以用來囊括那些含有<,>,&之類的字符的字符串,而不用將它們解釋為標記,例如:

<![CDATA[<&>是很常用的]]>。但是這里的字符串是不能包含]]>的,這也可以理解。

  • 處理指令

處理指令是那么專門用來處理XML文檔的應用程序中使用的指令,它們將用<? 和 ?>來限定其界限。例如:

<?xml version="1.0"?>

  • 注釋

注釋是用<!--  -->限定的文本,例如:

<!-- This is a comment -->

另外,注釋中是不能包含--的。注釋只能用來給讀者提供信息,其中絕對不能包含隱藏的命令,命令應該是用處理指令來實現的。

 

三、使用命名空間

Java中使用包來避免名字的沖突。這樣程序員就可以在不同的包中使用相同的名字。XML中也有類似的命名空間(namespace)的機制,可以用於元素名和屬性名。

名字空間是有統一資源標識符(Uniform Resource Identifier,URI)來標識的。其中HTTP的URL格式是最常用的。

在命名空間的URL所表示的位置上不需要有任何文檔,XML解析器不會嘗試去該處查看任何東西。然而,為了給遇到不熟悉的命名空間的程序員一些幫助,人們習慣與將解釋該命名空間的文檔放在URL上。

為什么使用HTTP的URL作為命名空間的標識符,這是因為這里的URL肯定是唯一的,其實這個道理和Java包名的命名為反向域名是同一個道理。

在 xml 中,元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名沖突。
這個 xml文檔攜帶着某個表格中的信息:

<table>
   <tr>
   <td>Apples</td>
   <td>Bananas</td>
   </tr>
</table>

這個 XML 文檔攜帶有關桌子的信息(一件家具):

<table>
   <name>African Coffee Table</name>
   <width>80</width>
   <length>120</length>
</table>

假如這兩個 XML 文檔被一起使用,由於兩個文檔都包含帶有不同內容和定義的 <table> 元素,就會發生命名沖突。XML 解析器無法確定如何處理這類沖突。

可以使用前綴來避免命名沖突此文檔帶有某個表格中的信息:

<h:table>
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>

此 XML 文檔攜帶着有關一件家具的信息:

<f:table>
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

現在,命名沖突不存在了,這是由於兩個文檔都使用了不同的名稱來命名它們的 <table>元素 (<h:table><f:table>)。通過使用前綴,我們創建了兩種不同類型的 <table>元素。

除了使用前綴,還可以使用命名空間(一個元素可以有多個命名空間,里面帶前綴的是特地的命名空間,不帶前綴的是默認命名空間)這個 XML 文檔攜帶着某個表格中的信息:

<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>

此 XML 文檔攜帶着有關一件家具的信息:

<f:table xmlns:f="http://www.w3school.com.cn/furniture">
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

與僅僅使用前綴不同,我們為 <table> 標簽添加了一個 xmlns (xml namespace)屬性,這樣就為前綴賦予了一個與某個命名空間相關聯的限定名稱,下面是xml文件中xmlns屬性的使用介紹,

XML Namespace (xmlns) 屬性
XML 命名空間屬性被放置於元素的開始標簽之中,並使用以下的語法:
xmlns:namespace-prefix=”namespaceURI”

當命名空間被定義在元素的開始標簽中時,所有帶有相同前綴的子元素都會與同一個命名空間相關聯。
注意,用於標示命名空間的地址不會被解析器用於查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。不過,很多公司常常會作為指針來使用命名空間指向實際存在的網頁,這個網頁包含關於命名空間的信息。

 

四、Schema

XML Schema 是基於 XML 的 DTD 替代者。

XML Schema 描述 XML 文檔的結構。

XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition,XSD)。

  • 什么是Schema

XML Schema 的作用是定義 XML 文檔的合法構建模塊,類似 DTD。

  1. 定義可出現在文檔中的元素
  2. 定義可出現在文檔中的屬性
  3. 定義哪個元素是子元素
  4. 定義子元素的次序
  5. 定義子元素的數目
  6. 定義元素是否為空,或者是否可包含文本
  7. 定義元素和屬性的數據類型
  8. 定義元素和屬性的默認值以及固定值
  • 取代DTD的原因

我們認為 XML Schema 很快會在大部分網絡應用程序中取代 DTD。

理由如下:

  1. XML Schema 可針對未來的需求進行擴展
  2. XML Schema 更完善,功能更強大
  3. XML Schema 基於 XML 編寫
  4. XML Schema 支持數據類型
  5. XML Schema 支持命名空間
  • XML Schema 支持數據類型

XML Schema 最重要的能力之一就是對數據類型的支持。

通過對數據類型的支持:

  1. 可更容易地描述允許的文檔內容
  2. 可更容易地驗證數據的正確性
  3. 可更容易地與來自數據庫的數據一並工作
  4. 可更容易地定義數據約束(data facets)
  5. 可更容易地定義數據模型(或稱數據格式)
  6. 可更容易地在不同的數據類型間轉換數據
  • XML Schema 使用 XML 語法

另一個關於 XML Schema 的重要特性是,它們由 XML 編寫。

由 XML 編寫 XML Schema 有很多好處:

  1. 不必學習新的語言
  2. 可使用 XML 編輯器來編輯 Schema 文件
  3. 可使用 XML 解析器來解析 Schema 文件
  4. 可通過 XML DOM 來處理 Schema
  5. 可通過 XSLT 來轉換 Schema
  • XML Schema 可保護數據通信

當數據從發送方被發送到接受方時,其要點是雙方應有關於內容的相同的“期望值”。

通過 XML Schema,發送方可以用一種接受方能夠明白的方式來描述數據。

一種數據,比如 "03-11-2004",在某些國家被解釋為11月3日,而在另一些國家為當作3月11日。

但是一個帶有數據類型的 XML 元素,比如:<date type="date">2004-03-11</date>,可確保對內容一致的理解,這是因為 XML 的數據類型 "date" 要求的格式是 "YYYY-MM-DD"。

  • XML Schema 可擴展

XML Schema 是可擴展的,因為它們由 XML 編寫。

通過可擴展的 Schema 定義,您可以:

  1. 在其他 Schema 中重復使用您的 Schema
  2. 創建由標准類型衍生而來的您自己的數據類型
  3. 在相同的文檔中引用多重的 Schema
  • 形式良好是不夠的

我們把符合 XML 語法的文檔稱為形式良好的 XML 文檔,比如:

  1. 它必須以 XML 聲明開頭
  2. 它必須擁有唯一的根元素
  3. 開始標簽必須與結束標簽相匹配
  4. 元素對大小寫敏感
  5. 所有的元素都必須關閉
  6. 所有的元素都必須正確地嵌套
  7. 必須對特殊字符使用實體

即使文檔的形式良好,仍然不能保證它們不會包含錯誤,並且這些錯誤可能會產生嚴重的后果。

請考慮下面的情況:您訂購的了 5 打激光打印機,而不是 5 台。通過 XML Schema,大部分這樣的錯誤會被您的驗證軟件捕獲到。

  • 如何使用XSD

XML 文檔可對 DTD 或 XML Schema 進行引用。

一個簡單的 XML 文檔:

請看這個名為 "note.xml" 的 XML 文檔:

<?xml version="1.0"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

DTD 文件

下面這個例子是名為 "note.dtd" 的 DTD 文件,它對上面那個 XML 文檔的元素進行了定義:

<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

第 1 行定義 note 元素有四個子元素:"to, from, heading, body"。

第 2-5 行定義了 to, from, heading, body 元素的類型是 "#PCDATA"。

XML Schema

下面這個例子是一個名為 "note.xsd" 的 XML Schema 文件,它定義了上面那個 XML 文檔( "note.xml" )的元素:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">

<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>

</xs:schema> 

note 元素是一個復合類型,因為它包含其他的子元素。其他元素 (to, from, heading, body) 是簡易類型,因為它們沒有包含其他元素。

對 DTD 的引用

此文件包含對 DTD 的引用:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.w3school.com.cn/dtd/note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

對 XML Schema 的引用

此文件包含對 XML Schema 的引用:

<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
  • 對Schema的引用的理解

首先,需要注意的是Schema也是個xml文件,所以它也有自己的命名空間。

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

...
...
</xs:schema>

其中,

xmlns:xs="http://www.w3.org/2001/XMLSchema"

表示給這個xml中schema定義了一個命名空間http://www.w3.org/2001/XMLSchema,xs為使用時的前綴。

targetNamespace="http://www.w3school.com.cn" 

顯示被此 schema 定義的元素 (note, to, from, heading, body) 來自命名空間: "http://www.w3school.com.cn"即這個schema是為”http://www.w3school.com.cn“命名空間所提供約束的,也就是被聲明為http://www.w3school.com.cn命名空間的xml文件所引用。 

xmlns="http://www.w3school.com.cn" 

指出schema 中元素的默認的命名空間是 "http://www.w3school.com.cn"

此 XML 文檔含有對 XML Schema 的引用:

<?xml version="1.0"?>

<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

其中,

xmlns="http://www.w3school.com.cn" 

定義了該xml元素的默認命名空間為http://www.w3school.com.cn

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

又定義了一個命名空間(官方叫XML Schema 實例命名空間),和前綴xsi關聯,定義這個命名空間的原因是,schemaLocation 屬性在這個命名空間下,也就是說,只有先定義了這個命名空間,才能使用schemaLocation 屬性。

xsi:schemaLocation="http://www.w3school.com.cn note.xsd"

設置xsi前綴代表的命名空間中的一個屬性schemaLocation為"http://www.w3school.com.cn note.xsd"(XML Schema 實例命名空間下的schemaLocation屬性,該屬性貌似被schema 驗證器讀取?名稱是固定的?)。
此屬性有兩個值,第一個值是需要使用的命名空間,第二個值是供命名空間使用的 XML schema 的位置(note.xsd就是根元素為schema的那個xml文件),其實也就是表示命名空間為http://www.w3school.com.cn的xml元素(文件)對應的Schema的位置(文件)為note.xsd,所以Schema中的targetNamespace屬性值必須和xsi:schemaLocation屬性的第一個值相同,這里都為http://www.w3school.com.cn(需要引用schema的xml中定義的命名空間為第一個值,表示它要被shema限制)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM