为了方便数据交换,需要明确元素与元素之间、元素与属性之间的关系以及属性的取值范围。
常用的约束技术:XML DTD(Document Type Definition【文档类型定义】)(易学,功能有限)
XML Schema(难学,功能强大)
DTD 声明有两种:
一种是声明在外部文件中,一种是直接在文档中给出DTD
直接给出DTD ——> <!DOCTYPE 根元素 [元素声明]>
带有 DTD 的 XML 文档实例
<?xml version="1.0"?><!DOCTYPE 书架 [<!ELEMENT 书架 (书)><!ELEMENT 书 (书名,作者,售价)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 作者 (#PCDATA)><!ELEMENT 售价 (#PCDATA)>]><书架><书><书名>西游记</书名>
<作者>吴承恩</作者>
<售价>45</售价>
</书>
</书架>以上 DTD 解释如下:!DOCTYPE 书架 (第二行)定义此文档是 书架 类型的文档。!ELEMENT 书 (第四行)定义 书 元素有三个元素:"书名,作者,售价" //这些元素是有顺序的,后边定义时必须按照此处给定的顺序。!ELEMENT 书名 (第五行)定义 书名 元素为 "#PCDATA"【字符型】 类型!ELEMENT 作者 (第六行)定义 作者 元素为 "#PCDATA" 类型!ELEMENT 售价 (第七行)定义 售价 元素为 "#PCDATA" 类型ELEMENT(元素)外部声明是创建一个扩展名为.dtd的单独的文档,在每个需要符合此约束的XML文件中引用这个文档。如果DTD比较简单 建议写在内部,如果比较复杂又有多处引用此约束,就写在外部。当外部文件在本地时,采用如下方式:<!DOCTYPE 书架 SYSTEM "book.dtd">当外部文件是一个公共文件时,采用下边的方式:<!DOCTYPE 文档根节点 PUBLIC "DTD名称" "DTD文件的URL">
语法细节:
利用括号、逗号、竖线、星号、加号和问号的组合可以说明很复杂的内容模型。
--用逗号分隔,表示出现的顺序必须与声明时一致。--用|分隔,表示任选其一,即多个只能出现一个。--用 +、*、?表示元素出现的次数+ 一次或者多次,例 (书+)? 0次或1次 , (书?)* 0次或多次 , (书*) 或者 (书) 有且只有一次
属性定义:ATTLIST
#REQUIRED:必须设置该属性值
#IMPLIED: 可以设置也可以不设置
#FIXED: 说明该属性取值为一个固定值,在XML文件中无需定义,此处会提供一个默认值。
直接使用默认值:在XML中可以设置该值也可以不设置,如果不设置,会直接使用提供的默认值。
实体的定义:相当于定义变量。