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