1. 程式人生 > >xml-dtd

xml-dtd

enc 解決 schema 大小 factory 輸出 amp ttl 方便

dtd用於校驗XML的語法。
dtd步驟:
1、看XML中有多少個元素,有幾個元素,在dtd文件中寫幾個<!ELEMENT>
2、判斷元素是簡單元素還是復雜元素
-復雜元素:有子元素的元素
<!ELEMENT 元素名稱 (子元素)>
-簡單元素:沒有子元素
<!ELEMENT 元素名稱 (#PCDATA)>
3、需要在XML文件中引入dtd文件
<!DOCTYPE 根元素名稱 SYSTEM "dtd文件的路徑">

dtd的三種引入方式:
1、引入外部的dtd文件
<!DOCTYPE 根元素名稱 SYSTEM "dtd路徑">
2、使用內部的dtd文件
-<!ELEMENT 根元素名稱[
<!ELEMENT 根元素名稱(子元素1,子元素2)>
<!ELEMENT 子元素1 (#PCDATA)>
<!ELEMENT 子元素2 (#PCDATA)>
]>
-<!ELEMENT person[
<!ELEMENT person(name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
3、使用外部的dtd文件(網絡上的dtd文件)
-<!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文檔的URL">
-框架Struts2使用的是外部的dtd文件

使用dtd定義元素
語法:<!ELEMENT 元素名 約束>
簡單元素:沒有子元素的元素
約束簡單元素
(#PCDATA):約束子元素是字符串類型
EMPTY:元素為空(不能有內容)
ANY:任意類型
復雜元素:
<!ELEMENT person (name,age)>
<!ELEMENT 根元素名稱 (子元素1,子元素2)>
-子元素只能出現一次
-表示子元素出現的次數
+:表示一次或者多次 例:<!ELEMENT person (name+,age)>
?:0次或者一次 例:<!ELEMENT person (name,age?)>
*:0次或者多次 例:<!ELEMENT person (name,age*)>
-子元素直接使用逗號進行隔開
表示元素出現的順序 例:<!ELEMENT person (name,age)>
-子元素直接使用豎線進行隔開
表示元素只能出現其中一個 例:<!ELEMENT person (name|age)>

使用dtd定義屬性
語法:在子元素上面加屬性約束:<!ATTLIST 元素名稱
屬性名稱 屬性類型 屬性的約束
>
屬性類型:
-CDATA:字符串
例: <!ATTLIST name
ID2 CDATA #REQUIRED
>
-枚舉:表示只能在一定的範圍內出現值,但是只能每次出現其中的一個
例:<!ELEMENT person[
<!ELEMENT person(name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>

<!ATTLIST age
ID1 (AA|BB|CC) #REQUIRED
>
]>
<person>
<name>zhangsan</name>
<age ID1="AA" >20</age>
</person>
-ID:表示屬性只能是字母或者下劃線開頭
例: <!ATTLIST name
ID1 ID #REQUIRED
>
-屬性的約束:
-#REQUIRED:表示屬性必須出現
-#IMPLIED:表示屬性可有可無
-#FIXED:表示一個固定值 #FIXED “ABC”;
-直接值: 不寫屬性,使用直接值
寫屬性值,使用設置那個值
例:<!ATTLIST name
ID1 CDATA "aaa";
>

定義引用實體
語法:<!ENTITY 實體名稱 "實體的值">
使用實體 &實體名稱;區分大小寫 例:&TEST;

註意:
定義實體需要寫在內部dtd裏面;
如果寫在外部的dtd裏面,有某些瀏覽器,內容得不到

xml的解析簡介(寫到Java代碼)
-xml是標記型文檔
-js使用dom解析標記型文檔?
-根據html的層級結構,在內存中分配一個樹形結構,把html的標簽,屬性和文本都封裝成對象
-document對象、element對象、屬性對象、文本對象、Node節點對象

-xml的解析方式(技術):dom和sax(重點中重點)
-使用dom解析:根據xml的層級結構在內存中分配一個樹形結構,把xml的標簽,屬性和文本都封裝成對象。
優點:很方便實現增刪改操作
缺點:如果文件過大,造成內存溢出
-sax解析:采用事件驅動,邊讀邊解析從上到下,一行一行的解析,解析到某一個對象,把對象名稱返回
優點:如果文件過大不會造成內存溢出,方便查詢操作
缺點:不能實現增刪改操作

解析xml,首先需要解析器
-不同的公司和組織提供了 針對dom和sax方式的解析器,通過API方式提供
--sun公司提供了針對dom和sax解析器 jaxp
--dom4j組織,針對dom和sax解析器 dom4j(--實際開發中---)
--jdom組織,針對dom和sax解析器 jdom

jaxp的API的查看(JDK API 1.6.0幫助文檔)
jaxp是javase的一部分
javax.xml.parsers包中,
四個類:分別是針對dom和sax解析使用的類
dom:DocumentBuilder:解析器類
這個類是一個抽象類,不能new
可以使用DocumentBuilderFactory.newDocumentBuilder()方法獲取

一個方法,可以解析xml parse("xml路徑") 返回是Document整個文檔
返回的document是一個接口,父節點是Node,如果在document裏面找不到想要的方法,到Node裏面去找
在document裏面方法

DocumentBuilderFactory:解析器工廠
newInstance()獲取,DocumentBuilderFactory的實例。

sax:
SAXParser:解析器類
SAXParser



xml的簡介
extensible Markup Language:可擴展標記型語言
-標記型語言:html是標記型語言
-也是使用標簽來操作
-可擴展:
-html裏面的標簽是固定,每個標簽都有特定的含義<h1><br/>
-標簽可以自己定義,可以寫中文的標簽<person></person>、<貓></貓>
xml用途
-html是用於顯示數據,xml也可以顯示數據(不是主要功能)
-xml主要功能,為了存儲數據
xml是w3c組織發布的技術
xml有兩個版本 1.0 1.1
-使用都是1.0版本(1.1版本不能向下兼容)
xml的應用
不同的系統之間傳輸數據
-qq之間數據的傳輸
用來表示生活中有關系的數據 例:國家和城市
經常用在文件配置
-比如現在鏈接數據庫 肯定知道數據庫的用戶名和密碼,數據名稱

xml的語法
1、xml的文檔聲明
-創建一個文件,後綴名是.xml
-如果寫xml,第一步 必須有一個文檔聲明(寫了文檔聲明之後,表示寫XML文件的內容)
-<?xml version="1.0" encoding="gbk">
-文檔聲明必須寫在第一行第一列

-屬性
-version:xml的版本1.0
-encoding:xml編碼 gbk utf-8 ISO8859-1(不包含中文)
-standalone:是否需要依賴其他文件 yes/no

-xml的中文亂碼問題解決
-保存時候的編碼和設置打開時候的編碼一致,不會出現亂碼
2、定義元素(標簽)
3、定義屬性
4、註釋
5、特殊字符
6、CDATA區
7、PI指令

xml的元素定義
-標簽定義
-標簽定義有開始必須要有結束:<person></person>
-標簽沒有內容,可以在標簽內結束<aa/>
-標簽可以嵌套,必須要合理嵌套
-合理嵌套<aa><bb></bb></aa>
-一個xml中,只能有一個根標簽,其他標簽都是這個標簽下面的標簽

-在xml中 把空格和換行都當成內容來解析
-下面這兩段代碼含義是不一樣的,把空格原樣輸出
<aa>111</aa>
<aa>
111
</aa>
-xml標簽可以是中文
-xml中標簽的名稱規則
1)xml代碼區分大小寫
<a><A>:這兩個標簽是不一樣的
2)xml標簽不能以數字和下劃線(_)開頭
3)xml的標簽不能以xml、XML、Xml等開頭
4)xml的標簽不能包含空格和冒號

xml中屬性的定義
-html是標記型文檔,可以由屬性
-xml也是標記型文檔,可以有屬性

屬性定義的要求
!)一個標簽上可以有多個屬性
2)屬性名稱不能相同
3)屬性名稱和屬性值之間使用= ,屬性值使用引號包起來(單引號,雙引號都可以)
4)xml屬性的名稱規範和元素的名稱規範一致

xml中的註釋
-寫法<!--xml的註釋 -->
-註意的地方
-註釋不能嵌套
-註釋也不能放到第一行,第一行第一列必須放文檔聲明

xml中的特殊字符
-如果想要在xml中現在a<b,不能正常顯示,因為把<當做標簽
-如果就想要顯示,需要對特殊字符<進行轉義
< &lt;
> &gt;

CDATA區--了解
-可以解決多個字符都需要轉義的操作
-if(a<b && B<c && d>f){}把這些內容放到CDATA區裏面,不需要轉義了
-寫法:
<![CDATA [ 內容 ]>
-代碼
<![CDATA [<b> if(a<b && B<c && d>f){} </b>]]>
把特殊字符,當做文本內容,而不是標簽
PI指令(處理指令)--了解
-可以在xml中設置樣式
-寫法:<?xml-stylesheet type="text/css" href="CSS路徑" ?>

xml的約束
為什麽需要約束?
比如現在定義一個person的xml文件,只想要這個文件裏面保存人多信息,比如name age等,但是如果在xml文件中
寫了一個標簽<貓>,發現可以正常顯示,因為符合語法規範,但是貓肯定不是人的信息,xml的標簽是自定義的,需要技術來規定xml
中只能出現的元素,這個時候需要約束。

xml的約束技術:dtd約束 和schema約束 ---看懂

xml-dtd