因爲xml的標籤由用戶本身定義,所以在開發的時候,每一個人均可以根據本身的需求來定義xml標籤,這樣致使項目中的xml難以維護,所以須要使用必定的規範機制來約束xml文件中的標籤書寫。html
第一步:先本身定義一個xml文件學習
<?xml version="1.0" encoding="UTF-8"?> <users> <user> <name>zhangsan</name> <age>23</age> <addr>shanghai</addr> </user> <user> <name>lisi</name> <age>24</age> <addr>beijing</addr> </user> </users>
第二步:書寫DTD文件來約束xml文件url
DTD文件在定義的時候,擴展名就是dtd。spa
在xml文件中有多少個標籤,就在dtd中書寫多少個ELEMENT標籤code
<?xml version="1.0" encoding="UTF-8" ?> <!ELEMENT users (user+) > <!ELEMENT user (name,age,addr) > <!ELEMENT name (#PCDATA) > <!ELEMENT age (#PCDATA)> <!ELEMENT addr (#PCDATA)>
DTD主要用來約束xml文件,DTD能夠單獨寫在文件中,也能夠直接定義在xml中,能夠在xml中引入第三方的公共DTD。 外部DTD的引入方式:外部DTD主要指的一個獨立的DTD文件。 首先要書寫DTD文件,而後在要被約束的xml文件中引入。 <!DOCTYPE 文檔根結點 SYSTEM "DTD文件的URL"> 文檔根結點 指的是當前xml中的根標籤。 SYSTEM 引入的系統中存在文件 "DTD文件的URL" DTD存放的位置 引入公共的DTD: <!DOCTYPE 文檔根結點 PUBLIC "DTD名稱" "DTD文件的URL"> 文檔根結點 指的是當前xml中的根標籤。 PUBLIC 表示當前引入的DTD是公共的DTD 在xml中直接書寫DTD <!DOCTYPE 根標籤名 [ 具體的標籤的約束 ]>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE users[ <!ELEMENT users (user+) > <!ELEMENT user (name,age,addr) > <!ELEMENT name (#PCDATA) > <!ELEMENT age (#PCDATA) > <!ELEMENT addr (#PCDATA) > ]> <users> <user> <name>zhangsan</name> <age>23</age> <addr>shanghai</addr> </user> <user> <name>lisi</name> <age>24</age> <addr>beijing</addr> </user> </users>
當定義DTD約束xml時候,這時須要在DTD中使用ELEMENT來定義當前xml中能夠出現的標籤名稱。 格式: <!ELEMENT 標籤名 約束> 約束來限定當前標籤中能夠有的子標籤,或者當前標籤中能夠書寫的內容 在定義標籤名的時候,約束中可使用一些符號標籤具體出現次數 ? 零次或者一次 * 零次或者屢次 + 一次或者屢次 users (user+) 表示當前的users標籤下能夠有一個或者多個user標籤 , 用來限定當前的子標籤出現的順序user (name,age,addr) user標籤下只能有name age addr 子標籤,而且必須按照name age addr的順序書寫 | user (name|age,addr) user下能夠name或者age ,但必須有addr,而且addr必須name或age後面 #PCDATA 代表該元素可包含任何字符數據,但不能在其中包含任何子元素。只有 PCDATA 的元素經過圓括號中的 #PCDATA 進行聲明 EMPTY 代表該元素不能有任何子元素或文本,僅可使用屬性。 ANY 表該元素中能夠包含任何DTD中定義的元素內容 如:<!ELEMENT note ANY> <!ELEMENT age EMPTY > 當前的age標籤是個空標籤,它不能有文本內容。
屬性的類型:
CDATA 屬性的value值能夠是文本數據
(值1 | 值2 | 值3.... ) 表示當前的屬性的value值只能是當前括號中的值
ID 表示惟一。對當前標籤上的id屬性進行限定,而且同一個xml中id不能重複
類型 描述
CDATA 值爲字符數據 (character data)
(en1|en2|..) 此值是枚舉列表中的一個值
ID 值爲惟一的 id
IDREF 值爲另一個元素的 id
IDREFS 值爲其餘 id 的列表
NMTOKEN 值爲合法的 XML 名稱
NMTOKENS 值爲合法的 XML 名稱的列表
ENTITY 值是一個實體
ENTITIES 值是一個實體列表
NOTATION 此值是符號的名稱
xml: 值是一個預約義的 XML 值
屬性的類型和約束的組合:
CDATA REQUIRED
CDATA Implied
CDATA fixed
CDATA 「值」
(值1 | 值2 | 值3.... ) REQUIRED
ID REQUIRED
實體用於爲一段內容建立一個別名,之後在XML文檔中就可使用別名引用這段內容了。 在DTD定義中,一條<!ENTITY …>語句用於定義一個實體。 實體能夠理解成Java中預先定義好的一個常量,而後xml文件中就能夠引入當前這個定義的實體。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE users[ <!ELEMENT users (user+) > <!ELEMENT user (name,age,addr) > <!ELEMENT name (#PCDATA) > <!ELEMENT age EMPTY > <!ELEMENT addr (#PCDATA) > <!ATTLIST user id ID #REQUIRED > <!ENTITY abc "上海傳智播客123123"> ]> <users> <user id="u001"> <name>zhangsan</name> <age></age> <addr>&abc;</addr> </user> <user id="u002"> <name>lisi</name> <age/> <addr>&abc;</addr> </user> </users>
Schema它也來約束xml文件的,DTD在約束xml的時候一個xml中只能引入一個DTD,同時DTD它沒法對屬性以及標籤中的數據作數據類型的限定。
Schema它是用來代替DTD來約束xml。
Schema文件自己就是使用xml文件書寫的,同時它對須要約束的xml中的數據有嚴格的限定。學習Schema主要來學習W3C組織定義的如何在Schema中去約束xml的標籤以及屬性,還有屬性的數據類型,以及標籤中子標籤的順序。
要定義一個Schema文件,這時它的擴展名必須是.xsd。在這個文件中根元素必須是schema。
使用Schema來約束xml,Schema在書寫的時候,只須要使用W3C組織提早定義的限定標籤的,以及限定的屬性的那個標籤便可。
第一步:書寫xml文件orm
<?xml version="1.0" encoding="UTF-8"?> <books> <book> <name>JavaWEB</name> <author>老畢</author> <price>182</price> </book> <book> <name>SSH</name> <author>老於</author> <price>152</price> </book> </books>
第二步:定義schema文件xml
在定義Schema文件的時候,因爲這個Schema文件自己就是xml,它也要受到別的約束。而這個約束是W3C組織提早定義好的, 在Schema文件中須要提早引入進來在根標籤中使用屬性進行進入: <schema xmlns="http://www.w3.org/2001/XMLSchema" 引入W3C定義的schema書寫的規範 targetNamespace="http://www.itcast.org/book" 給當前的Schema文件起名字(命名空間) 做用是當哪一個xml要引入這個schema約束的時候,必須經過當前targetNamespace 後面書寫的uri地址來引入
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.org/book" elementFormDefault="qualified"> <element name="books"> <complexType> <sequence> <element name="book"> <complexType> <sequence> <element name="name"></element> <element name="author"></element> <element name="price"></element> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema>
第三步:在xml文件中引入當前的這個Schemahtm
<books xmlns="http://www.itcast.org/book" 它是schema文件中的targetNamespace 屬性後面的值 xsi:schemaLocation="http://www.itcast.org/book book.xsd" 這個是在引入當前的schema文件的真實路徑 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 說明當前的xml是schema一個實例文檔 >
在定義Schema文件的時候,須要在<schema>根標籤中使用 targetNamespace 屬性定義當前schema定義名稱(只是一個分配的名字,根本沒有指向任何文件),在被約束的xml文件中先根據這個名稱引入當前的schema文件,而後在使用 xsi:schemaLocation=」」 引入具體的schema文件。(由於targetNamespace屬性定義的schema名稱,只是一個名稱而已,因此在xml文件中須要經過schemaLocation來聲明指定所遵循的Schema文件的具體位置) (xsi:schemaLocation 使用它引入某個schema時,先要使用名稱空間, 空格 ,文件名) 名稱空間主要功能是用於來 elementFormDefault="qualified|unqualified" 在schema中書寫qualified ,在限定xml中的定義的標籤名必須使用定義的名稱空間。 unqualified 要求根元素必須使用名稱空間,而子元素不能使用名稱空間。
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast2.org/book" elementFormDefault="qualified"> <element name="books"> <!--name表明當前的xml中能夠書寫標籤名稱 type數據類型--> <complexType ><!-- complexType 當前的element聲明的標籤是複雜標籤時 ,須要使用complexType來聲明子標籤--> <sequence> <!-- 複雜標籤是指有屬性,或者有子標籤,或者有屬性有子標籤的標籤 簡單標籤是指只有文本內容的標籤 <name>zhangsan</name> 簡單標籤 <name id="u001"></name> 複雜標籤 sequence 表明當前子標籤的順序 --> <element name="book" maxOccurs="unbounded"> <complexType mixed="true"><!—mixed屬性值爲true,book元素間就能夠出現字符文本數據了--> <sequence> <element name="name"></element> <element name="author"></element> <element name="price" type="integer"></element> <any></any> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema>
Name.xsdblog
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/name" elementFormDefault="qualified"> <element name="name"></element> </schema>
Book2.xmlelement
<?xml version="1.0" encoding="UTF-8"?> <aa:books xmlns:aa="http://www.itcast2.org/book" xmlns:bb="http://www.example.org/name" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.itcast2.org/book book2.xsd http://www.example.org/name name.xsd" > <aa:book> aa:sjdlkfjlkdsjflk <aa:name >JavaWEB</aa:name> <aa:author >老畢</aa:author> <aa:price>182</aa:price> <bb:name>sdgs</bb:name> </aa:book> </aa:books>
此文轉載於https://www.cnblogs.com/cb0327/ 詳細請看http://www.javashuo.com/article/p-wsmlrbke-bu.html