为什么要有XML约束?
虽然XML本身具有比HTML更加严格的语法审查,但是XML没有,也不可能有针对每个用户定义标签的内容语法规定。
比如<age>-1</age> 这样明显的语法错误.XML约束出现就为了解决这种问题。
XML约束技术
- DTD约束.
- Schema约束.
|DTD|Schema|
|:-:|:-:|:-:|
|语法简单,功能简单|语法负责,功能复杂|
DTD语法:
w3c的一个Demo:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
外部DTD(本地导入)
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE 根元素 SYSTEM "文件名">
一个例子:
note.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
---
note.xml
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
外部DTD(公共导入)
<!DOCTYPE 根元素 PUBLIC "http://google.com/xxx.dtd">
约束标签
<!ELEMENT 元素名称 类别> 或 <!ELEMENT 元素名称 (元素内容)>
(#PCDATA)
代表普通字符串,不能包含子标签
ANY
代表任何内容
EMPTY
代表必须为空
(子元素名称1,子元素名称2,...)
<!ELEMENT note (to,from,heading,body)>
代表我的note标签下,一定按顺序出现to标签,from标签,...
规定标签一定出现一次
(子元素名称1+)
<!ELEMENT note (to+,from,heading,body)>
代表to标签至少出现一次,可以多次
(子元素名称1*)
<!ELEMENT note (to,from*,heading,body)>
代表from标签出现0次或多次
(子元素名称1?)
<!ELEMENT note (to,from,heading?,body)>
代表heading标签0次或1次
约束属性
属性声明使用下列语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
DTD 实例:
<!ATTLIST payment type CDATA "check">
默认值参数可使用下列值:
值 属性的默认值
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
#REQUIRED
<!ATTLIST to ip CDATA #REQUIRED>
属性类型
CDATA : 表示普通字符串
(en1|en2|...) 枚举,表示一定任选其中的一个值
ID 值为唯一的 id(不能数字开头)
---------------------------------------
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值
报纸文章 DTD
<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">
]>
网友评论