目录
XML相关概念
什么是XML约束?
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范(与xml语法无关),这称之为XML约束。
为什么需要XML约束?
为了保证数据的规范性和安全性。
XML有什么用?
(1)可以用来保存数据
(2)可以用来做配置文件
(3)数据传输载体
约束的分类
(1)DTD约束:语法简洁,共能比较单一。
(2)Schema约束:语法复杂,功能比较强大。
DTD约束
DTD概述
DTD(Document Type Definition,文档类型定义)
1)DTD是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。
2)XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,
3)各公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
4)DTD中的所有约束都是针对 与某个标签的子标签进行约束的
DTD的目的
验证XML文档是不是一个有效的XML文档。
有效:如果一个良构的XML文档满足了dtd的声明,就是一个有效的XML文档。有效一定良构,良构不一定有效。
DTD约束原理
注:通过DTD约束,XML就能在DTD的约束下进行自定义了,不过DTD有个缺点,那就是不能对数据进行数值约束这种范围约束。
XML文档引入DTD的方式
引入内部DTD
<!DOCTYPE 根元素[
DTD验证规则/实体定义...
]>
DTD代码与XML代码在同一个文件中
约束元素
1. 元素类型
和java语法意义,元素也是有类型区分的,元素有以下几种类型:
1)EMPTY(空元素),元素不包含任何数据(就是空标签< img />),但是可以有属性。
2)#PCDATA(只有PCDATA的元素),PCDATA是指被解析器解析的文本(字符串内容),不能包含其他类型的元素。例如(< p>这是字符串,不包含其他标签< /p>)
3)ANY(任何内容都可以)
2. 元素出现顺序和数量
注意符号: | + * ?
项目 | 书写语法 | 描述 |
---|---|---|
顺序出现 | < !ELEMENT name(a,b)> | 子元素a,b必须同时出现,且a必须在b之前出现 |
选择出现 | < !ELEMENT name(a|b)> | 子元素啊,b只能有一个出现,要么是a要么是b |
只能出现一次 | < !ELEMENT name(a)> | 子元素只能且必须出现一次 |
一次或者多次 | < !ELEMENT name(a)+> | 子元素a要么出现一次,要么出现多次 |
零次或者多次 | < !ELEMENT name(a)*> | 子元素a可以出现任意次(包括不出现,即出现零次) |
零次或者一次 | < !ELEMENT name(a)?> | 子元素a可以出现一次或者不出现 |
3. 元素格式
< !ELEMENT 元素名称 元素类型>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE notes [
<!ELEMENT notes (note)*>
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<notes>
<note>
<to></to>
<from></from>
<heading></heading>
<body></body>
</note>
<note>
<to></to>
<from></from>
<heading></heading>
<body></body>
</note>
</notes>
约束属性
属性值类型
1)CDATA,属性值为普通文本字符串。(cdata)
2)ENUMERATED,属性值的类型是一组取值的列表,XML文件中设置的属性值只能是这个列表中的某一个值。就好比java中的枚举类型,只能是其中的某个枚举值。(enumerated)
3)ID,表示属性值必须唯一。
4)IDREF:对某些具有ID属性的元素的引用,这些元素的ID属性值必须与IDREF属性的值相同。(idref)
5)IDREFS:含义:若干以空格分隔的IDREF。(idrefs)
设置说明
1)#REQUIRED,必须设置该属性。(required)
2)#IMPLIED,该属性可以设置也可以不设置。(implied)
3)#FIXED,该属性的值为固定的。(fixed)
4)使用默认值。(default) 属性格式
< !ATTLIST 元素名 属性名 属性值类型 设置说明>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persons[
<!ELEMENT persons (person)*>
<!ELEMENT person (name,age,contact,br)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT contact (phone|email)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT br EMPTY>
<!ATTLIST person
pid ID #REQUIRED
sex (男|女) '男'
qq CDATA #IMPLIED
parent IDREF #IMPLIED
>
]>
<persons>
<person pid="p1" sex="男" qq="aaa" parent="p2">
<name>张小明</name>
<age>10</age>
<contact>
<phone>1234567</phone>
</contact>
<br/>
</person>
<person pid="p2">
<name>张大明</name>
<age>35</age>
<contact>
<email>123@qq.com</email>
</contact>
</person>
</persons>
引入外部DTD
(1)当引用的文件在本地时:
< !DOCTYPE 根元素 SYSTEM "DTD文件路径">
(2)当引用文件是一个公共文件(DTD文件存在于远程服务器上)时:
< !DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">
schema约束
schema概述
(1)XML schema也是一个xml文件,其扩展名通常为.xsd。(xsd文件其实也和xml文件一样,有根)
(2)XML schema文档必须有一个根节点,并且这个根节点固定为< Schema>
(3)一个XML Schema,通常称为模式文档(约束文档),遵循这个文档写的xml称之为实例文档。
(4)编写一个约束文档后,通常需要把则个文件中声明的元素绑定到一个URI地址上,即定义为一个命名空间,以后xml文件就可以通过这个URI(命名空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束。
实例
XML Schema文件如下:具体语法先省略,先弄明白根元素中的属性的含义。
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/NewXMLSchema"
xmlns:tns="http://www.example.org/NewXMLSchema"
elementFormDefault="qualified">
<element name="书架"> <!--声明<书架>元素-->
<complexType><!--声明<书架>元素为复杂类型-->
<sequence maxOccurs="unbounded"><!--声明<书架>元素 sequence-有顺序; maxOccurs-无上限-->
<element name="书"><!--声明<书>元素-->
<complexType>
<sequence>
<element name="书名" type="string"></element><!--声明<书名>等元素的类型为string-->
<element name="作者" type="string"></element>
<element name="售价" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
xmlns引入命名空间(namespace):默认是W3C的。这个默认引用,只能出现一次。非默认引用需要加别名:如 xmlns:tns="http://www.example.org/NewXMLSchema" ,增加了别名 tns 。一个文档可以引入多个命名空间。
targetNamespace定义命名空间,其实Xml Schema的本质就是定义一个命名空间,供其他XML引用。这边的命名空间定义为URI为 "http://www.example.org/NewXMLSchema" ,引用的时候也必须是这个。
elementFormDefault控制元素。有两个取值:"qualified"-定义的所有元素都绑定为这个命名空间; unqualified:表示只有根元素绑定为这个命名空间。
attributeFormDefault控制属性的。用法与elementFormDefault一样。引用这个XMLSchema 的XML文件如下
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http://www.example.org/NewXMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.example.org/NewXMLSchema/NewXMLSchema.xsd">
<书>
<书名>XML基础</书名>
<作者>SAM-SHO</作者>
<售价>28.00元</售价>
</书>
</书架>
xmlns:引入命名空间,默认使用方法(也可以使用别名)。这个地址只是"虚"的路径,需要 schemaLocation具体指定位置
schemaLocation:辅助xmlns引入“实”的命名空间,指定具体的命名空间所指向的文件,需要具体路径。2部分组成:定义好的命名空间路径 + 具体schema文件的路径
xsi:schemaLocation的使用用到了xsi,所以使用xmlns:xsi指定为来自的命名空间为 W3C,固定用法。
把CSS引入XML文件
css文件
c1{
font-size:200px;
color:red;
}
c2{
font-size:150px;
color:green;
}
c3{
font-size:100px;
color:#ccc;
}
c4{
font-size:130px;
color:blue;
}
XML文件
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="css1.css"?>
<Country>
<c1>aaa</c1>
<c2>bbb</c2>
<c3>ccc</c3>
</Country>