因为xml的标签由用户本身定义,所以在开发的时候,每一个人均可以根据本身的需求来定义xml标签,这样致使项目中的xml难以维护,所以须要使用必定的规范机制来约束xml文件中的标签书写。html
第一步:先本身定义一个xml文件学习
<?xml version="1.0" encoding="UTF-8"?> <users> <user> <name>zhangsan</name> <age>23</age> <addr>shanghai</addr> </user> <user> <name>lisi</name> <age>24</age> <addr>beijing</addr> </user> </users>
第二步:书写DTD文件来约束xml文件url
DTD文件在定义的时候,扩展名就是dtd。spa
在xml文件中有多少个标签,就在dtd中书写多少个ELEMENT标签code
<?xml version="1.0" encoding="UTF-8" ?> <!ELEMENT users (user+) > <!ELEMENT user (name,age,addr) > <!ELEMENT name (#PCDATA) > <!ELEMENT age (#PCDATA)> <!ELEMENT addr (#PCDATA)>
DTD主要用来约束xml文件,DTD能够单独写在文件中,也能够直接定义在xml中,能够在xml中引入第三方的公共DTD。 外部DTD的引入方式:外部DTD主要指的一个独立的DTD文件。 首先要书写DTD文件,而后在要被约束的xml文件中引入。 <!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL"> 文档根结点 指的是当前xml中的根标签。 SYSTEM 引入的系统中存在文件 "DTD文件的URL" DTD存放的位置 引入公共的DTD: <!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL"> 文档根结点 指的是当前xml中的根标签。 PUBLIC 表示当前引入的DTD是公共的DTD 在xml中直接书写DTD <!DOCTYPE 根标签名 [ 具体的标签的约束 ]>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE users[ <!ELEMENT users (user+) > <!ELEMENT user (name,age,addr) > <!ELEMENT name (#PCDATA) > <!ELEMENT age (#PCDATA) > <!ELEMENT addr (#PCDATA) > ]> <users> <user> <name>zhangsan</name> <age>23</age> <addr>shanghai</addr> </user> <user> <name>lisi</name> <age>24</age> <addr>beijing</addr> </user> </users>
当定义DTD约束xml时候,这时须要在DTD中使用ELEMENT来定义当前xml中能够出现的标签名称。 格式: <!ELEMENT 标签名 约束> 约束来限定当前标签中能够有的子标签,或者当前标签中能够书写的内容 在定义标签名的时候,约束中可使用一些符号标签具体出现次数 ? 零次或者一次 * 零次或者屡次 + 一次或者屡次 users (user+) 表示当前的users标签下能够有一个或者多个user标签 , 用来限定当前的子标签出现的顺序user (name,age,addr) user标签下只能有name age addr 子标签,而且必须按照name age addr的顺序书写 | user (name|age,addr) user下能够name或者age ,但必须有addr,而且addr必须name或age后面 #PCDATA 代表该元素可包含任何字符数据,但不能在其中包含任何子元素。只有 PCDATA 的元素经过圆括号中的 #PCDATA 进行声明 EMPTY 代表该元素不能有任何子元素或文本,仅可使用属性。 ANY 表该元素中能够包含任何DTD中定义的元素内容 如:<!ELEMENT note ANY> <!ELEMENT age EMPTY > 当前的age标签是个空标签,它不能有文本内容。
属性的类型:
CDATA 属性的value值能够是文本数据
(值1 | 值2 | 值3.... ) 表示当前的属性的value值只能是当前括号中的值
ID 表示惟一。对当前标签上的id属性进行限定,而且同一个xml中id不能重复
类型 描述
CDATA 值为字符数据 (character data)
(en1|en2|..) 此值是枚举列表中的一个值
ID 值为惟一的 id
IDREF 值为另一个元素的 id
IDREFS 值为其余 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预约义的 XML 值
属性的类型和约束的组合:
CDATA REQUIRED
CDATA Implied
CDATA fixed
CDATA “值”
(值1 | 值2 | 值3.... ) REQUIRED
ID REQUIRED
实体用于为一段内容建立一个别名,之后在XML文档中就可使用别名引用这段内容了。 在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。 实体能够理解成Java中预先定义好的一个常量,而后xml文件中就能够引入当前这个定义的实体。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE users[ <!ELEMENT users (user+) > <!ELEMENT user (name,age,addr) > <!ELEMENT name (#PCDATA) > <!ELEMENT age EMPTY > <!ELEMENT addr (#PCDATA) > <!ATTLIST user id ID #REQUIRED > <!ENTITY abc "上海传智播客123123"> ]> <users> <user id="u001"> <name>zhangsan</name> <age></age> <addr>&abc;</addr> </user> <user id="u002"> <name>lisi</name> <age/> <addr>&abc;</addr> </user> </users>
Schema它也来约束xml文件的,DTD在约束xml的时候一个xml中只能引入一个DTD,同时DTD它没法对属性以及标签中的数据作数据类型的限定。
Schema它是用来代替DTD来约束xml。
Schema文件自己就是使用xml文件书写的,同时它对须要约束的xml中的数据有严格的限定。学习Schema主要来学习W3C组织定义的如何在Schema中去约束xml的标签以及属性,还有属性的数据类型,以及标签中子标签的顺序。
要定义一个Schema文件,这时它的扩展名必须是.xsd。在这个文件中根元素必须是schema。
使用Schema来约束xml,Schema在书写的时候,只须要使用W3C组织提早定义的限定标签的,以及限定的属性的那个标签便可。
第一步:书写xml文件orm
<?xml version="1.0" encoding="UTF-8"?> <books> <book> <name>JavaWEB</name> <author>老毕</author> <price>182</price> </book> <book> <name>SSH</name> <author>老于</author> <price>152</price> </book> </books>
第二步:定义schema文件xml
在定义Schema文件的时候,因为这个Schema文件自己就是xml,它也要受到别的约束。而这个约束是W3C组织提早定义好的, 在Schema文件中须要提早引入进来在根标签中使用属性进行进入: <schema xmlns="http://www.w3.org/2001/XMLSchema" 引入W3C定义的schema书写的规范 targetNamespace="http://www.itcast.org/book" 给当前的Schema文件起名字(命名空间) 做用是当哪一个xml要引入这个schema约束的时候,必须经过当前targetNamespace 后面书写的uri地址来引入
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.org/book" elementFormDefault="qualified"> <element name="books"> <complexType> <sequence> <element name="book"> <complexType> <sequence> <element name="name"></element> <element name="author"></element> <element name="price"></element> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema>
第三步:在xml文件中引入当前的这个Schemahtm
<books xmlns="http://www.itcast.org/book" 它是schema文件中的targetNamespace 属性后面的值 xsi:schemaLocation="http://www.itcast.org/book book.xsd" 这个是在引入当前的schema文件的真实路径 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 说明当前的xml是schema一个实例文档 >
在定义Schema文件的时候,须要在<schema>根标签中使用 targetNamespace 属性定义当前schema定义名称(只是一个分配的名字,根本没有指向任何文件),在被约束的xml文件中先根据这个名称引入当前的schema文件,而后在使用 xsi:schemaLocation=”” 引入具体的schema文件。(由于targetNamespace属性定义的schema名称,只是一个名称而已,因此在xml文件中须要经过schemaLocation来声明指定所遵循的Schema文件的具体位置) (xsi:schemaLocation 使用它引入某个schema时,先要使用名称空间, 空格 ,文件名) 名称空间主要功能是用于来 elementFormDefault="qualified|unqualified" 在schema中书写qualified ,在限定xml中的定义的标签名必须使用定义的名称空间。 unqualified 要求根元素必须使用名称空间,而子元素不能使用名称空间。
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast2.org/book" elementFormDefault="qualified"> <element name="books"> <!--name表明当前的xml中能够书写标签名称 type数据类型--> <complexType ><!-- complexType 当前的element声明的标签是复杂标签时 ,须要使用complexType来声明子标签--> <sequence> <!-- 复杂标签是指有属性,或者有子标签,或者有属性有子标签的标签 简单标签是指只有文本内容的标签 <name>zhangsan</name> 简单标签 <name id="u001"></name> 复杂标签 sequence 表明当前子标签的顺序 --> <element name="book" maxOccurs="unbounded"> <complexType mixed="true"><!—mixed属性值为true,book元素间就能够出现字符文本数据了--> <sequence> <element name="name"></element> <element name="author"></element> <element name="price" type="integer"></element> <any></any> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema>
Name.xsdblog
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/name" elementFormDefault="qualified"> <element name="name"></element> </schema>
Book2.xmlelement
<?xml version="1.0" encoding="UTF-8"?> <aa:books xmlns:aa="http://www.itcast2.org/book" xmlns:bb="http://www.example.org/name" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.itcast2.org/book book2.xsd http://www.example.org/name name.xsd" > <aa:book> aa:sjdlkfjlkdsjflk <aa:name >JavaWEB</aa:name> <aa:author >老毕</aa:author> <aa:price>182</aa:price> <bb:name>sdgs</bb:name> </aa:book> </aa:books>
此文转载于https://www.cnblogs.com/cb0327/ 详细请看http://www.javashuo.com/article/p-wsmlrbke-bu.html