首页 > 代码库 > 第1天 XML和DTD、schema约束
第1天 XML和DTD、schema约束
1、xml
* 扩展名:*.xml
* 作用:存储、配置
一个XML文件分为如下几部分内容:文档声明、元素、属性、注释 CDATA区、特殊字符、处理指令(processing instruction)。
1.1文档声明
最简单的声明语法:
<?xml version="1.0" ?>
version:设置当前xml文档内容使用的版本
用encoding属性说明文档的字符编码:
<?xml version="1.0" encoding="GB2312" ?>
用standalone属性说明文档是否独立:
<?xml version="1.0" encoding="GB2312" standalone="yes" ?>
常见错误
没有写引号:<?xml version=1.0 ?>
输入内容中有中文: <?xml version=“1.0” ?> //中文空格
编码错误,记事本设置编码UTF-8,用其他编辑器打开。
1.2元素
XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签。
格式:<x></x> or <x />,名称自定义
- 建议字母开头
- 区分大小写
- 不能包含空格 <a b>
- 不能包含冒号 <a:b>
注意:
- 一个标签中也可以嵌套若干子标签,但不能交叉嵌套
- 格式良好的xml文档只有一个根
由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。
1.3属性
- 前提:在某元素的基础上,确定相应的属性
- 格式:<x attribute="attrValue" />.
一个标签可以有多个属性,每个属性都有它自己的名称和取值。
属性值一定要用双引号(")或单引号(‘)引起来。
定义属性必须遵循与标签相同的命名规范。
1.4注释
格式:<!--注释内容-->
注意:XML声明之前不能有注释;注释不能嵌套
1.5转义字符
格式: &xx; --> {详见“html转义.html”
HTML特殊转义字符列表
最常用的字符实体
Character Entities
显示 |
说明 |
实体名称 |
实体编号 |
|
半方大的空白 |
  |
  |
|
全方大的空白 |
  |
  |
|
不断行的空白格 |
|
  |
< |
小于 |
< |
< |
> |
大于 |
> |
> |
& |
&符号 |
& |
& |
" |
双引号 |
" |
" |
? |
版权 |
© |
© |
? |
已注册商标 |
® |
® |
? |
商标(美国) |
? |
™ |
× |
乘号 |
× |
× |
÷ |
除号 |
÷ |
÷ |
1.6 CDATA区
在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。
- 在xml文档中存放任意内容的区域
- 格式:<![CDATA[ cdata内>*容 ]]>
1.7处理指令(processing instruction,PI)
处理指令用来指挥解析引擎如何解析XML文档内容。例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。
格式:<?xml-stylesheet type="text/css" href="http://www.mamicode.com/uri" ?>
- type:类型,内容是MIME类型 image/jpeg
- href:确定引用文件的位置。
- uri:统一资源标识符,1.html news/m.html
- url:统一资源定位符,http://www.fengjie.com/news/m.html
处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
1.8 xml乱码
* 文档内容编码:UTF-8
* 文件编码:window默认GBK
* 解决文件乱码的方法:将文档内容编码与文件编码统一。
XML语法规则总结:
- 所有 XML 元素都须有关闭标签
- XML 标签对大小写敏感
- XML 必须正确地嵌套顺序
- XML 文档必须有根元素
- XML 的属性值须加引号
- 特殊字符必须转义
- XML 中的空格会被保留
2、编码、字符集
UTF-8:万国码,(1-6字符)
GB2312:国标码(简体)
GBK:国标码(简体、繁体),GB2312升级版
GB18030:国标码(简体、繁体、少数名族),GBK升级版
BIG5:大5码(繁体)
ISO-8859-1:英文编码
3、约束
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
常用的约束技术有两种:XML DTD和XML schema
3.1 DTD约束
DTD(Document Type Definition),全称为文档类型定义。DTD约束既可以作为一个单独的文件编写,也可以在XML文件内编写。XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件。
(1)文档关联方式
- 内部关联格式:<!DOCTYPE 根元素 [语法]>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books [ <!ELEMENT books (book+)> <!ELEMENT book (name,author,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <books> <book> <name>Java</name> <author>LXH</author> <price>3212</price> </book> </books>
- 外部关联格式:<!DOCTYPE 根元素 SYSTEM "URI">
book.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT books (book+)> <!ELEMENT book (name,author,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)>
book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "book.dtd"> <books> <book> <name>Java</name> <author>LXH</author> <price>44</price> </book> </books>
- 公共关联格式:<!DOCTYPE 根元素 PUBLIC "文档名称" "文档URL">
新建一个Web Project,J2EE Specification Level选择“J2EE1.3”,如图所示。
在新建的Web Project下有一个WebRoot文件夹,下面有个WEB-INFO,里面还有个web.xml文件,打开web.xml,里面内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
里面的“http://java.sun.com/dtd/web-app_2_3.dtd”就是使用了公共关联,按住Ctrl点击,可关联到此文档。
(2)元素
格式:<!ELEMENT 元素名称 元素内容的类型>
符号:
? : 0或1
+ : >=1
* : >=0
(): 分组
| : 选择
,: 顺序
类型:
- #PCDATA,只能书写字符,不能包含子元素,注意: (#PCDATA)
- EMPTY,元素内容为空
- ANY,元素内容任意
例:book.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT books (book+)> <!ELEMENT book (name,author*,version?,(year|price))> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT version (#PCDATA)> <!ELEMENT year EMPTY> <!ELEMENT price EMPTY>
book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "book.dtd"> <books> <book> <name>Java</name> <author>LXH</author> <author>HLD</author> <version>v1.1</version> <price></price> </book> <book> <name>C++</name> <author>HLD</author> <year/> </book> </books>
(3)属性
格式:<!ATTLIST 元素名称 [属性名称 属性类型 约束 ...]>
属性类型及其含义:
约束的四种形式:
- #REQUIRED,必须填写
- #IMPLIED,可选
- #FIXED value,固定值
- defaultValue,默认值
例:book.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT books (book+)> <!ELEMENT book (name,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ATTLIST book id ID #REQUIRED title CDATA #IMPLIED lang CDATA #FIXED "固定值" category CDATA "默认值" pid IDREF #REQUIRED city (北京|上海|广州) #REQUIRED >
book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "book.dtd"> <books> <book id="B001" title="" pid="B001" city="上海"> <name>Java</name> <price></price> </book> <book id="B002" title="" category="类别" pid="B002" city="上海"> <name>Java</name> <price></price> </book> </books>
(4)实体
实体是变量,用于引用普通文本或特殊字符的快捷方式的变量。
实体分为内部实体和外部实体。
- 内部实体
内部实体分为引用实体和参数实体:
*引用实体:主要在 XML 文档中被应用。
- 格式:<!ENTITY 实体名称 "内容">
- 使用位置:在xml文档中使用
- 使用格式:&实体名称;
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!ENTITY bookname "java"> <!ELEMENT books (book+)> <!ELEMENT book (name,price)> <!ATTLIST book id ID #REQUIRED title CDATA #IMPLIED lang CDATA #FIXED "固定值" category CDATA "默认值" pid IDREF #REQUIRED city (北京|上海|广州) #REQUIRED > ]> <books> <book id="B002" title="" category="类别" pid="B002" city="上海"> <name>&bookname;</name> <price>40</price> </book> </books>
*参数实体:被 DTD 文件自身使用
- 格式:<!ENTITY % 实体名称 "内容">
- 使用位置:在DTD文档中使用
- 使用格式:%实体名称
<?xml version="1.0" encoding="UTF-8"?> <!ENTITY % fieldVal "name,age"> <!ELEMENT persons (person+,user+)> <!ELEMENT person (%fieldVal;,tel)> <!ELEMENT user (%fieldVal;,sal)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT tel (#PCDATA)> <!ELEMENT sal (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "book.dtd"> <persons> <person> <name>zhangsan</name> <age>32</age> <tel>1234</tel> </person> <user> <name>ls</name> <age>24</age> <sal>889</sal> </user> </persons>
*外部实体
- 格式:<!ENTITY 实体名称 SYSTEM "URI">
- 使用位置:在xml文档中使用
- 使用格式:&实体名称;
part.xml
<?xml version="1.0" encoding="UTF-8"?> <entity>测试外部实体</entity>
book.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ENTITY part SYSTEM "part.xml"> <!ELEMENT books (book+)> <!ELEMENT book ANY> <!--(#PCDATA)不能有子元素-->
book.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "book.dtd"> <books> <book>∂</book> </books>
<book>∂</book>相当于<book><entity>测试外部实体</entity></book>
3.2 schema约束
XML Schema 文件自身就是一个XML文件,扩展名为*.xsd。XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。 XML Schema规定XML文档实例的结构和每个元素/属性的数据类型。
- l 编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上
- l 在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上
- l 以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束
schema文档,根元素是schema,在http://www.w3.org/2001/XMLSchema定义
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books" xmlns:tns="http://www.example.org/books" elementFormDefault="qualified"> <xs:element name="books"></xs:element> </xs:schema>
books为根元素
【targetNamespace】为当前的schema文档命名,属性在自定义。但是,要求全球唯一,采用URL域名进行命名。
【xmlns】xml namespace ——>xml命名空间。引用已有的命名空间,官方为自己的schema文档起的名称。
【xmlns:tns】
格式1: xmlns:别名
使用:tns:schema,从当前别名tns所代表的schema文档中定义了schema元素
格式2: xmlns(默认命名空间引用)
好处:防止命名冲突
【elementFormDefault="qualified"】 指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
命名空间的使用在XML中主要有两个目的:
n 用于区分那些名称相同但来自不同schema库,具有不同含义的元素和属性。通过将元素、属性与URL相关联,命名空间能够区分具有相同名称的元素
n 在一个单一的XML应用中,将相关的元素和属性组合起来,使它们可以很容易地被软件包识别。
名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示,仅起到唯一标识的作用。
n 默认命名空间声明:不带前缀 ,默认命名空间只能有一个
- 格式:xmlns=“url”
- 例如:xmlns="http://www.w3.org/2001/XMLSchema"
n 显式命名空间声明:声明时指定前缀
- 格式:xmlns: quoteName =“url”
- 例如: xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。并且根元素schema节点必须来自http://www.w3.org/2001/XMLSchema 命名空间,官方建议使用使用前缀 xs ,及xmlns:xs。
Schema相对于DTD的明显好处是,XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法。
在文档关联中,如何确定文件的位置?
官方规定“http://www.w3.org/2001/XMLSchema-instance” 将当前的xml文档实例化
* schemaLocation属性(两个参数空格隔开)
* 第一参数:实例化所需要的schema文档的名称
* 第二参数:schema文档的URI
定义根元素element:<别名:element name=””>
调用schema(book.xml)
<?xml version="1.0" encoding="UTF-8"?> <books xmlns="http://www.example.org/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/books books.xsd" > </books>
XML Schema基础概念:
简易元素:仅包含文本的元素。它不会包含任何其他的元素或属性。
复合元素:包含其他元素及/或属性的 XML 元素
l 空元素
l 包含其他元素的元素
l 仅包含文本的元素
l 包含元素和文本的元素
Schema文档中出现的元素标记
元素类型 |
描述 |
schema |
声明一个已经声明的schema |
element |
声明一个元素 |
attribute |
声明一个属性 |
simpleType |
定义一个简单类型,它决定了元素和属性值的约束和相关信息 |
complexType |
定义一个复合类型,它决定了一组元素和属性值的约束和相关信息 |
group |
把一组元素声明组合在一起,以便它们能够一起被复合类型应用 |
attributeGroup |
把一组属性声明组合在一起,以便它们能够一起被复合类型应用 |
simpleContent |
应用于complexType,对它的内容进行约束和扩展等 |
choice |
允许唯一的一个元素从一组中被选择 |
list |
从一个特定数据类型的集合中选择定义一个简单类型元素 |
union |
从一个特定简单数据类型的集合中选择定义一个简单类型元素 |
unique |
定义一个属性或元素值,它必须在一个特定的范围内 |
sequence |
给一组元素一个特定的序列 |
restriction |
定义一个约束条件 |
例1:定义一个简单元素
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books" xmlns:tns="http://www.example.org/books" elementFormDefault="qualified"> <element name="books"> <complexType> <sequence> <!-- 1、定义元素 --> <element name="ele"></element> <!—所有的元素必须定义在跟元素下面(这里) --> </sequence> </complexType> </element> </schema>
对应的xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!—-对应的xml文档--> <books xmlns="http://www.example.org/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/books books.xsd" > <ele></ele> </books>
例2:定义元素包含子元素,子元素顺序出现
<element name="person"> <complexType> <sequence> <!-- 顺序 --> <element name="name"></element> <element name="age"></element> </sequence> </complexType> </element>
例3:定义含有子元素的元素--任选一个
<element name="user"> <complexType> <choice><!-- 选择 --> <element name="name"></element> <element name="age"></element> </choice> </complexType> </element>
例4:定义含有子元素的元素--子元素没顺序
<element name="worker"> <complexType> <all><!-- 无序的 --> <element name="name"></element> <element name="age"></element> </all> </complexType> </element>
例5.1:仅含有属性的空元素
<element name="img"> <complexType> <attribute name="src" type="string"/> </complexType> </element>
例5.2:仅含有属性的空元素,属性必须写
<element name="img"> <complexType> <!—【use】 optional:可选、required:必选、prohibited:禁用--> <attribute name="src" type="string" use="required"/> </complexType> </element>
例6:必须含有属性的非空元素
<!-- <price unit="¥">30</price> --> <element name="price"> <complexType> <!-- 类型为复合元素 --> <simpleContent><!-- 内容简单 --> <!--将简单的内容扩展成复杂的类型 【base】确定简单内容的类型 --> <extension base="integer"> <!-- 定义属性:【name】确定名称、【type】确定类型、【use】optional:可选、required:必选、prohibited:禁用--> <attribute name="unit" type="string" use="required"> </attribute> </extension> </simpleContent> </complexType> </element>
例7:必须含有属性也包含子元素的元素
<element name="book"> <complexType> <sequence> <element name="title" type="string"></element> </sequence> <attribute name="catagory" type="string"></attribute> </complexType> </element>
例8、元素内容必须是2-5之间的数
<element name="number"> <simpleType> <restriction base="int"><!-- 限制 --> <maxInclusive value="5"/> <minInclusive value="2"/> </restriction> </simpleType> </element>
例9:包含多个指定元素
<!--<students> <student></student> <student></student> </students> minOccurs:最小出现次数,默认为1 maxOccurs:最大出现次数,默认为1 ?——>minOccurs=0; maxOccurs =1 + ——>minOccurs=1; maxOccurs =unbounded * ——>minOccurs=0; maxOccurs =unbounded --> <element name="students"> <complexType> <sequence minOccurs="1" maxOccurs="unbounded"> <element name="student"></element> </sequence> </complexType> </element>
例10:将身份证号格式化
<element name="personId"> <simpleType> <restriction base="string"> <pattern value="\d{6}-\d{8}-\d{4}"></pattern> </restriction> </simpleType> </element>
属性相关定义
l attribute元素的use属性来定义是否是必须的属性
- required是必须值
- optional是可选值
- prohibited是无属性值
l 缺省值如何定义
- <attribute name="quantity" type="integer" default="1"/>
l 固定值如何定义
- <attribute name="name" fixed="张三"></attribute
Schema和DTD区别
XML从SGML (Standard Generalized Markup Language,标准通用标记语言)中继承了DTD,并用它来定义内容的模型,验证和组织元素。同时,它也有很多局限:
- DTD不遵守XML语法;
- DTD不可扩展;
- DTD不支持命名空间的应用;
- DTD没有提供强大的数据类型支持,只能表示很简单的数据类型。
Schema完全克服了这些弱点,使得基于Web的应用系统交换XML数据更为容易。下面是它所展现的一些新特性:
- Schema完全基于XML语法,不需要再学习特殊的语法;
- Schema能用处理XML文档的工具处理,而不需要特殊的工具;
- Schema大大扩充了数据类型,支持booleans、numbers、dates and times、URIs、integers、decimal numbers和real numbers等;
- Schema支持原型,也就是元素的继承。如:我们定义了一个“联系人”数据类型,然后可以根据它产生“朋友联系人”和“客户联系”两种数据类型;
- Schema支持属性组。我们一般声明一些公共属性,然后可以应用于所有的元素,属性组允许把元素、属性关系放于外部定义、组合;
- 开放性。原来的DTD只能有一个DTD应用于一个XML文档,现在可以有多个Schema运用于一个XML文档。
第1天 XML和DTD、schema约束