昨天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);
}
]]>
注意上面的一个">"符号.