- DTD约束
- DTD的书写位置
- XML构建模块
- DTD定义元素
- DTD属性的定义
- DTD实体的定义
- schema约束
- 命名空间
- schema约束的书写流程
XML被设计为一种很灵活的标记文档. 但是,有点灵活过头了,因为,可以使用任何自定义标签. 这样的话,很显然很难把控XML到底会被写成个什么样子. 所以,需要给这货一个约束.
DTD约束
DTD,文档类型定义,它可以被定义在XML文件内部,也可以作为一个外部引用来使用.
DTD的书写位置
1.包含在XML文件内部
DTD定义可以使用来包含在XML文档内部.
比如像这样
]>
<note>
<to>Georgeto>
<from>Johnfrom>
<heading>Reminderheading>
<body>Don't forget the meeting!body>
note>
2.外部引用
DTD还可以被定义为一个外部文件,然后在XML内部引用. 此时需要注意:
- dtd外部文件的格式为xxx.dtd
- 在XML文件中,使用
来引入dtd文件
比如:一个dtd文件的声明(note.dtd)
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
然后在xml文件内部引用它:
<note>
<to>Georgeto>
<from>Johnfrom>
<heading>Reminderheading>
<body>Don't forget the meeting!body>
note>
XML构建模块
一个XML文件到底有哪些部分组成呢? 抽象之后,可以归纳为以下几个简单的结构:
- 元素:也就是传说中的标签(貌似不是很严谨,精神领会) 比如
hello world
- 属性:可以提供有关元素的额外信息. 属性被放置在开始标签中. 以’键=值’的形式存在. 比如
- 实体:说学术点叫做用来定义普通文本的变量,说的土一点,就是转义字符… 比如
<
- PCDATA:好高端的叫法,叫做可以被解析的字符数据(parsed character data),就是XMl元素的开始标签和结束标签之间的文本. xml本质上就是一个文本,xml引擎在读取的时候,文本中的标签会被作为标记来处理,而实体会被展开.
- CDATA:字符数据(character data),也就是一个不会被解析引擎解析的区域. 其中的所有字符都会被看作字符.
DTD定义元素
DTD中对元素的定义:
<!ELEMENT 元素名称 类别>
或者是
<!ELEMENT 元素名称 (元素内容)>
元素类型定义
- 声明一个空元素:
- 声明一个字符串元素:
- 声明可以带任意内容的元素:
子元素定义
-
子元素之间的关系:
- 按顺序出现(序列): 逗号分隔,
- 或:
- 按顺序出现(序列): 逗号分隔,
-
子元素的数量:
- 只出现一次:
- 至少出现一次:
- 出现0次或者多次:
- 出现0次或1次:
- 只出现一次:
我在想如果我需要声明几个子元素,但是不考虑顺序的话要怎么写呢?貌似没有给这么个关键字啊… 可以把数量和子元素之间的关系组合一下嘛,比如:
这样就可以了嘛,可以出现多次的PCDATA、”to”、”from”、”header” 或者 “message”。
DTD属性的定义
通过ATTLIST关键字来声明,像这个样子
<!ATTLIST 元素名称
属性名称 属性类型 属性约束
属性名称 属性类型 属性约束
>
属性类型
- CDATA:字符数据
- (en1|en2|…):枚举类型
- ID:值为唯一的id
- IDREF:值为另外一个元素的id
属性约束
- 值:表示属性的陌生值
- #REQUIRED:表述属性值是必须的
- #IMPLIED:属性是可选的
- #FIXED value:属性值是固定的
DTD实体的定义
实体可以看作一个转义字符(或者说是一个普通文本或者特殊字符的快捷方式的变量)
定义很简单
使用的时候,在PCDATA区域使用&实体名称;
就可以了.
比如:
使用的时候:
schema约束
为什么使用schema约束
schema约束可以克服DTD约束的局限性,以下是DTD和schema约束的对比:
- XML Schema符合xml的语法
- DOM SAX方式可以很容易的解析XML schema文档
- XML schema对名称空间支持良好
- schema支持更多的数据类型定义,并且支持自定义数据类型
- schema约束能力更强,可以对XML实例文档提供更细致的限制
- schema不能像DTD定义实体,比DTD更复杂,但是xml schema现在已经是w3c组织的标准.
schema文档的特点:
- schema约束文档本事就是xml文档,但是它的后缀是.xsd
- 和XML文件一样,有且仅有一个名为schema根节点
命名空间
使用命名空间的目的是为了避免元素名称冲突.
命名空间的声明格式 xmlns:namespace-prefix="namespaceURI"
在一个文档中,还可以有一个隐式的命名空间,也就是不带前缀的形式: xmlns="namespaceURI"
在一个元素标签上使用命名空间之后,该元素标签的所有子元素都属于这个命名空间.
在schema中使用命名空间
- 在全局范围使用命名空间:
targetNamespace="http://www.thecatcher.net/note"
xmlns:tns="http://www.thecatcher.net/note" >
- 在非全局范围使用:
targetNamespace="http://www.thecatcher.net/note"
xmlns:tns="http://www.thecatcher.net/note"
elementFormDefault="qualified">
可以看出来,唯一的区别就是 非全局范围的时候多了一个elementFormDefault="qualified"
属性,这个属性默认值是unqualified,表示,只有全局成分才被定为在目标名称空间中. 而qualified表示目标名称空间包含了非全局的元素定义.
targetNamespace
targetNamespace也是一个名称空间的声明,它定义了Schema定义的新元素与属性的名称空间. 在http://www.w3.org/2001/XMLSchema
空间中定义了element,attribute,complexType等元素,如果自身并不适用重用的组件,那么只需要声明targetNamespace就可以,不需要指定别名.
我的理解,schema约束文件本身遵循xml规范,也就是说他本身也是可以约束的,所以schema命名空间其实跟xml命名空间是一样的.
schemaLocation
用于引入一个具有名称空间的schema约束文档.