一.先來兩個小例子
內部dtd將standalone設為真。
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE root [
<!ELEMENT root EMPTY>
]>
外部dtd將standalone設置為假
<?xml version="1.0" standalone="no"?>
<!DOCTYPE root SYSTEM "http://www.test.org/test.dtd">
二.概論
DTD聲明始終以!DOCTYPE開頭,空一格后跟着文檔根元素的名稱。
如果是內部DTD(私有DTD),則再空一格出現[],在中括號中是文檔類型定義的內容.
而對於外部DTD,則又分為私有DTD與公共DTD,
私有DTD使用SYSTEM表示,接着是外部DTD的URL.
公共DTD則使用PUBLIC,接着是DTD公共名稱,接着是DTD的URL.
三.外部DTD之公共DTD
公共DTD,DTD名稱格式為"注冊//組織//類型 標簽//語言",
"注冊"指示組織是否由國際標准化組織(ISO)注冊,+表示是,-表示不是.
"組織"即組織名稱,如:W3C; "類型"一般是DTD,
"標簽"是指定公開文本描述,即對所引用的公開文本的唯一描述性名稱,后面可附帶版本號。
最后"語言"是DTD語言的ISO 639語言標識符,如:EN表示英文,ZH表示中文,在下面的地址有完整的ISO 639語言標識符列表http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt
舉例:<!DOCTYPE root SYSTEM "http://www.test.org/test.dtd">
舉例xhtml的doctype(xhtml是html的xml化,現在html中寫法非常簡單,不需要寫doctype了):
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml/DTD/xhtml1-transitional.dtd">
表明根元素為html標簽,為公共DTD,非注冊,w3c組織,類型為DTD,標簽為transitional,語言為英語。
四.外部DTD之私有DTD
<!DOCTYPE root SYSTEM "http://www.test.org/test.dtd" >
五.內部DTD
<!DOCTYPE rootElement [
declarations
]>
六.內部DTD和外部DTD可以混合使用
<!DOCTYPE rootElement SYSTEM "URIreference"[
declarations
]>
或者
<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference"[
declarations
]>
七.在eclipse中使用DTD
Window>preference>XML>XML Catalog添加User Specified Entries,下面以mybatis的DTD文件為例說明。
打開mybatis.xml,在各個標簽下嘗試使用alt+/代碼提示,可以看到可用標簽。
將DOCTYPE標簽刪掉,會產生一個警告。此時會發現代碼提示功能沒了。
去此處下載dtd文件:http://mybatis.org/dtd/mybatis-3-config.dtd,保存為c:\mybatis.dtd
在eclipse中添加User Specified Entries,localtion就寫:c:\mybatis.dtd,key寫mybatis
在mybatis.xml中添加doctype:
<!DOCTYPE configuration PUBLIC "mybatis" "C:\Users\weidiao\Documents\my-java-lib\XML-DTD\mybatis-3-config.dtd">
這時又可以使用代碼提示了。
這樣做的缺點是,dtd文件位於本機,移植性較差;優點是dtd文件都在本機上,即使電腦從來沒有連網,也可以正常使用。實際上,現在你斷開網絡,依舊可以自動提示,因為eclipse已經緩存好了。在這里:windows->preference->network connections->cache,好多的dtd文件有沒有,一旦清空緩存,你就沒有代碼提示功能了!當然也不必多慮,現在有幾個電腦不經常聯網。
八.Log4j 2.0使用DTD文件
log4j 2.0的配置支持多種方式,json,xml,properties等。其中xml配置方式又分為嚴格版和簡易版,嚴格版寫起來比較麻煩。json版也沒有代碼提示功能。解壓log4j2.0的core包,可以看見幾個xsd文件和dtd文件,他們就是定義XML配置格式的。要想使用代碼提示,也不用搗鼓這些xsd和dtd,直接使用log4j的嚴格版就可以。一旦導入log4j包,就已經可以使用了!
如下所示,通過package屬性引入了命名空間。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="debug" strict="true" name="XMLConfigTest" packages="org.apache.logging.log4j.test"> <Properties> <Property name="filename">target/test.log</Property> </Properties> <Filter type="ThresholdFilter" level="trace" /> <Appenders> <Appender type="Console" name="STDOUT"> <Layout type="PatternLayout" pattern="%m MDC%X%n" /> <Filters> <Filter type="MarkerFilter" marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL" /> <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="DENY" onMismatch="ACCEPT" /> </Filters> </Appender> <Appender type="Console" name="FLOW"> <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n" /><!-- class and line number --> <Filters> <Filter type="MarkerFilter" marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL" /> <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </Appender> <Appender type="File" name="File" fileName="${filename}"> <Layout type="PatternLayout"> <Pattern>%d %p %C{1.} [%t] %m%n</Pattern> </Layout> </Appender> <Appender type="List" name="List"> </Appender> </Appenders> <Loggers> <Logger name="org.apache.logging.log4j.test1" level="debug" additivity="false"> <Filter type="ThreadContextMapFilter"> <KeyValuePair key="test" value="123" /> </Filter> <AppenderRef ref="STDOUT" /> </Logger> <Logger name="org.apache.logging.log4j.test2" level="debug" additivity="false"> <AppenderRef ref="File" /> </Logger> <Root level="trace"> <AppenderRef ref="List" /> </Root> </Loggers> </Configuration>
九.XSD:DTD的終結者
對於這些細節問題,知道就可以了。然而知道100個,在應用的時候能靈活使用的只有1個,所以還是應該對這些知識點有清晰的印象,技不壓身。
XSD是指XML結構定義 ( XML Schemas Definition )
XML Schema 是DTD的替代品。XML Schema語言也就是XSD。
XML Schema描述了XML文檔的結構。可以用一個指定的XML Schema來驗證某個XML文檔,以檢查該XML文檔是否符合其要求。文檔設計者可以通過XML Schema指定一個XML文檔所允許的結構和內容,並可據此檢查一個XML文檔是否是有效的。XML Schema本身是一個XML文檔,它符合XML語法結構。可以用通用的XML解析器解析它。
一個XML Schema會定義:文檔中出現的元素、文檔中出現的屬性、子元素、子元素的數量、子元素的順序、元素是否為空、元素和屬性的數據類型、元素或屬性的默認和固定值。
XSD是DTD替代者的原因,一是據將來的條件可擴展,二是比DTD豐富和有用,三是用XML書寫,四是支持數據類型,五是支持命名空間。
XSD文件的后綴名為.xsd。
Xml Schema的用途
1. 定義一個Xml文檔中都有什么元素
2. 定義一個Xml文檔中都會有什么屬性
3. 定義某個節點的都有什么樣的子節點,可以有多少個子節點,子節點出現的順序
4. 定義元素或者屬性的數據類型
5. 定義元素或者屬性的默認值或者固定值
XML Schema的優點:
1) XML Schema基於XML,沒有專門的語法
2) XML可以象其他XML文件一樣解析和處理
3) XML Schema支持一系列的數據類型(int、float、Boolean、date等)
4) XML Schema提供可擴充的數據模型。
5) XML Schema支持綜合命名空間
6) XML Schema支持屬性組。
十.XSD小例子
在eclipse中新建java工程,在src目錄下新建haha.xsd
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified"> <xsd:element name="animals"> <xsd:complexType> <xsd:sequence> <xsd:element name="dog" type="xsd:string" maxOccurs="10" /> <xsd:element name="cat" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
然后在新建一個xml文件,命名空間引用haha.xsd
<?xml version="1.0" encoding="UTF-8" standalone='no'?> <animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="haha.xsd"> <dog>wyf</dog> <cat>weidiao</cat> </animals>
寫完animal並引入命名空間之后,就這樣一寫‘<’就會看到可選標簽:dog和cat。如果不能看到,那就把這兩個文件關閉,重新打開一下就可以了,這是因為eclipse的代碼自動提示功能不可能動態的隨着xsd文件的改變而迅速改變。