我们知道xml是可以定义自己的标签的,那摩我们在写框架时使用标签为什么会有限制呢?那是因为文件中引入了约束文件,基本上都是引入.dtd文件和schema文件
让我们来看看这个dtd文件的书写方法吧!
在DTD文档中使用ELEMENT关键字来声明一个XML元素。
语法:<!ELEMENT 元素名称 使用规则>
使用规则: (#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data) EMPTY:用于指示元素的主体为空。比如<br/> ANY:用于指示元素的主体内容为任意类型。 (子元素):指示元素中包含的子元素
定义子元素及描述它们的关系: 如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。 如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL) 如果子元素用“|”分开,说明任选其一。 如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)
用+、*、?来表示元素出现的次数 +:表示至少出现一次,一次或多次 *:表示可有可无,零次、一次或多次 ?:表示可以有也可以无,有的话只能有一次。零次或一次
语法:<!ATTLIST 元素名称 属性名 属性类型 约束 属性名 属性类型 约束 .......... >
属性值类型:
CDATA:表示属性的取值为普通的文本字符串 ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉) ID:表示属性的取值不能重复,属性的值只能由字母,下划线开始,不能出现空白字符
属性约束设置说明
#REQUIRED:表示该属性必须出现 #IMPLIED:表示该属性可有可无 #FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值" 直接值:表示属性的取值为该默认值
<?xml version = "1.0" encoding="GB2312" standalone="yes"?> <!DOCTYPE 购物篮 [ <!ELEMENT 肉 EMPTY> <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉"> ]> <购物篮> <肉 品种="鱼肉"/> <肉 品种="牛肉"/> <肉/> </购物篮>这个不常用我就不提了,主要是懒得打字了!
第二种约束XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。 XML Schema规定XML文档实例的结构和每个元素/属性的数据类型方式叫做Schema约束,XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性。
XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd 和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根结点的名称为Schema
好了,我们就来看看schema是如何在xml中是用的吧!
第二行用来声明该文件是一个schema约束文件
第三行是用来被引用时作为命名空间来使用的
第四行声明这个schema约束是格式良好的
好了,我们现在声明了一个schema约束文件,那么如何在一个xml中引入约束文件呢?
第二行代码是引入我们的targetNamespace
第三行代码的格式为xsi:schemaLocation="{namespace} {location} namespace填写targetNamespace 空格 location填写文件路径
好了我们已经会如何声明和引入schema约束文件了,在让我们来学习一下如何进行schema文件具体内容的编写吧!
这就得用到XMLSchema复杂元素指示器了
All:表示只能出现一次 Choice: 只能出现其中的一个 Sequence:元素按照顺序出现 maxOccurs=“unbounded” 表示出现次数没限制 <element name="name" type="double" maxOccurs="unbounded"/> 定义属性(必须是复杂元素):<attribute name="p1" type="string" use="required"></attribute> <annotation></annotation>:表示任意元素
好了让我们来看一个案例吧
<?xml version="1.0" encoding="UTF-8"?> <!-- <!DOCTYPE person SYSTEM "day.dtd"> --> <class xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.self.com/20170309" xsi:schemaLocation="http://www.self.com/20170309 day.xsd" num="12" <!-- 添加标签属性num --> > <student id=138896> <!-- class子标签,添加标签属性id --> <name>王五</name> <!-- student子标签 --> <age>16</age> <!-- student子标签 --> </student> </class> <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.self.com/20170309" elementFormDefault="qualified" > <element name="class"> <!-- class是一个复杂标签 --> <complexType> <sequence> <!-- 定义这个标签是有序的 --> <element name="student"> <!-- student标签也是一个复杂标签 --> <complexType> <annotation> <!-- 可以是任何 --> <element name="name" type="string" ></element> <!-- name是简单标签 --> <element name="age" type="int" ></element> <!-- age是简单标签 --> </</annotation> <attribute name="id" type="ID" use="required"></attribute> <!-- 定义student标签的属性id --> </complexType> </element> </sequence> <attribute name="num" type="int" use="required"></attribute> <!-- 定义class标签的属性num --> </complexType> </element> </schema>