上一文给出了xml的OverView。真正让我们关心的xml的技术有三个:
一、xml的定义,有两种技术DTD、xml Schema
二、xml转化,xsl,可以将一种xml转化成另一种xml格式
三、XSLPatterns,用于选取xml文档中的元素
一、三对于程序员来说是最有用的了。第三种用于解析xml文档。
今天就来研究一下DTD吧。DTD老实说比较简单。它的语法形式不是一个xml文档。DTD有哪些功能呢,我来简单描述一下,我看了一本参考资料(XML电视讲座培训教程),上面讲DTD很详细。讲了好几章,事实上这个东西没必要记住它的那些语法元素,只要有一个大概映像就行了。
解决一些实际问题吧。
什么是DTD?
DTD是Document Type Definitions(文档类型定义),它的作用是定义一个xml文档的合法格式,这个定义还太抽象了,倒底定义了哪些东西呢?
一、xml中有哪些元素,元素之间嵌套关系
二、某元素的属性有哪些,属性出现的顺序,值类型
三、某元素有哪些子元素,某一子元素的可能个数
四、某元素的哪些子元素是互斥的
差不多就这些了。一个xml文档,其实也就差不多这么些东西,其他用法都是比较生僻的,我们不用学孔乙己一样记住茴香豆的几种写法。呵呵。
怎样在一个xml中定义它的DTD声明呢?
两种方法,一种就是把DTD的详细内容写到xml中,这种方法麻烦,且不易与其他xml文档共用一个DTD声明。这种方法应当少用。另一种是通过链接的方式链接到一个DTD文件上面。语法如下:
<!DOCTYPE root_element_name SYSTEM "DTD_URL">
root_element_name是基本元素的名称
SYSTEM 是xml的关键字
DTD_URL是DTD文件绝对或相对URL
怎样在一个DTD中声明上面四种问题?
关键所在了。我一本那么厚的书,讲这个讲了好久,真是浪费啊。
如果是一个单独的DTD文件,其格式为:
<!DOCTYPE 根元素名[
…………………………
]>
就这么简单,中间就进行元素、属性的声明。
怎样定义一个元素?
<!ELEMENT A(B,C)> A元素中有B,C两元素
<!ELEMENT A(B*,C?,D+)> A元素中可能有0个或多个B元素,一个或0个C元素,一个或多个D元素
<!ELEMENT A(B|C)> A元素中可能有B元素或C元素,但是B与C不能同时存在于一个A元素中
<!ELEMENT A(B,(C|D)+)> 不用解释了
<!ELEMENT A(B|#PCDATA)*> 可以是B元素与可解析字符的混合内容,这个表达方式蛮重要的
怎样定义一个元素的属性呢?
简单的很。。方法如下:
<!ATTLIST Element_name Attribute_name Type Default_Value>
Element_name是要定义属性的元素名
Attribute_name是属性名
Type是属性值类型
Default_Value是属性的默认值
怎样为一个元素定义多个属性?
两种方法,分多个<!ATTLIST ……>来声明,另一种方法就是把多个属性写到一个<!ATTLIST ……>里面,示例如下:
<!ATTLIST Forms name CDATA>
<!ATTLIST Forms title CDATA>
也可以定义成:<!ATTLIST Forms name CDATA title CDATA>
如何定义一个属性是否必须?
有三种方法:
<!ATTLIST Forms name CDATA #REQUIRED> name属性是必须的
<!ATTLIST Forms title CDATA #IMPLIED> title属性不是必须的
<!ATTLIST Forms Visible CDATA #FIXED "true"> Visible属性是固定的,用户不能设成其它值
怎样定义实体?
事实上,xml中除了定义上面四大类东西外,还要定义实体。实体其实就相当于c++中的宏,是个代号。在DTD中定义的诘法如下:
<!ENITITY City "广州">
花了一个上午,把这个DTD的问题搞定了。至于XML Schema就算了。
评论