XML中的DOCTYPE屬性


一.先來兩個小例子

內部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了):

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"       
  2. "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文件的改變而迅速改變。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM