昨天semor yang叫我写一个XML文件,并且最好用DTD定义,完全不会的说,后来在网上查了些资料,终于弄出来了。

DTD实际上就是对你所写的XML文件的一个定义规范,你的XML文件必须按照你定义的规范来写。

那DTD又是怎么定义的呢?DTD有两种形式,一种是外部DTD(在XML文件中调用另外已经编辑好的DTD),另一种是内部DTD(在XML文件中直接设定DTD)。我写的是内部DTD。网上说DTD的定义规范很复杂,在此也只是简单做一下介绍吧!

我写的XML文件很简单,如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration[      //configuration是根元素
<!ELEMENT configuration (path*)>  //path是一个子元素
<!ELEMENT path (#PCDATA)>  
<!ATTLIST path id ID #REQUIRED> //id是path的一个属性
]>

<configuration>
<path id="1">c:\windows</path>

</configuration>

<!DOCTYPE element-name[......]>   DOCTYPE必须大写,定义了根元素的名字,省略号里的内容是添加子元素。
<!ELEMENT configuration (path*)>  定义根元素下的子元素出现的次数:

符号

代表标记出现的次数

不出现或只出现一次

*

不出现或可出现多次

+

必须出现一次以上

无符号

只能出现一次


〈!ELEMENT element-name element-definition〉
element-name:表示要设置的元素的名称。

element-definition:指明要对此元素进行怎样的定义,就是说〈元素〉...〈/元素〉之间能够包含什么内容,是其他元素还是一般性的文字。



 

属性值类别

描述

cdata   属性值仅仅是一般的文字。

enumerated 列出该属性的取值范围,一次只能有一个属性值能够赋予属性。

nmtoken 表示属性值只能由字母、数字、下划线、. 、:、-这些符号组成。

nmtokens 表示属性值能够由多个nmtoken组成,每个nmtoken之间用空格隔开。

id 该属性在xml文件中是唯一的,常用来表示人的身份证号码。

idref 表示该属性值是参考了另一个id属性。

idrefs 表示该属性值是参考了多个id属性,这些id属性的值用空格隔开。

entity 表示该属性的设定值是一个外部的entity,如一个图片文件。

entities 该属性值包含了多个外部entity,不同的entity之间用空格隔开。

notation 属性值是在dtd中声明过的notation(声明用什么应用软件解读某些二进制文件,如图片)。

#required 表示在标记中必须出现此属性。

#implied 标记中可以不出现此属性。

#fix属性的值是固定的某个值。

字符串 标记中如没有指定属性的值,那么此字符串就是此属性的值。

元素属性的定义:
〈!ATTLIST element-name attribute-name Type Default-value〉


最后举一个复杂点的例子:

〈?xml version="1.0" encoding="GB2312" ?〉

〈!DOCTYPE 参考资料 [

〈!ELEMENT 参考资料 (书籍 )〉

〈!ELEMENT 书籍 (名称,作者,价格)〉

〈!ELEMENT 名称 (#PCDATA)〉

〈!ELEMENT 作者 (#PCDATA)〉

〈!ELEMENT 价格 (#PCDATA)〉

〈!ATTLIST 价格 货币单位 CDATA #REQUIRED〉

]〉

〈参考资料〉

〈书籍〉

〈名称〉XML入门精解〈/名称〉

〈作者〉张三〈/作者〉

〈价格 货币单位="人民币"〉20.00〈/价格〉

〈/书籍〉

〈书籍〉

〈名称〉XML语法〈/名称〉

〈!-- 即将出版 --〉

〈作者〉李四〈/作者〉

〈价格 货币单位="人民币"〉18.00〈/价格〉

〈/书籍〉

〈/参考资料〉


 

最后解释一下PCDATA与CDATA的区别,其实现在的都还是不明白,先贴出来再说吧!
PCDATA表示已解析的字符数据。
   CDATA是不通过解析器进行解析的文本,文本中的标签不被看作标记。
   CDATA表示里面是什么数据XML不会解析.比如可能是下面的一段
   <![CDATA[

>b){
          System.out.println(a);
     }

     ]]>

    注意上面的一个">"符号.