XML —— DTD介紹

一、DTD介紹

?

Document Type Definition;

??????? DTD是一種XML的約束方式,除了此種約束方式外,還有XSchema,XSchema比DTD的約束能力還要強,因此DTD正在逐漸淘汰;

??????? DTD的目的就是約束XML標簽的寫法;比如在我們struts2開發當中,編寫struts.xml時,需要遵循的規則,就是通過DTD進行約束的,因此我們在開發當中通過Eclipse導入DTD文件,便于開發提示,如果在開發中開發人員不遵循DTD的規范,則會出現錯誤提示;

<struts><package name="" namespace="" extends=""><action></action>    </package></struts>

??????? XML約束的重要性:在編寫XML時,對于XML進行約束是非常重要的,因為如果對于XML不約束,則會讓開發人員很難掌握;

??????? 而DTD通常是由框架設計人員定義的,一般的開發人員只需要在XML中遵循DTD規范編寫XML即可;

二、導入DTD

??????? 如果要導入DTD,可以通過兩種方式:

??????? (1)在XML中直接編寫;

??????? (2)在專門的DTD文件中編寫,然后在XML中通過特定的語句導入DTD文件;

??????? 1、在XML中直接編寫,語法如下:

?????? [html] view plaincopy
  1. <!DOCTYPE?根節點[??
  2. ????.........??
  3. ]>?

???????? 2.XML文件中導入DTD文件

?

??????? 此種方式需要考慮兩個情況:

? (1)如果是本地文件,則:

??????? [html] view plaincopy
  1. ???? <!DOCTYPE?根節點?SYSTEM?"dtd的URL">??

?????????? 此處的URL指的是比如 "F:\1.dtd"

? (2)如果是共享文件,則:

[html] view plaincopy
  1. <!DOCTYPE?根節點?PUBLIC?"dtd名稱"?"dtd的URL">??


三、DTD語法

?

在DTD中可以定義XML標簽的順序、個數,屬性的值,實體;

?

1.XML元素定義

?

語法如下:

<!ELEMENT 元素名稱 元素類型>????????//定義元素的類型,但是只能是 ANY(表示任意類型)或EMPTY(空元素);

<!ELEMENT 元素名稱 (元素內容)>????//定義元素的內容,一定要加上();

?

對于元素內容

----可以定義子元素的名稱,比如:

<!ELEMENT 元素名稱 (子元素1,子元素2,子元素3)> 表示3個子元素只能出現一次,并且按照此順序出現;

<!ELEMENT 元素名稱 (子元素1|子元素2|子元素3)> 表示3個子元素中只能出現一個;

我們還可以定義子元素的個數,比如:

(1)+:1次或多次;比如 (name+)表示此name元素只能出現1次或多次。

(2)?:0次或1次;比如(name?)表示此name元素只能出現0次或1次。

(3)*:0次或多次;比如(name*)表示此name元素任意出現幾次。

(4)無:只能一次;比如(name)表示此name元素只能出現1次。

對于元素內容,

----也可以定義子元素內容的類型,比如#PCDATA,表示字符串;

?

?

舉例:

[html] view plaincopy
  1. <!DOCTYPE?personlist?[????<!--?根節點為personlist-->??
  2. <!ELEMENT?personlist?(person+)>????<!--?personlist的子元素為person,并且可以出現1次或多次-->??
  3. <!ELEMENT?person?(name,age,salary)>????<!--?person的子元素是name,age,salary,并且可以出現一次,并且出現順序以此順序為準-->??
  4. <!ELEMENT?name?ANY>????<!--name可以使任意類型?-->??
  5. <!ELEMENT?age?(#PCDATA)>????<!--?age可以是字符串-->??
  6. <!ELEMENT?salary?(#PCDATA)>????<!--?salary可以是字符串-->??
  7. ]>??
  8. ???

從以上可以看出,DTD不可以定義數字等類型,此為DTD的缺陷;

?

2.XML屬性定義

?

語法如下:

<!ATTLIST 標簽名

????屬性名1????????屬性類型????????屬性說明

????屬性名2????????屬性類型????????屬性說明

>

屬性類型可以是

(1)CDATA:最普通的字符串;

(2)枚舉,即(值1|值2|值3),需要括號

(3)ID:屬性值需要以字母或下劃線開頭;

屬性說明可以是:

(1)#REQUIRED:必須設置;

(2)#IMPLED:可選值,即此屬性可以設置,也可以不設置;

(3)#FIXED:固定值,通常語法為:#FIXED? "固定值"

(4)默認值;

?

?? 舉例:

[html] view plaincopy
  1. <!DOCTYPE?personlist?[??
  2. ???
  3. <!ELEMENT?personlist?(person+)>??
  4. <!ELEMENT?person?(name,age,salary)>??
  5. <!ELEMENT?name?ANY>??
  6. <!ELEMENT?age?(#PCDATA)>??
  7. <!ELEMENT?salary?(#PCDATA)>??
  8. <!ATTLIST?person??
  9. aaa?CDATA?#REQUIRED????????<!--?-->??
  10. bbb?CDATA?#IMPLIED?????????<!--?可選屬性-->??
  11. ccc?CDATA?#FIXED?"xiazdong"?<!--固定值,不需要設置?-->??
  12. ddd?CDATA?"XZDONG"?????????<!--默認值為"XZDONG",?可以自己設置?-->??
  13. eee?ID?#REQUIRED?????????????<!--ID?-->??
  14. fff?(1|2|3)?"1"?????????????????????????<!--枚舉值,默認為1?-->??
  15. >??
  16. ]>??


?

3、XML實體定義

?

實體類似于一個可重用常量,或者說是ant中的classpath,可以被引用;

語法如下:

<!ENTITY 實體名稱? "實體內容">

引用實體語法:
&實體名稱;??? 注意:最后的“;”一定需要;

?

注意:引用實體必須在XML中引用;

?

舉例:

[html] view plaincopy
  1. <!DOCTYPE?personlist?[??
  2. ???
  3. <!ENTITY?constant?"aaaa">??
  4. <!ELEMENT?personlist?(person+)>??
  5. <!ELEMENT?person?(name,age,salary)>??
  6. <!ELEMENT?name?ANY>??
  7. <!ELEMENT?age?(#PCDATA)>??
  8. <!ELEMENT?salary?(#PCDATA)>??
  9. ???
  10. ]>??
  11. <personlist>??
  12. <person?>??
  13. <name>&constant;</name>????????<!--?引用constant實體-->??
  14. <age>aaa</age>??
  15. <salary>aaa</salary>??
  16. </person>??
  17. </personlist>??
  18. ???


小知識點:根據XML自動生成DTD

因為一般我們寫的XML基本都是沒有DTD的,如果要自己寫DTD,又很麻煩,因此我們可以通過工具來自動生成:trang

功能:能夠完成如下轉換:

(1)XML ---> DTD

(2)XML --->XSchema

(3)DTD--->XSchema


使用方法:

java -jar trang.jar -I xml -O dtd input.xml output.dtd 即可;

-I xml 表示輸入為xml;

-O dtd表示輸出為dtd文件;

input.xml表示輸入文件;

output.dtd表示輸出文件;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255414.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255414.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

更新的軟件可以解決 TortoiseGit-preview-2.5.7.0-20180127-b2d00f8-64bit.msi和Git-2.16.2-64-bit.exe。 鏈接地址為&#xff1a; https://github.com/git-for-windows/git/releases/download/v2.16.2.windows.1/Git-2.16.2-64-bit.exe https://download.tortoisegit.org/tgi…

Linux 圖片傳輸功能c/c++(初版)

由于深度學習任務的需要&#xff0c;要在程序里面嵌入一個module。 這個module 的功能是接收來自ios客戶端的圖片。并且傳送給深度學習分類器進行處理。 于是看了看各種各樣的 module 實現方案。 先是用IO函數把圖片以數組的方式存起來。 再和服務器建立連接&#xff0c;socket…

Val編程-val系列編程思想

利用Val語言可以編寫出各種各樣的應用程序。正如windows phone面臨的窘境一樣&#xff0c;受眾太小&#xff0c;市場不大。應用程序不多&#xff0c;所以也談不上成熟。國內的應用程序基本上就是簡單的小程序&#xff0c;談不上什么編程思想。國外許多都是基于kernel的而衍生出…

Celery的實踐指南

Celery的實踐指南celery原理&#xff1a;celery實際上是實現了一個典型的生產者-消費者模型的消息處理/任務調度統&#xff0c;消費者(worker)和生產者(client)都可以有任意個&#xff0c;他們通過消息系統&#xff08;broker&#xff09;來通信。典型的場景為&#xff1a;客戶…

【pyqt5學習】——bug修復,利用qt資源庫qrc文件進行背景圖像設置,不顯示圖像

目錄 bug描述 bug分析 bug解決 bug描述 利用下面文章的方法進行資源設置后&#xff0c;有的顯示了有的沒有顯示 【pyqt5學習】——pyqt5中.qrc資源文件的創建與編寫_有情懷的機械男的博客-CSDN博客_python qrc目錄一、說明二、安裝pyqt5以及相關工具&#xff08;pyqt5、pyuic…

Datalore:用于機器學習可視化的新Web方案!

前不久&#xff0c;JetBrains團隊發布了Datalore&#xff0c;這是一款基于云的web應用程序&#xff0c;用于構建機器學習模型并在Python中創建豐富的可視化。最新的測試版本旨在簡化構建機器學習模型的流程&#xff0c;并幫助開發人員進行數據分析。由于Datalore的智能編碼輔助…

Val3語言介紹

Val3語言是一門專門針對特定工業機器人的一門語言。在墻內有關這方面的介紹非常的少。在墻外維基百科上有一篇詳細介紹的,有空FQ摘抄在這里。 Val3是使用XML格式。可以使用XML編輯器來進行編寫VAL3的程序&#xff0c;可直接在模擬器上或者示教盒上編程&#xff0c;一般推薦使用…

網絡層相關問題

1.說一下網絡層的總體結構。 2.有沒有看過源碼&#xff1f; A.繼承Request   B.打日志   C.修改參數 3.說一下Volley整體結構。 4.有了解過OkHttp嗎&#xff1f; 5.說一下OkHttp和Volley的區別&#xff1f;轉載于:https://www.cnblogs.com/jarvisyin/p/6389553.html

CSS魔法堂:重拾Border之——圖片作邊框

前言 當CSS3推出border-radius屬性時我們是那么欣喜若狂啊&#xff0c;一想到終于不用再添加額外元素來模擬圓角了&#xff0c;但發現border-radius還分水平半徑和垂直半徑&#xff0c;然后又發現border-top-left/right-radius的水平半徑之和大于元素寬度時&#xff0c;實際值會…

共享內存簡介和mmap 函數

一、共享內存簡介 共享內存區是最快的IPC形式&#xff0c;這些進程間數據傳遞不再涉及到內核&#xff0c;換句話說是進程不再通過執行進入內核的系統調用來傳遞彼此的數據。 即每個進程地址空間都有一個共享存儲器的映射區&#xff0c;當這塊區域都映射到相同的真正的物理地址空…

【pyqt5學習】——QToolTip,QLabel控件,伙伴關系

目錄 0、學習資源 1、給控件設置提示信息——QToolTip 2、QLabel控件&#xff08;顯示圖像、設置超鏈接、信號綁定&#xff09; 3、QLabel伙伴關系 1&#xff09;代碼 2&#xff09;效果 3&#xff09;知識點addWidget 0、學習資源 PyQt5教程&#xff0c;來自網易云課堂…

Hello IT

從高中的計算機課開始學習如何按下開機鍵&#xff0c;如何上網&#xff0c;如何背誦五筆字根&#xff0c;再到大學中如何使用office,利用C編碼做算法&#xff0c;到現在IT中的偽一員&#xff0c;時間算起來也不短&#xff0c;然正在入門是在2010年8月杭州參加嵌入式培訓&#x…

ARM指令集2

ARM指令集2 ARM微處理器支持加載/存儲指令用于在寄存器和存儲器之間傳送數據&#xff0c;加載指令用于將存儲器中的數據傳送到寄存器&#xff0c;存儲指令則完成相反的操作。 LDR指令&#xff08;與MOV有區別&#xff0c;MOV只能操作通用寄存器&#xff09; LDR指令格式為&…

SylixOS中select原理及使用分析

2019獨角獸企業重金招聘Python工程師標準>>> 1. select接口簡介 1.1 select接口使用用例 select是操作系統多路I/O復用技術實現的方式之一。 多路I/O復用技術大致使用場景為&#xff1a;構造一張感興趣的文件描述符列表&#xff0c;然后調用多路復用的IO接口&#x…

【pyqt5學習】——QLineEdit學習(回顯模式)

目錄 1、回顯模式 2、成果顯示 3、知識點 1&#xff09;FormLayout布局添加addRow方法 2&#xff09;在輸入框顯示灰色提示字體&#xff0c;輸入內容時消失setPlaceholderText 3&#xff09;設置回顯模式setEchoMode 4、完整代碼 1、回顯模式 QLineEdit控件的主要功能是輸…

有關機械手臂控制中的兩個重要輸入參數

1.在機械手臂中有兩個重要參數。一個是編碼器的值&#xff0c;另外一個是馬達的電流值。根據這兩個可以獲得機械手臂的運動學&#xff0c;動力學的一些數據。第一重要特征參數 是DH參數&#xff0c;另外一個就是每個軸的質心參數。

MySQL的權限分配

MySQL 賦予用戶權限命令的簡單格式可概括為&#xff1a;grant 權限 on 數據庫對象 to 用戶&#xff0c;如 GRANT PRIVILEGES ON datebase.* to user% IDENTIFIED by passwd;一、給表數據賦權 grant 普通數據用戶&#xff0c;查詢、插入、更新、刪除 數據庫中所有表數據的權利。…

用HttpURLConnection發送http請求

//發送http請求try {//1.使用網址構造一個URL對象 URL url new URL(path);//2.獲取連接對象 HttpURLConnection conn (HttpURLConnection) url.openConnection();//3.設置一些屬性 //設置請求方式&#xff0c;注意大寫conn.setRequestMethod("GET");//設置請求超時…

【pyqt5學習】——QLineEdit控件輸入校驗器Validator、掩碼setInputMask限制輸入、textChanged信號

目錄 1、輸入校驗器——限制輸入框輸入的內容 1&#xff09;校驗器類型——整數、浮點數、數字字母結合&#xff08;正則&#xff09; 2&#xff09;步驟 3&#xff09;結果 ?編輯 ?編輯 4&#xff09;完整代碼 2、利用掩碼進行輸入的限制 0&#xff09;掩碼對照表 1…

Call requires API level 3 (current min is 1)

結果出現“Call requires API level 3 (current min is 1): 解決方法&#xff1a; 在工程上點擊右鍵 -> Android Tools -> Clear Lint Markers&#xff0c;即可。轉載于:https://www.cnblogs.com/qianyukun/p/5458331.html