Day1 itheima_xml基础
1,主要内容
XML及其语法
XML约束之DTD
XML编程(CRUD---Create Read Update Delete)
?
xml 解析器
?
dom
?
sax
?
dom4j
?
pull
XML约束之Schema
2,什么是xml
XML是指可扩展标记语言(e
X
tensible
M
arkup
L
anguage),它是一种
标记语言
,很类似HTML。它被设计的
宗旨是表示数据
,而
非显示数据
。
XML标签
没有被预定义
,需要用户
自行定义标签
。
XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
XML被广泛认为是继Java之后在Internet上最激动人心的新技术。
3,xml技术用于解决什么问题?
在现实生活中大量存在有关系的数据,如图所示。
问题:
这样的数据如何交给计算机处理呢?
l
XML
语言出现的根本目标在于描述上图那种,在现实生活中经常出现的有关系的数据。
l
xm语言是一种通用的数据交换格式。
l
在
XML
语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。例如:
l
xml文件里的数据需要使用程序将其读出来.
<?xml version="1.0" encoding="UTF-8"?> <中国> <北京> <海淀></海淀> <丰台></丰台> </北京> <广东> <广州></广州> <东莞></东莞> </广东> <湖北> <武汉></武汉> <襄阳></襄阳> </湖北> </中国>
4,xml常见应用
l
在Java开发中,传统的配置文件是
*.properties
属性文件(key=value),而XML表示的数据更为丰富。
l
XML技术除用于描述有关系的数据外,还经常用作软件配置文件,以描述程序模块之间的关系。(
如后面将要学习到的Struts
2
、Spring和Hibernate都是基于XML作为配置文件的
)
在一个软件系统中,通过XML配置文件可以提高系统的
灵活性
。即程序的行为是
通过XML文件来配置的,而不是硬编码
5,XML语法
l
一个
XML
文件分为如下几部分内容:
?
文档声明
?
元素
?
属性
?
注释
?
CDATA
区 、特殊字符
?
处理指令(
processing instruction
)
(PI)
文档声明
l
在编写XML文档时,需要先使用文档声明来声明XML文档。且
必须出现在文档的第一行
。
l
最简单的语法:<?xml version=“1.0”?>
l
用
encoding
属性说明文档所使用的字符编码,
默认为UTF-8
。
保存在磁盘上的文件编码要与声明的编码一致。
如:<?xml version=“1.0” encoding=“GB2312”?>
l
用
standalone
属性说明文档是否独立,即是否依赖其他文档。
如:<?xml version=“1.0” standalone=“yes”?>
l
常见的错误 标点符号中式的.
元素
l
XML
元素指
XML
文件中出现的标签。一个标签分为起始和结束标签
(
不能省略
)
。一个标签有如下几种书写形式:
?
包含标签主体:
<mytag>some content</mytag>
?
不含标签主体:
<mytag/>
l
一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套。
?
<mytag1><mytag2></mytag1></mytag2>
WRONG
l
一个
XML
文档
必须有且仅有一个根标签
,其他标签都是这个根标签的子标签或孙标签。
l
对于
XML
标签中出现的所有空格和换行,
XML
解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。
第一段: <中国><北京/></中国> 第二段: 给人看的 <中国>rn t <北京/> </中国>
l
由于在
XML
中,空格和换行都作为原始内容被处理,所以,在编写
XML
文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。
(查看 JQuery)
命名规范
l
一个
XML
元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
l
区分大小写,例如,
<P>
和
<p>
是两个不同的标记。
l
不能以数字或
"_" (
下划线
)
开头。
l
不能以
xml(
或
XML
、或
Xml
等
)
开头。 xml保留的关键字
l
不能包含空格。
l
名称中间不能包含冒号(
:
)
(
有特殊用途
)
。
属性
l
一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:
<mytag name="value"/>
l
属性值一定要用双引号(
"
)或单引号(
'
)引起来
l
定义属性必须遵循与标签相同的命名规范
l
在
XML
技术中,标签属性所代表的信息,如果没有标签体,也可以被改成用子元素的形式来描述,例如:
<mytag> <name> <firstname></firstnamename> <secondname></secondname> </name> </mytag> 注释
l
Xml
文件中的注释采用:
<!--
这是注释
-->
l
注意:
?
XML
声明之前不能有注释
?
注释不能嵌套,例如:
<!--大段注释 …… <!--局部注释--> Wrong …… -->
6,CDATA
区
l
CDATA
是
C
haracter
D
ata
的缩写
l
作用:把标签当做普通文本内容;
l
语法:
<![CDATA[
内容
]]>
<![CDATA[ <itcast>www.itcast.cn</itcast> ]]> 以上红色部分被当做普通文本而不是标签 7,特殊字符
l
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。
8,处理指令
l
处理指令,简称
PI(
P
rocessing
I
nstruction)
。
l
作用:用来指挥软件如何解析
XML
文档。
l
语法:必须以“
<?”
作为开头,以“
?>”
作为结尾。
l
常用处理指令:
?
XML
声明:
<?xml version=“1.0” encoding=“GB2312”?>
xml-stylesheet指令
<?xml-stylesheet type=“text/css” href=“some.css”?> 注:对中文命名的标签元素不起作用 9,xml约束概述
l
什么是
XML
约束
?
在
XML
技术里,可以编写一个文档来约束一个
XML
文档的书写规范,这称之为
XML
约束。
l
约束技术
?
XML DTD
?
XDR
?
SOX
?
XML Schema
为什么需要约束?
l
XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(
如:Tomcat
)
l
xml常用来做配置文件,那么框架的使用者在用该框架的时候该怎么样写呢?
l
两个概念:
?
格式良好的XML:遵循XML语法的XML
?
有效的XML:遵循约束文档的XML
l
总之:约束文档定义了在XML中允许出现的
元素名称、属性及元素出现的
顺序等等。
10,xml约束之dtd
DTD(
Document Type Definition
)
,全称为文档类型定义
文件清单:book.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架>
DTD文件应使用UTF-8或Unicode 文件清单:book.dtd <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>
xml 内部编写DTD DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写。(单独的DTD文件要以UTF-8保存) 在XML 文档中编写DTD示例 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> ]> <书架> <书> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> ... </书架> 引入外部DTD文档
l
XML
使用
DOCTYPE
声明语句来指明它所遵循的
DTD
文档,有两种形式:
?
当引用的
DTD
文档在本地时,采用如下方式:
<!DOCTYPE 根元素 SYSTEM “DTD文档路径”> 如:<!DOCTYPE 书架 SYSTEM “book.dtd”>
?
当引用的
DTD
文档在公共网络上时,采用如下方式:
<!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”> 如:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 11,DTD约束语法细节
l
元素定义
l
属性定义
l
实体定义
元素定义1
l
在
DTD
文档中使用
ELEMENT
声明一个
XML
元素,语法格式如下所示:
<!ELEMENT 元素名称元素类型>
l
元素类型可以是元素内容、或类型
?
如为元素内容:则需要使用
()
括起来,如
<!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)>
?
如为元素类型,则直接书写,
DTD
规范定义了如下几种类型:
?
EMPTY
:用于定义空元素,例如
<
br
/> <hr/>
ANY:表示元素内容为任意类型 PCDATA
l
PCDATA
的意思是被解析的字符数据(
parsed character data
)。
l
可把字符数据想象为
XML
元素的开始标签与结束标签之间的文本。
l
PCDATA
是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
l
文本中的标签会被当作标记来处理,而实体会被展开。
l
不过,被解析的字符数据不应当包含任何
&
、
<
或者
>
字符;需要使用
&
、
&
lt
;
以及
&
gt
;
实体来分别替换它们。
CDATA
l
CDATA
的意思是字符数据(
character data
)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开 元素定义2
l
元素内容中可以使用如下方式,描述内容的组成关系
?
用逗号分隔,表示内容的出现顺序必须与声明时一致。
<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
?
用
|
分隔,表示任选其一,即多个只能出现一个
<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
l
在元素内容中也可以使用
+
、*、
?
等符号表示元素出现的次数:
+: 一次或多次 (书+) ?: 0次或一次 (书?) *: 0次或多次 (书*)
l
也可使用圆括号
( )
批量设置,例
<!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL)* | COMMENT)> attribute 属性定义
l
xml
文档中的标签属性需通过
ATTLIST
为其设置属性
l
语法格式:
<!ATTLIST 元素名 属性名1 属性值类型设置说明 属性名2 属性值类型设置说明 …… >
l
属性声明举例:
<!ATTLIST 商品 类别 CDATA #REQUIRED 颜色 CDATA #IMPLIED >
l
对应
XML
文件:
<商品类别="服装" 颜色="黄色">…</商品> <商品类别="服装">…</商品>
l
设置说明:
?
#REQUIRED
:必须设置该属性
?
#IMPLIED
:可以设置也可以不设置
?
#FIXED
:说明该属性的取值固定为一个值,在
XML
文件中不能为该属性设置其它值。但需要为该属性提供这个值
?
直接使用默认值:在
XML
中可以设置该值也可以不设置该属性值。若没设置则使用默认值。但需要为该属性提供这个值
l
举例:
<!ATTLIST页面作者 姓名 CDATA #IMPLIED 年龄 CDATA #IMPLIED 联系信息 CDATA #REQUIRED 网站职务 CDATA #FIXED "页面作者" 个人爱好 CDATA "上网" > 常用属性值类型
CDATA
:
表示属性值为普通文本字符串
。
ENUMERATED
ID
indentity
ENTITY(
实体
)
属性值类型àENUMERATED
属性的类型可以是一组取值的列表,在
XML
文件中设置的属性值只能是这个列表中的某个值
(
枚举
)
<?xml version = "1.0" encoding="GB2312" standalone="yes"?> <!DOCTYPE 购物篮 [ <!ELEMENT 肉 EMPTY> <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉"> ]> <购物篮> <肉 品种 ="鱼肉"/> <肉 品种 ="牛肉 "/> <肉/> </购物篮> 属性值类型 ID
表示属性的设置值为一个唯一值。
ID
属性的值只能由字母,下划线开始,不能出现空白字符
<?xml version = "1.0" encoding="GB2312" ?> <!DOCTYPE 联系人列表[ <!ELEMENT 联系人列表 ANY> <!ELEMENT 联系人 (姓名,EMAIL)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> <!ATTLIST 联系人 编号 ID #REQUIRED> ]> <联系人列表> <联系人 编号="a1"> <姓名>张三</姓名> <EMAIL>zhang@it315.org</EMAIL> </联系人> <联系人 编号="b1"> <姓名>李四</姓名> <EMAIL>li@it315.org</EMAIL> </联系人> </联系人列表> 实体定义
实体用于为一段内容创建一个别名,以后在
XML
文档中就可以使用别名引用这段内容了。
在
DTD
定义中,一条
<!ENTITY …>
语句用于定义一个实体。
实体可分为两种类型:引用实体和参数实体。
l
引用实体主要
在
XML
文档中被应用
语法格式:
?
<!ENTITY
实体名称 "实体内容"
>
:直接转变成实体内容
引用方式:
&实体名称;
举例:
<!ENTITY shit"oh,holy shit"> …… &shit; 参数实体
参数实体被
DTD
文件自身使用
语法格式:
<!ENTITY % 实体名称 "实体内容" >
引用方式:
%实体名称;
举例
1
:
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址"> <!ELEMENT 个人信息 (% TAG_NAMES; | 生日)> <!ELEMENT 客户信息 (% TAG_NAMES; | 公司名)>
<!ENTITY % common.attributes " id ID #IMPLIED account CDATA #REQUIRED " > ... <!ATTLIST purchaSEOrder %common.attributes;> <!ATTLIST item %common.attributes;>
java 解析xml概述
l
XML
解析方式分为两种:
DOM
方式和
SAX
方式
?
DOM
:
Document Object Model
,文档对象模型。这种方式是
W3C
推荐的处理
XML
的一种方式。
?
SAX
:
Simple API for XML
。这种方式不是官方标准,属于开源社区
XML-DEV
,几乎所有的
XML
解析器都支持它。
l
XML
解析开发包
?
JAXP
:
是
SUN
公司推出的解析标准实现。
?
Dom4J
:
是开源组织推出的解析开发包。
(
牛,大家都在用,包括
SUN
公司的一些技术的实现都在用
)
?
JDom
:是开源组织推出的解析开发包。
JAXP
JAXP:(Java API for XML Processing)
开发包是
JavaSE
的一部分,它由以下几个包及其子包组成:
?
org.w3c.dom:
提供
DOM
方式解析
XML
的标准接口
?
org.xml.sax:
提供
SAX
方式解析
XML
的标准接口
?
javax.xml:
提供了解析
XML
文档的类
l
javax.xml.parsers
包中,定义了几个工厂类。我们可以通过调用这些工厂类,得到对
XML
文档进行解析的
DOM
和
SAX
解析器对象。
?
DocumentBuilderFactory
?
SAXParserFactory
使用JAXP进行DOM解析 javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回
获得JAXP中的DOM解析器
调用
DocumentBuilderFactory.newInstance
()
方法得到创建
DOM
解析器的工厂。
调用工厂对象的
newDocumentBuilder
方法得到
DOM
解析器对象。
调用
DOM
解析器对象的
parse()
方法解析
XML
文档,得到代表整个文档的
Document
对象,进而可以利用
DOM
特性对整个
XML
文档进行操作了。
Dom编程
DOM
模型
(document object model)
?
DOM
解析器在解析
XML
文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个
Node
对象
(
节点
)
。
?
在
dom
中,节点之间关系如下:
?
位于一个节点之上的节点是该节点的父节点
(parent)
?
一个节点之下的节点是该节点的子节点(
children
)
?
同一层次,具有相同父节点的节点是兄弟节点(
sibling
)
?
一个节点的下一个层次的节点集合是节点后代
(descendant)
?
父、祖父节点及所有位于节点上面的,都是节点的祖先
(ancestor)
节点类型
Node对象
Node
对象提供了一系列常量来代表结点的类型,当开发人员获得某个
Node
类型后,就可以把
Node
节点转换成相应的节点对象
(Node
的子类对象
)
,以便于调用其特有的方法。(查看
API
文档)
Node
对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个
XML
文档的内容、或添加、修改、删除
XML
文档的内容了。
更新xml文档
l
javax.xml.transform
包中的
Transformer
类用于把代表
XML
文件的
Document
对象转换为某种格式后进行输出,例如把
xml
文件应用样式表后转成一个
html
文档。利用这个对象,当然也可以把
Document
对象又重新写入到一个
XML
文件中。
l
Transformer
类通过
transform
方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:
?
javax.xml.transform.dom.DOMSource
类来关联要转换的
document
对象,
?
用
javax.xml.transform.stream.StreamResult
对象来表示数据的目的地。
Transformer
对象通过
TransformerFactory
获得
SAX解析
在使用
DOM
解析
XML
文档时,需要读取整个
XML
文档,在内存中构架代表整个
DOM
树的
Doucment
对象,从而再对
XML
文档进行操作。此种情况下,如果
XML
文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
SAX
解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才对文档进行操作。
SAX
采用事件处理的方式解析
XML
文件,利用
SAX
解析
XML
文档,涉及两个部分:解析器和事件处理器:
?
解析器可以使用
JAXP
的
API
创建,创建出
SAX
解析器后,就可以指定解析器去解析某个
XML
文档。
?
解析器采用
SAX
方式在解析某个
XML
文档时,它只要解析到
XML
文档的一个
组成部分
,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的
xml
文件内容作为
方法的参数
传递给事件处理器。
事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到
sax
解析器解析到的数据,从而可以决定如何对数据进行处理
l
阅读
ContentHandler
API
文档,常用方法:
startElement
、
endElement
、
characters
SAX
方式解析
XML
文档
l
使用
SAXParserFactory
创建
SAX
解析工厂
SAXParserFactoryspf = SAXParserFactory.newInstance();
l
通过
SAX
解析工厂得到解析器对象
SAXParser sp = spf.newSAXParser();
l
通过解析器对象得到一个
XML
的读取器
XMLReaderxmlReader = sp.getXMLReader();
l
设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());
l
解析
xml
文件
xmlReader.parse("book.xml"); DOM4J解析XML文档
l
Dom4j
是一个简单、灵活的开放源代码的库。
Dom4j
是由早期开发
JDOM
的人分离出来而后独立开发的。与
JDOM
不同的是,
dom4j
使用接口和抽象基类,虽然
Dom4j
的
API
相对要复杂一些,但它提供了比
JDOM
更好的灵活性。
l
Dom4j
是一个非常优秀的
Java XML API
,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的
Dom4j
,例如
Hibernate
,包括
sun
公司自己的
JAXM
也用了
Dom4j
。
l
使用
Dom4j
开发,需下载
dom4j
相应的
jar
文件。
l
DOM4j
中,获得
Document
对象的方式有三种:
1.读取XML文件,获得document对象 SAXReader reader = new SAXReader(); 2.解析XML形式的文本,得到document对象. String text = "<members></members>"; 3.主动创建document对象. Document document = DocumentHelper.createDocument(); Element root = document.addElement("members"); 节点对象
l
1.
获取文档的根节点
.
Element root = document.getRootElement();
l
2.
取得某个节点的子节点
.
Element element=node.element(“书名");
l
3.
取得节点的文字
String text=node.getText();
l
4.
取得某节点下所有名为“
member”
的子节点,并进行遍历
.
List nodes = rootElm.elements ("member"); for ( Iterator it = nodes.iterator (); it.hasNext ();) { Element elm = (Element) it.next (); // do something }
l
5.
对某节点下的所有子节点进行遍历
.
for( Iterator it= root.elementIterator (); it.hasNext ();){ Element element = (Element) it.next (); // do something }
l
6.
在某节点下添加子节点
.
Element ageElm = newMemberElm.addElement ("age");
l
7.
设置节点文字
.
element.setText ("29");
l
8.
删除某节点
.
// childElm 是待删除的节点 , parentElm 是其父节点 parentElm.remove(childElm);
l
9.
添加一个
CDATA
节点
.
Element contentElm = infoElm.addElement ("content"); contentElm.addCDATA ( diary.getContent ()); 节点对象属性
l
1.
取得某节点下的某属性
Element root= document.getRootElement (); // 属性名 name Attribute attribute=root.attribute("size");
l
2.
取得属性的文字
String text= attribute.getText ();
l
3.
删除某属性
Attribute attribute = root.attribute ("size"); root.remove (attribute); 节点对象属性
l
3.
遍历某节点的所有属性
Element root= document.getRootElement (); for( Iterator it= root.attributeIterator (); it.hasNext ();){ Attribute attribute = (Attribute) it.next (); String text= attribute.getText (); System.out.println (text); }
l
4.
设置某节点的属性和文字
.
newMemberElm.addAttribute ("name"," sitinspring ");
l
5.
设置属性的文字
Attribute attribute = root.attribute ("name"); attribute.setText (" sitinspring "); 将文档写入XML文件
l
1.
文档中全为英文
,
不设置编码
,
直接写入的形式
.
XMLWriter writer = new XMLWriter (new FileWriter ("output.xml")); writer.write (document); writer.close ();
l
2.
文档中含有中文
,
设置编码格式写入的形式
.
OutputFormat format = OutputFormat.createPrettyPrint (); // 指定 XML 编码 format.setEncoding("GBK"); 字符串与xml的转换
l
1.
将字符串转化为
XML
String text = "<members> <member>sitinspring</member></members>";
l
2.
将文档或节点的
XML
转化为字符串
.
SAXReader reader = new SAXReader();
String rootXmlText=root.asXML(); pull解析器
l
pull 解析器是一个第三方的开源api,其解析原理与sax 解析原理很相像,都是采用事件驱动的方式.
l
不同点: pull 解析器在每次读取到一段数据之后,需要程序员手动的调用其next() 方法,将当前解析到的这一行的"指针"移到下一行.
l
http://www.xmlpull.org &
l
http://kxml.sourceforge.net/kxml2/
l
在目前的android 平台中解析xml 文件都是采用pull解析器,是谷歌力推的xml解析器
l
pull 解析器是一个开源的
java
项目,既可以用于
android
,也可以用于
JavaEE
。
l
在android源码根目录的libcore目录下存放的是pull 解析器相关的所有类库.
XML约束之Schema
l
XML Schema
也是一种用于定义和描述
XML
文档结构与内容的模式语言,其出现是为了克服
DTD
的局限性
l
XML Schema VS DTD
?
XML Schema
符合
XML
语法结构。
?
DOM
、
SAX
等
XML API
很容易解析出
XML Schema
文档中的内容。
?
XML Schema
对
名称空间
支持得非常好。
?
XML Schema
比
XML DTD
支持更多的数据类型,并支持用户自定义新的数据类型。
?
XML Schema
定义约束的能力非常强大,可以对
XML
实例文档作出细致的语义限制。
?
XML Schema
不能像
DTD
一样定义实体,比
DTD
更复杂,但
Xml Schema
现在已是
w3c
组织的标准,它正逐步取代
DTD
。
Schema约束快速入门
l
XML Schema
文件自身就是一个
XML
文件,但它的扩展名通常为
.
xsd
。
l
一个
XML Schema
文档通常称之为
模式文档
(
约束文档
)
,遵循这个文档书写的
xml
文件称之为
实例文档
。
l
和
XML
文件一样,一个
XML Schema
文档也必须有一个根结点,但这个根结点的名称为
Schema
。
l
编写了一个
XML Schema
约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在
XML Schema
技术中有一个专业术语来描述这个过程,即把
XML Schema
文档声明的元素绑定到一个
名称空间
上,以后
XML
文件就可以通过这个
URI
(即名称空间)来告诉解析引擎,
xml
文档中编写的元素来自哪里,被谁约束。
<?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn" elementFormDefault="qualified"> <xs:element name='书架' > <xs:complexType> <xs:sequence maxOccurs='unbounded' > <xs:element name='书' > <xs:complexType> <xs:sequence> <xs:element name='书名' type='xs:string' /> <xs:element name='作者' type='xs:string' /> <xs:element name='售价' type='xs:string' /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> <?xml version="1.0" encoding="UTF-8"?> <itcast:书架 xmlns:itcast="http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://www.itcast.cn book.xsd"> <itcast:书> <itcast:书名>JavaScript网页开发</itcast:书名> <itcast:作者>张孝祥</itcast:作者> <itcast:售价>28.00元</itcast:售价> </itcast:书> </itcast:书架>名称空间的概念
l
在
XML Schema
中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的
URI
(
Uniform Resource Identifier
,统一资源标识符)表示。在
Xml
文件中书写标签时,可以通过名称空间声明(
xmlns
),来声明当前编写的标签来自哪个
Schema
约束文档。如:
<itcast:书架 xmlns:itcast=“http://www.itcast.cn”> <itcast:书>……</itcast:书> </itcast:书架> 此处使用itcast来指向声明的名称,以便于后面对名称空间的引用。
l
注意:名称空间的名字语法容易让人混淆,尽管以
http://
开始,那个
URL
并不指向一个包含模式定义的文件。事实上,这个
URL
:
http://www.itcast.cn
根本没有指向任何文件,只是一个分配的名字。
使用名称空间引入Schema
l
为了在一个
XML
文档中声明它所遵循的
Schema
文件的具体位置,通常需要在
Xml
文档中的根结点中使用
schemaLocation
属性来指定,例如:
<itcast:书架 xmlns:itcast="http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://www.itcast.cn book.xsd">
l
schemaLocation
此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的
XML schema
的位置,
两者之间用空格分隔
。
l
注意,在使用
schemaLocation
属性时,也需要指定该属性来自哪里。
使用默认名称空间
基本格式: xmlns="URI" 举例: <书架 xmlns="http://www.it315.org/xmlbook/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://www.itcast.cn book.xsd"> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> <书架>
文件清单:xmlbook.xml <?xml version="1.0" encoding="UTF-8"?> <书架 xmlns="http://www.it315.org/xmlbook/schema" xmlns:demo="http://www.it315.org/demo/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xmlbook.xsd http://www.it315.org/demo/schema http://www.it315.org/demo.xsd"> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价 demo:币种=”人民币”>28.00元</售价> </书> </书架>
文件清单:xmlbook.xml <?xml version="1.0" encoding="UTF-8"?> <书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xmlbook.xsd"> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架> 在XML Schema文档中声明名称空间 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www. itcast.cn" elementFormDefault="qualified"> <xs:schema>
l
targetNamespace
元素用于指定
schema
文档中声明的元素属于哪个名称空间。
elementFormDefault元素用于指定,该schema文档中声明的根元素及其所有子元素都属于targetNamespace所指定的名称空间 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |