第1天 XML和DTD、schema约束
1、xml
* 擴(kuò)展名:*.xml
* 作用:存儲、配置
一個XML文件分為如下幾部分內(nèi)容:文檔聲明、元素、屬性、注釋? CDATA區(qū)、特殊字符、處理指令(processing instruction)。
1.1文檔聲明
最簡單的聲明語法:
<?xml version="1.0" ?>
version:設(shè)置當(dāng)前xml文檔內(nèi)容使用的版本
用encoding屬性說明文檔的字符編碼:
???????? <?xml version="1.0" encoding="GB2312" ?>?
用standalone屬性說明文檔是否獨(dú)立:
???????? <?xml version="1.0" encoding="GB2312"? standalone="yes" ?>
常見錯誤
沒有寫引號:<?xml version=1.0 ?>
輸入內(nèi)容中有中文: <?xml version=“1.0” ?>? //中文空格
編碼錯誤,記事本設(shè)置編碼UTF-8,用其他編輯器打開。
1.2元素
XML元素指XML文件中出現(xiàn)的標(biāo)簽,一個標(biāo)簽分為開始標(biāo)簽和結(jié)束標(biāo)簽。
格式:<x></x> or <x />,名稱自定義
- 建議字母開頭
- 區(qū)分大小寫
- 不能包含空格 <a b>
- 不能包含冒號 <a:b>
注意:
- ?一個標(biāo)簽中也可以嵌套若干子標(biāo)簽,但不能交叉嵌套
- ?格式良好的xml文檔只有一個根
由于在XML中,空格和換行都作為原始內(nèi)容被處理,所以,在編寫XML文件時,使用換行和縮進(jìn)等方式來讓原文件中的內(nèi)容清晰可讀的“良好”書寫習(xí)慣可能要被迫改變。
1.3屬性
- 前提:在某元素的基礎(chǔ)上,確定相應(yīng)的屬性
- 格式:<x attribute="attrValue"? />.
一個標(biāo)簽可以有多個屬性,每個屬性都有它自己的名稱和取值。
屬性值一定要用雙引號(")或單引號(')引起來。
定義屬性必須遵循與標(biāo)簽相同的命名規(guī)范。
1.4注釋
格式:<!--注釋內(nèi)容-->
注意:XML聲明之前不能有注釋;注釋不能嵌套
1.5轉(zhuǎn)義字符
???????? 格式: &xx;? --> {詳見“html轉(zhuǎn)義.html”
HTML特殊轉(zhuǎn)義字符列表
最常用的字符實(shí)體
Character Entities
| 顯示 | 說明 | 實(shí)體名稱 | 實(shí)體編號 |
| ? | 半方大的空白 |   |   |
| ? | 全方大的空白 |   |   |
| ? | 不斷行的空白格 | |   |
| <? | 小于 | < | < |
| >? | 大于 | > | > |
| & | &符號 | & | & |
| " | 雙引號 | " | " |
| ? | 版權(quán) | © | © |
| ? | 已注冊商標(biāo) | ® | ® |
| ? | 商標(biāo)(美國) | ? | ™ |
| × | 乘號 | × | × |
| ÷ | 除號 | ÷ | ÷ |
1.6 CDATA區(qū)
在編寫XML文件時,有些內(nèi)容可能不想讓解析引擎解析執(zhí)行,而是當(dāng)作原始內(nèi)容處理。遇到此種情況,可以把這些內(nèi)容放在CDATA區(qū)里,對于CDATA區(qū)域內(nèi)的內(nèi)容,XML解析程序不會處理,而是直接原封不動的輸出。
- 在xml文檔中存放任意內(nèi)容的區(qū)域
- 格式:<![CDATA[? cdata內(nèi)>*容? ]]>
1.7處理指令(processing instruction,PI)
處理指令用來指揮解析引擎如何解析XML文檔內(nèi)容。例如,在XML文檔中可以使用xml-stylesheet指令,通知XML解析引擎,應(yīng)用css文件顯示xml文檔內(nèi)容。
???????? 格式:<?xml-stylesheet type="text/css" href="uri"? ?>
- type:類型,內(nèi)容是MIME類型 image/jpeg
- href:確定引用文件的位置。
- uri:統(tǒng)一資源標(biāo)識符,1.html? news/m.html
- url:統(tǒng)一資源定位符,http://www.fengjie.com/news/m.html
處理指令必須以“<?”作為開頭,以“?>”作為結(jié)尾,XML聲明語句就是最常見的一種處理指令。
1.8 xml亂碼
???????? * 文檔內(nèi)容編碼:UTF-8
???????? * 文件編碼:window默認(rèn)GBK
???????? * 解決文件亂碼的方法:將文檔內(nèi)容編碼與文件編碼統(tǒng)一。
XML語法規(guī)則總結(jié):
- ?所有 XML 元素都須有關(guān)閉標(biāo)簽
- XML 標(biāo)簽對大小寫敏感
- XML 必須正確地嵌套順序
- XML 文檔必須有根元素
- XML 的屬性值須加引號
- 特殊字符必須轉(zhuǎn)義
- XML 中的空格會被保留
2、編碼、字符集
???????? UTF-8:萬國碼,(1-6字符)
???????? GB2312:國標(biāo)碼(簡體)
???????? GBK:國標(biāo)碼(簡體、繁體),GB2312升級版
???????? GB18030:國標(biāo)碼(簡體、繁體、少數(shù)名族),GBK升級版
???????? BIG5:大5碼(繁體)
???????? ISO-8859-1:英文編碼
3、約束
???????? 在XML技術(shù)里,可以編寫一個文檔來約束一個XML文檔的書寫規(guī)范,這稱之為XML約束。
???????? 常用的約束技術(shù)有兩種:XML DTD和XML schema
3.1 DTD約束
DTD(Document Type Definition),全稱為文檔類型定義。DTD約束既可以作為一個單獨(dú)的文件編寫,也可以在XML文件內(nèi)編寫。XML文件使用 DOCTYPE 聲明語句來指明它所遵循的DTD文件。
(1)文檔關(guān)聯(lián)方式
- ?內(nèi)部關(guān)聯(lián)格式:<!DOCTYPE 根元素 [語法]>
- 外部關(guān)聯(lián)格式:<!DOCTYPE 根元素 SYSTEM "URI">
book.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT books (book+)> <!ELEMENT book (name,author,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)>book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "book.dtd"> <books> <book><name>Java</name><author>LXH</author><price>44</price> </book> </books>- 公共關(guān)聯(lián)格式:<!DOCTYPE 根元素 PUBLIC "文檔名稱" "文檔URL">
新建一個Web Project,J2EE Specification Level選擇“J2EE1.3”,如圖所示。
在新建的Web Project下有一個WebRoot文件夾,下面有個WEB-INFO,里面還有個web.xml文件,打開web.xml,里面內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list> </web-app>里面的“http://java.sun.com/dtd/web-app_2_3.dtd”就是使用了公共關(guān)聯(lián),按住Ctrl點(diǎn)擊,可關(guān)聯(lián)到此文檔。
(2)元素
?格式:<!ELEMENT 元素名稱 元素內(nèi)容的類型>
? 符號:
? ? ? ? ? ? ? ? ?? : 0或1
? ? ? ? ? ? ? ? + : >=1
? ? ? ? ? ? ? ? ?* : >=0
? ? ? ? ? ? ? ? ?(): 分組
? ? ? ? ? ? ? ? ?| : 選擇
? ? ? ? ? ? ? ? ?,: 順序
? ? 類型:
- #PCDATA,只能書寫字符,不能包含子元素,注意: (#PCDATA)
- EMPTY,元素內(nèi)容為空
- ANY,元素內(nèi)容任意
例:book.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT books (book+)> <!ELEMENT book (name,author*,version?,(year|price))> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT version (#PCDATA)> <!ELEMENT year EMPTY> <!ELEMENT price EMPTY>book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "book.dtd"> <books> <book><name>Java</name><author>LXH</author><author>HLD</author><version>v1.1</version><price></price> </book> <book><name>C++</name><author>HLD</author><year/> </book> </books>(3)屬性
???????? 格式:<!ATTLIST 元素名稱 [屬性名稱 屬性類型 約束 ...]>
屬性類型及其含義:
約束的四種形式:
- ?#REQUIRED,必須填寫
- ?#IMPLIED,可選
- ? #FIXED value,固定值
- ? defaultValue,默認(rèn)值
例:book.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT books (book+)> <!ELEMENT book (name,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ATTLIST bookid ID #REQUIREDtitle CDATA #IMPLIEDlang CDATA #FIXED "固定值"category CDATA "默認(rèn)值"pid IDREF #REQUIREDcity (北京|上海|廣州) #REQUIRED >book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "book.dtd"> <books> <book id="B001" title="" pid="B001" city="上海"><name>Java</name><price></price> </book> <book id="B002" title="" category="類別" pid="B002" city="上海"><name>Java</name><price></price> </book> </books>(4)實(shí)體
???????? 實(shí)體是變量,用于引用普通文本或特殊字符的快捷方式的變量。
實(shí)體分為內(nèi)部實(shí)體和外部實(shí)體。
- 內(nèi)部實(shí)體
內(nèi)部實(shí)體分為引用實(shí)體和參數(shù)實(shí)體:
*引用實(shí)體:主要在 XML 文檔中被應(yīng)用。
- ?格式:<!ENTITY 實(shí)體名稱 "內(nèi)容">
- ?使用位置:在xml文檔中使用
- ?使用格式:&實(shí)體名稱;
*參數(shù)實(shí)體:被 DTD 文件自身使用
- 格式:<!ENTITY % 實(shí)體名稱 "內(nèi)容">
- 使用位置:在DTD文檔中使用
- 使用格式:%實(shí)體名稱
*外部實(shí)體
- 格式:<!ENTITY 實(shí)體名稱 SYSTEM "URI">
- 使用位置:在xml文檔中使用
- 使用格式:&實(shí)體名稱;
part.xml
<?xml version="1.0" encoding="UTF-8"?> <entity>測試外部實(shí)體</entity>book.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ENTITY part SYSTEM "part.xml"> <!ELEMENT books (book+)> <!ELEMENT book ANY> <!--(#PCDATA)不能有子元素-->book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "book.dtd"> <books><book>∂</book> </books><book>∂</book>相當(dāng)于<book><entity>測試外部實(shí)體</entity></book>
3.2 schema約束
XML Schema 文件自身就是一個XML文件,擴(kuò)展名為*.xsd。XML Schema是用一套預(yù)先規(guī)定的XML元素和屬性創(chuàng)建的,這些元素和屬性定義了XML文檔的結(jié)構(gòu)和內(nèi)容模式。 XML Schema規(guī)定XML文檔實(shí)例的結(jié)構(gòu)和每個元素/屬性的數(shù)據(jù)類型。
- l? 編寫了一個XML Schema約束文檔后,通常需要把這個文件中聲明的元素綁定到一個URI地址上
- l? 在XML Schema技術(shù)中有一個專業(yè)術(shù)語來描述這個過程,即把XML Schema文檔聲明的元素綁定到一個名稱空間上
- l? 以后XML文件就可以通過這個URI(即名稱空間)來告訴解析引擎,xml文檔中編寫的元素來自哪里,被誰約束
schema文檔,根元素是schema,在http://www.w3.org/2001/XMLSchema定義
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books" xmlns:tns="http://www.example.org/books" elementFormDefault="qualified"><xs:element name="books"></xs:element> </xs:schema>books為根元素
【targetNamespace】為當(dāng)前的schema文檔命名,屬性在自定義。但是,要求全球唯一,采用URL域名進(jìn)行命名。
【xmlns】xml namespace ——>xml命名空間。引用已有的命名空間,官方為自己的schema文檔起的名稱。
【xmlns:tns】
格式1:? xmlns:別名
使用:tns:schema,從當(dāng)前別名tns所代表的schema文檔中定義了schema元素
格式2: xmlns(默認(rèn)命名空間引用)
?????????????????? 好處:防止命名沖突
【elementFormDefault="qualified"】 指出任何 XML 實(shí)例文檔所使用的且在此 schema 中聲明過的元素必須被命名空間限定。
命名空間的使用在XML中主要有兩個目的:
n? 用于區(qū)分那些名稱相同但來自不同schema庫,具有不同含義的元素和屬性。通過將元素、屬性與URL相關(guān)聯(lián),命名空間能夠區(qū)分具有相同名稱的元素
n? 在一個單一的XML應(yīng)用中,將相關(guān)的元素和屬性組合起來,使它們可以很容易地被軟件包識別。
名稱空間用一個唯一的URI(Uniform Resource Identifier,統(tǒng)一資源標(biāo)識符)表示,僅起到唯一標(biāo)識的作用。
n? 默認(rèn)命名空間聲明:不帶前綴 ,默認(rèn)命名空間只能有一個
- 格式:xmlns=“url”
- 例如:xmlns="http://www.w3.org/2001/XMLSchema"
n? 顯式命名空間聲明:聲明時指定前綴
- 格式:xmlns: quoteName =“url”
- 例如: xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
一個XML Schema文檔通常稱之為模式文檔(約束文檔),遵循這個文檔書寫的xml文件稱之為實(shí)例文檔。并且根元素schema節(jié)點(diǎn)必須來自http://www.w3.org/2001/XMLSchema 命名空間,官方建議使用使用前綴 xs ,及xmlns:xs。
Schema相對于DTD的明顯好處是,XML Schema文檔本身也是XML文檔,而不是像DTD一樣使用自成一體的語法。
在文檔關(guān)聯(lián)中,如何確定文件的位置?
官方規(guī)定“http://www.w3.org/2001/XMLSchema-instance” 將當(dāng)前的xml文檔實(shí)例化
* schemaLocation屬性(兩個參數(shù)空格隔開)
* 第一參數(shù):實(shí)例化所需要的schema文檔的名稱
* 第二參數(shù):schema文檔的URI
定義根元素element:<別名:element name=””>
調(diào)用schema(book.xml)
<?xml version="1.0" encoding="UTF-8"?> <books xmlns="http://www.example.org/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/books books.xsd" > </books>XML Schema基礎(chǔ)概念:
簡易元素:僅包含文本的元素。它不會包含任何其他的元素或?qū)傩浴?/p>
復(fù)合元素:包含其他元素及/或?qū)傩缘?XML 元素
l? 空元素
l? 包含其他元素的元素
l? 僅包含文本的元素
l? 包含元素和文本的元素
Schema文檔中出現(xiàn)的元素標(biāo)記
| 元素類型 | 描述 |
| schema | 聲明一個已經(jīng)聲明的schema |
| element | 聲明一個元素 |
| attribute | 聲明一個屬性 |
| simpleType | 定義一個簡單類型,它決定了元素和屬性值的約束和相關(guān)信息 |
| complexType | 定義一個復(fù)合類型,它決定了一組元素和屬性值的約束和相關(guān)信息 |
| group | 把一組元素聲明組合在一起,以便它們能夠一起被復(fù)合類型應(yīng)用 |
| attributeGroup | 把一組屬性聲明組合在一起,以便它們能夠一起被復(fù)合類型應(yīng)用 |
| simpleContent | 應(yīng)用于complexType,對它的內(nèi)容進(jìn)行約束和擴(kuò)展等 |
| choice | 允許唯一的一個元素從一組中被選擇 |
| list | 從一個特定數(shù)據(jù)類型的集合中選擇定義一個簡單類型元素 |
| union | 從一個特定簡單數(shù)據(jù)類型的集合中選擇定義一個簡單類型元素 |
| unique | 定義一個屬性或元素值,它必須在一個特定的范圍內(nèi) |
| sequence | 給一組元素一個特定的序列 |
| restriction | 定義一個約束條件 |
例1:定義一個簡單元素
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books" xmlns:tns="http://www.example.org/books" elementFormDefault="qualified"><element name="books"><complexType><sequence><!-- 1、定義元素 --><element name="ele"></element><!—所有的元素必須定義在跟元素下面(這里) --> </sequence></complexType></element> </schema>對應(yīng)的xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!—-對應(yīng)的xml文檔--> <books xmlns="http://www.example.org/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/books books.xsd" ><ele></ele> </books>例2:定義元素包含子元素,子元素順序出現(xiàn)
<element name="person"><complexType><sequence> <!-- 順序 --><element name="name"></element><element name="age"></element></sequence></complexType> </element>例3:定義含有子元素的元素--任選一個
<element name="user"><complexType><choice><!-- 選擇 --><element name="name"></element><element name="age"></element></choice></complexType> </element>例4:定義含有子元素的元素--子元素沒順序
<element name="worker"><complexType><all><!-- 無序的 --><element name="name"></element><element name="age"></element></all></complexType> </element>例5.1:僅含有屬性的空元素
<element name="img"><complexType><attribute name="src" type="string"/></complexType> </element>例5.2:僅含有屬性的空元素,屬性必須寫
<element name="img"><complexType><!—【use】 optional:可選、required:必選、prohibited:禁用--><attribute name="src" type="string" use="required"/></complexType> </element>例6:必須含有屬性的非空元素
<!-- <price unit="¥">30</price> --> <element name="price"><complexType> <!-- 類型為復(fù)合元素 --><simpleContent><!-- 內(nèi)容簡單 --><!--將簡單的內(nèi)容擴(kuò)展成復(fù)雜的類型 【base】確定簡單內(nèi)容的類型 --><extension base="integer"><!-- 定義屬性:【name】確定名稱、【type】確定類型、【use】optional:可選、required:必選、prohibited:禁用--><attribute name="unit" type="string" use="required"></attribute></extension></simpleContent></complexType> </element>例7:必須含有屬性也包含子元素的元素
<element name="book"><complexType><sequence><element name="title" type="string"></element></sequence><attribute name="catagory" type="string"></attribute></complexType></element>例8、元素內(nèi)容必須是2-5之間的數(shù)
<element name="number"><simpleType><restriction base="int"><!-- 限制 --><maxInclusive value="5"/><minInclusive value="2"/></restriction></simpleType> </element>例9:包含多個指定元素
<!--<students><student></student><student></student> </students> minOccurs:最小出現(xiàn)次數(shù),默認(rèn)為1 maxOccurs:最大出現(xiàn)次數(shù),默認(rèn)為1 ?——>minOccurs=0; maxOccurs =1 + ——>minOccurs=1; maxOccurs =unbounded * ——>minOccurs=0; maxOccurs =unbounded --> <element name="students"><complexType><sequence minOccurs="1" maxOccurs="unbounded"><element name="student"></element></sequence></complexType> </element>例10:將身份證號格式化
<element name="personId"><simpleType><restriction base="string"><pattern value="\d{6}-\d{8}-\d{4}"></pattern></restriction></simpleType> </element>屬性相關(guān)定義
l? attribute元素的use屬性來定義是否是必須的屬性
- required是必須值
- optional是可選值
- prohibited是無屬性值
l? 缺省值如何定義
- <attribute?name="quantity"?type="integer"?default="1"/>
l? 固定值如何定義
- <attribute name="name" fixed="張三"></attribute
Schema和DTD區(qū)別
XML從SGML (Standard Generalized Markup Language,標(biāo)準(zhǔn)通用標(biāo)記語言)中繼承了DTD,并用它來定義內(nèi)容的模型,驗(yàn)證和組織元素。同時,它也有很多局限:
- DTD不遵守XML語法;
- DTD不可擴(kuò)展;
- DTD不支持命名空間的應(yīng)用;
- DTD沒有提供強(qiáng)大的數(shù)據(jù)類型支持,只能表示很簡單的數(shù)據(jù)類型。
Schema完全克服了這些弱點(diǎn),使得基于Web的應(yīng)用系統(tǒng)交換XML數(shù)據(jù)更為容易。下面是它所展現(xiàn)的一些新特性:
- Schema完全基于XML語法,不需要再學(xué)習(xí)特殊的語法;
- Schema能用處理XML文檔的工具處理,而不需要特殊的工具;
- Schema大大擴(kuò)充了數(shù)據(jù)類型,支持booleans、numbers、dates and times、URIs、integers、decimal numbers和real numbers等;
- Schema支持原型,也就是元素的繼承。如:我們定義了一個“聯(lián)系人”數(shù)據(jù)類型,然后可以根據(jù)它產(chǎn)生“朋友聯(lián)系人”和“客戶聯(lián)系”兩種數(shù)據(jù)類型;
- Schema支持屬性組。我們一般聲明一些公共屬性,然后可以應(yīng)用于所有的元素,屬性組允許把元素、屬性關(guān)系放于外部定義、組合;
- 開放性。原來的DTD只能有一個DTD應(yīng)用于一個XML文檔,現(xiàn)在可以有多個Schema運(yùn)用于一個XML文檔。
?
轉(zhuǎn)載于:https://www.cnblogs.com/bizhenLiu-cnblogs/p/6038200.html
總結(jié)
以上是生活随笔為你收集整理的第1天 XML和DTD、schema约束的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: How Kafka’s Storage
- 下一篇: AngularJS模块——module