lec2-xml
转达信息 报告添加内容
1. XML概述
1.1. XML 定义
Extensible Markup Language:A set of rules for encoding documents electronically W3C于1998年推出的一种用于数据描述的元标记语言的国际标准
1.2. XML标准系列
核心
XML Information Set Document Type Declaration XML Schema Namespace 展现与转换
CSS XSL:eXtensible Stylesheet Language 定位、链接与查询
Xpath:XML Path Language Xpointer:XML Pointer Language Xlink:XML Linking Language Xquery:XML Query Language
1.3. XML版本
1.0版-Extensible Markup Language (XML) 1.0
第一版:1998.2.10. W3C推荐标准 第二版:2000.10.6. W3C推荐标准(加删少量DTD生成式,修改错误,改进描述) 第三版:2004.2.4. W3C推荐标准(修改错误,改进描述) 第四版:2006.8.16. W3C推荐标准(修改错误,改进描述) 第五版:2008.11.26. W3C推荐标准(修改错误,放宽了对元素和属性命名字符的限制,~XML 1.1) 1.1版–Extensible Markup Language (XML) 1.1(元素和属性名称所采用扩展字符集)
第一版:2004.2.4. W3C推荐标准 第二版:2006.8.16.(修改错误,改进描述)
置标语言家谱表 Web体系结构的发展
1.4. HTML和XHTML
1.4.1. 标准的xml:使用标准的XML标签
< UL>
< LI> 张三</ LI>
< UL>
< LI> 用户ID:001</ LI>
< LI> 公司:A公司</ LI>
< LI> EMAIL:zhang@aaa.com</ LI>
< LI> 电话:(010)62345678</ LI>
< LI> 地址:五街1234号</ LI>
< U> 城市:北京市</ LI>
< LI> 省份:北京</ LI>
</ UL>
< LI> 李四</ LI>
< UL>
< LI> 用户ID:002</ LI>
< LI> 公司:B公司</ LI>
< LI> EMAIL:li@bbb.org</ LI>
< LI> 电话:(021)87654321</ LI>
< LI> 地址:南京路9876号</ LI>
< LI> 城市:上海市</ LI>
< LI> 省份:上海< LI>
</ UL>
</ UL>
1.4.2. 具有语义的xml:使用自定义的标签
< 联系人列表>
< 联系人>
< 姓名> 张三</ 姓名>
< ID> 001</ ID>
< 公司> A公司</ 公司>
< EMAIL> zhang@aaa.com</ EMAIL>
< 电话> (010)62345678</ 电话>
< 地址>
< 街道> 五街1234号</ 街道>
< 城市> 北京市</ 城市>
< 省份> 北京</ 省份>
</ 地址>
</ 联系人>
< 联系人>
< 姓名> 李四</ 姓名>
< ID> 002</ ID>
< 公司> B公司</ 公司>
< EMAII> 1i@bbb.org</ EMAII>
< 电话> (021)87654321< 电话>
< 地址>
< 街道> 南京路9876号</ 街道>
< 城市> 上海市</ 城市>
< 省份> 上海</ 省份>
</ 地址>
</ 联系人>
</ 联系人列表>
1.5. XML和HTML比较
1.6. XML的特点
自描述性 内容独立性 可扩展和复用性 便于网络传输
Java = Portable Programs XML = Portable Data
1.7. XML最重要的五个应用
数据交换 :XML使用元素和属性来描述数据。在数据传送过程中,XML始终保留了诸如父/子关系这样的数据结构Web服务 :SOAP可以在用不同编程语言构造的对象之间传递消息内容管理 :XML只用元素和属性来描述数据,而不提供数据的显示方法。XSLT等能够轻易地将XML文件转换成各种格式文件,比如HTML,WML,PDF,flat file,EDI等Web集成 :在个人电子助理和浏览器之间用XML来传递数据配置 :将配置数据标记为XML格式,能使其更具可读性,并能方便地集成到应用系统中去;.NET中的XmlDocument和XmlTextReader
1.8. XML设计目标
在互联网上直接使用 支持各种各样的应用程序 与SGML兼容 应用程序应该容易编写 可选特性的数量应该减到最小,最好减至没有 良好的可读性,并且比较清晰 用XML设计新的标记语言方便快捷 XML设计的标记语言正式、简洁 XML文件容易创建 XML标记的简洁性无关紧要
1.9. 开发XML应用的步骤
考察应用场景,确定是否使用XML 设计系统架构和工作流程 设计XML文档中使用的标签(语汇集) 根据语汇集开发处理XML文档的应用程序 特定场景下(如网站发布)还需要编写XSLT文档以转换XML文档生成目标数据
1.10. XML的缺点
结构不够紧凑:传统的二进制文档 性能较低
额外的文档分析过程 更多的存储空间 读写XML文档需要执行更多的输入输出操作 缺少索引机制,大量数据读取和更新的效率比数据库操作低很多
1.11. XML应用实例
为置标语言FCLML公司的客户列表置表语言制定的,文档类型定义DTD,其程序为fclml.dtd 客户联系信息的XML文档Client.xml 为client.xml制定一个样式Mystyle.xsl Html格式及显示
1.11.1. Fclml.dtd
<? xml version="1.0" encoding="GB2312"? >
< !ELEMENT 联系人列表(联系人)* >
< !ELEMENT 联系人(姓名,ID,公司,EMAIL,电话,地址) >
< !ELEMENT 地址(街道,城市,省份) >
< !ELEMENT 姓名(#PCDATA) >
< !ELEMENT ID(#PCDATA) >
< !ELEMENT 公司(#PCDATA) >
< !ELEMENT EMAIL(#PCDATA) >
< !ELEMENT 电话(#PCDATA) >
< !ELEMENT 街道(#PCDATA) >
< !ELEMENT 城市(#PCDATA) >
< !ELEMENT 省份(#PCDATA) >
1.11.2. Client.xml
<? xml version="1.0"encoding="GB2312" standalone="no"?>
<!DOCTYPE 联系人列表 SYSTEM" fclml.dtd">
<?xml-stylesheettype="text/xsl" href="mystyle.xsl"?>
< 联系人列表>
< 联系人>
< 姓名> 张三</ 姓名>
< ID> 001</ ID>
< 公司> A公司</ 公司>
< EMAIL> zhang@aaa.com</ EMAIL>
< 电话> (010)62345678</ 电话>
< 地址>
< 街道> 五街1234号</ 街道>
< 城市> 北京市</ 城市>
< 省份> 北京</ 省份>
</ 地址>
</ 联系人>
< 联系人>
< 姓名> 李四</ 姓名>
< ID> 002</ ID>
< 公司> B公司</ 公司>
< EMAII> 1i@bbb.org</ EMAII>
< 电话> (021)87654321< 电话>
< 地址>
< 街道> 南京路9876号</ 街道>
< 城市> 上海市</ 城市>
< 省份> 上海</ 省份>
</ 地址>
</ 联系人>
</ 联系人列表>
1.11.3. MyStyle.xsl
<?xml version="1.0"encoding="GB2312"?>
<xsl:stylesheetxmlns:xsl="http://www.w3.org/TR/WD-xsl"
xmlHs="http://www.w3.org/TR/REC-html40" result-ns:="">
< xst: template> < xsl: apply-templates/> </ xsl: template>
< xsl: template match = " /" >
< HTML>
< HEAD>
< TITLE> F公司的客户联系信息</ TITlE>
</ HEAD>
< BODY>
< xsl: apply-templates select = " 联系人列表" />
</ BODY>
</ HTML>
</ xsl: template>
1.11.4. Html格式
< xsl: stemplat match = " 联系人列表" >
< xsl: for-each select = " 联系人" >
< UL>
< LI> < xsl: value-of select = " 姓名" /> < LI>
< UL>
< LI> 用户ID:< xsl: value-of select = " ID" /> </ LI>
< LI> 公司:< xsl: value-of select = " 公司" /> </ LI>
< LI> EMAIL:< xsl: value-of select = " EMAIL" /> </ LI>
< LI> 电话:< xsl: value-of select = " 电话" /> </ LI>
< LI> 街道:< xsl: value-of select = " 地址/街道" /> </ LI>
< LI> 城市:< xsl: value-of select = " 地址/城市" /> </ LI>
< LI> 省份:< xsl: value-of select = " 地址/省份" /> </ LI>
</ UL>
</ UL>
</ xsl: for-each>
</ xsl: template>
</ xsl: stylesheet>
1.11.5. XML格式
< HTML>
< HEAD>
< TITLE> F公司的客户联系信息</ TITLE>
</ HEAD>
< BODY>
< UL>
< LI> 张三</ LI>
< UI>
< LI> 用户ID:001</ LI>
< LI> 公司:A公司</ LI>
< LI> EMAIL:zhang@aaa.com</ LI>
< LI> 电话:(010)62345678</ LI>
< LI> 地址:五街1234号</ LI>
< LI> 城市:北京市</ LI>
< LI> 省份:北京</ LI>
</ UL>
< LI> 李四</ LI>
< UL>
< LI> ID:002</ LI>
< LI> 公司:B公司</ LI>
< LI> EMAIL:1i@bbb.or8</ LI>
< LI> 电话:(021)87654321</ LI>
< LI> 地址:南京路9876号</ LI>
< LI> 城市:上海市</ LI>
< LI> 省份:上海</ LI>
</ UL>
</ UL>
</ BODY>
</ HTML>
1.11.6. 显示
2. XML语法
<?xmlversion="1.0"encoding="GB2312"standalone="no"?>
<?xml—stylesheettype="text/xsl"href="mystyle.xsl"?>
< 专有名词列表>
< 专有名词>
< 名词> XML</ 名词>
< 解释> XMI是一种可扩展的元置标语言,它可用以规定新的置标规则,并根据这个规则组织数据</ 解释>
< 示例>
< !-一个XML的例子->
<![CDATA[
<联系人>
<姓名>张三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</联系人>
]]>
</ 示例>
</ 专有名词>
</ 专有名词列表>
2.1. XMl文档的基本构成
XMl声明 处理指令(可选) XML元素
[1]是XML声明 [2]是处理指令 [3]一[17]是文档中的各个元素 [8]是注释 [9]~[14]是CDATA节 在[5]行的<名词>XML</名词>
中,<名词>``</名词>
是标记,"XML"是字符数据
2.2. XML整体逻辑结构总结
XML文档通常以一个XML声明开始 通过XML元素来组织XML数据 XML元素包括标记和字符数据 为组织数据更方便、清晰,在字符数据中引入CDATA数据块 在文档中引入注释 需要给XML处理程序提供一些指示信息,XML文档中可以包含处理指令
2.3. XML语法概述
元素规则 必须有结束标记 属性取值要加引号 实体引用 注释的语法 空格会被保留
2.3.1. 元素规则
名字中不能包含空格 名字不能以数字或标点符号 开头 名字不能以任何大小写的xml开头 左尖括号(<)后不可以有空格 起始和结束标签的大小写 必须一致XML文件中出现的第一个元素是根元素 根元素必须有完整的起始和结束标签 所有的子元素必须嵌套在一个根元素 中
< Root>
< ChildA>
< ChildB>
content
</ ChildB>
</ ChildA>
</ Root>
嵌套元素不可以相互重叠 子元素如果内容为空,可以缩写标签:<ElementName />
2.3.1.1. 根元素
XML 文档必须包含在一个单一元素 中。
<?xml version="1.0"?>
< greeting>
Hello, World!
</ greeting>
不包含单一根元素的文档都会被XML 解析器拒绝
2.3.1.2. 必需有结束标记
不能省去任何结束标记 如果一个元素根本不包含标记,则称为空元素;HTML 换行(<br>
)和图像(<img>
)元素就是两个例子。在XML文档的空元素中,可以把结束斜杠放在开始标记中。下面的两个换行元素和两个图像元素对于XML 解析器来说是一回事:
< img src = " ../img/c.gif" > </ img>
< img src = " ../img/c.gif" />
2.3.1.3. 属性
名称不够用 命名规则和元素的命名规则类似 属性必须有值 属性值必须用单引号或双引号括起,且要始终保持一致
2.3.1.4. 实体引用
一些字符拥有特殊的意义
< message> if salary < 1000 then</ message>
< message> if salary < 1000 then</ message>
5个预定义的实体引用
<
< 小于>
> 大于&
& 和号&apos
’ 单引号"
" 引号
2.3.1.5. CDATA字节
元素内容的字符数据中不能插入左尖括号"<“或连字符”&" 数据难以阅读 <![CDATA[…]]>
不包含字符串"]]>"即可
2.3.1.6. 注释
空格会被保留
HTML 会把多个连续的空格字符裁减为一个 在XML 中,文档中的空格不会被删节 双连字符--
不能在注释中出现 注释不能以--->
终止
2.3.2. 良好格式(Well-formed)
XML文件的第一行必须是声明该文件是XML文件以及它所使用的XML规范版本 在XML文件中有且只能够有一个根元素 在XML文件中的标记必须正确地关闭 标记之间不得交叉 属性值必须要用引号括起来 控制标记、指令和属性名称等英文要区分大小写
2.3.3. XML名称空间
不同领域的XML语汇的识别问题 类似属性的形式声明
xmlns: URI xmlns:xx(前缀) = 某URI URI代表名称空间所属的领域 名称空间的作用范围:名称空间的作用范围就是该元素以及该元素所包含的元素和属性
3. DTD与Scheme
3.1. DTD(Document Type Definition)
一套关于标记符的语法规则,XML1.0版标准中XML文件的验证机制,属于XML文件组成的一部分 一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确 想使用XML进行数据交换的行业或组织可定义自己的DTD DTD文件是ASCII文本文件,后缀名为.dtd
3.1.1. 内部DTD示例
<?xml version="1.0"encoding="GB2312",standalone="yes">
<!DOCTYPE联系人列表[
<!ELEMENT 联系人列表(联系人)*>
< !ELEMENT 联系人(姓名,ID,公司,EMAIL,电话) >
< !ELEMENT 姓名(#PCDATA) >
< !ELEMENT ID(#PCDATA) >
< !ELEMENT 公司(#PCDATA) >
< !ELEMENT EMAIL(#PCDATA) >
< !ELEMENT 电话(#PCDATA) >
]>
< 联系人列表>
< 联系人>
< 姓名> 张三</ 姓名>
< ID> 001</ ID>
< 公司> A公司</ 公司>
< EMAIL> zhang@aaa.com</ EMAIL>
< 电话> (010)62345678</ 电话>
</ 联系人>
</ 联系人列表>
3.1.2. 外部DTD
<? xml version="1.0" encoding="GB2312"? >
< !ELEMENT 联系人列表(联系人)* >
< !ELEMENT 联系人(姓名,ID,公司,EMAIL,电话,地址) >
< !ELEMENT 地址(街道,城市,省份) >
< !ELEMENT 姓名(#PCDATA) >
< !ELEMENT ID(#PCDATA) >
< !ELEMENT 公司(#PCDATA) >
< !ELEMENT EMAIL(#PCDATA) >
< !ELEMENT 电话(#PCDATA) >
< !ELEMENT 街道(#PCDATA) >
< !ELEMENT 城市(#PCDATA) >
< !ELEMENT 省份(#PCDATA) >
3.1.3. 元素声明
<!ELEMENT 元素名称元素的内容格式的定义>
基本元素声明:<!ELEMENT 姓名(#PCDATA)>
复合元素声明:<!ELEMENT 联系人(姓名,ID,公司,EMAIL,电话)>
3.1.4. 元素出现次数的控制
3.1.5. 元素属性声明
< !ATTLIST 元素名 属性名 属性 类型 #REQUIRED >
< !ATTLIST 页面作者 姓名 CDATA #REQUIRED
#IMPLIED, #FIXED "缺省值" >
元素名是属性所属的元素的名字 属性名是属性的名字 缺省值是属性的初值 属性类型用来指定其属于哪种有效属性
3.1.6. XML属性类型
3.1.7. DTD的特点
DTD的优势在于每一个XML文档都可携带一个DTD,用来对该文档格式进行描述 多个XML文档就都可以共享使用该DTD,使得数据交换更为有效。可以用某个DTD来检测接收到的数据是否符合某个标准 DTD比Schema更加精炼,文档篇幅相同的情况下能表示更多内容 DTD的局限性
DTD不遵守XML语法 DTD数据类型有限 DTD不可扩展 DTD不支持命名空间
3.2. Schema
2001年5月2日成为W3C标准 XML文档结构和内容约束的机制 获得W3C推荐标准的第一个独立的XML模式语言 XML的一种应用,将XML DTD重新按照XML语言规范来定义,充分体现了XML自描述性的特点
1.<?xml version="1.0" encording="GB2312"?>
2.
3. < 学生花名册 年级 = " 六年级" 班级 = " 一班" >
4. < 学生>
5. < 姓名> 李华</ 姓名>
6. < 籍贯> 河北</ 籍贯>
7. < 年龄> 14</ 年龄>
8. < 电话> 62875555 </ 电话>
9. </ 学生>
10. < 学生>
11. < 姓名> 王珊</ 姓名>
12. < 籍贯> 北京</ 籍贯>
13. < 年龄> 12</ 年龄>
14. < 电话> 82618888</ 电话>
15. </ 学生>
16. </ 学生花名册>
<!DOCTYPE 学生花名册[
<!ELEMENT 学生花名册(学生*)>
< !ATTLIST 学生花名册 年级CDATA # REQUIRED
班级CDATA # IMPLIED >
< !ELEMENT 学生(姓名+,籍贯,年龄,电话?) >
< !ELEMENT 姓名(# PCDATA) >
< !ELEMENT 籍贯(# PCDATA) >
< !ELEMENT 年龄(# PCDATA) >
< !ELEMENT 电话(# PCDATA) >
]>
上述第2行可用下面语句替换:<!DOCTYPE 学生花名册SYSTEM "roster.dtd">
XML文档的结构:
用XML Schema 来描述:rosterschema.xml
1. <?xml version="1.0" encording="GB2312"?>
2. < Schema
xmlns = " urn:schemas-microsoft-com:xml-data" xmlns: dt= " urn:schemas-microsoft-com:datatypes" >
3. <AttributeTypename="年级"/>
4. <AttributeTypename="班级"/>
5. <ElementTypename="姓名"/>
6. <ElementTypename="籍贯"/>
7. <ElementTypename="年龄"/>
8. <ElementTypename="电话"dt:type="fixed.14.4"/>
9. <ElementTypename="学生" content="eltOnly">
10. <elementTypename="姓名"/>
11. <elementTypename="籍贯"/>
12. <elementTypename="年龄"/>
13. <elementTypename="电话"/>
14. < ElementType>
15. <ElementTypename="学生花名册" content="eltOnly">
16. <elementType="学生"/>
17. < attribute type = " 年级" />
18. < attribute type = " 班级" />
19. </ ElementType>
20. </ Schema>
为了给roster.xml指定文档定义规则,roster.xml第2行可用下面语句替换:<学生花名册xmlns="x-schema:rosterschema.xml">
rosterschema.xml分析
第1行是XML类型声明语句,指明该文档是一个XML文档,并且符合版本1.0规范;该文档采用GB2312编码 第2行是Schema声明语句,它包含了Schema命名空间的声明 本例中用到了两个命名空间
xmlns="urn:schemas-microsoft-com:xml-data"
,指定本文档是一个XMLSchema文档xmlns:dt="urn:schemas-microsoft-com:datatypes">
,定义了本文档中可以使用的数据类型 第3、4行是属性定义语句,它定义了两个属性:年级和班级 第5-8行是元素定义语句,它定义了4个元素 第9-14行定义了本XML Schema的二级元素:学生,指明该元素含有包含四个子元素:姓名、年龄、籍贯、电话 第15-19行定义了本XML Schema的顶级元素:学生花名册,指明该元素包含一个子元素:学生,以及两个属性:年级、班级 第20行是结束标记语句,它指明该XML Schema 的描述到此为止
3.2.1. Schema的优点
XML Schema支持数据类型 XML Schema使用XML语法 XML Schema安全数据通讯 XML Schema是可扩展的
3.2.1.1. XML Schema支持数据类型
更易于描述允许使用的文档内容 更易于检验数据的有效性 更易于与数据库中的数据一起协同工作 更易于定义关于数据的限制 更易于定义数据格式 更易于将数据在不同的数据类型之间进行转换
3.2.1.2. XML Schema使用XML语法
可以不需要再学习一种全新的语言 可以使用XML编辑器来编辑Schema文件 可以使用XML解析器解析Schema文件 可以使用XML DOM 处理Schema 可以使用XSLT转换Schema
3.2.1.3. XML Schema安全数据通讯
当数据由发送者传递给接受者,数据内容理解的一致性。基于XML Schema,发送者可以用接受者能够理解的方式描述数据 日期"03-11-2004"的理解
< date type = " date" >
2004-03-11
</ date>
3.2.1.4. XML Schema是可扩展的
因为XML Schema文件是由XML编写,所以可扩展 在其它的Schema文件中再次再次使用你的Schema 从标准的数据类型中派生出你自己的数据类型 在同一个文档中参考多种Schema
3.2.2. Schema 声明
XML Schema的根元素为schema 元素:位于XML Schema的名字空间xs(XML Schema)或xsd(XML Schema definition)中 Schema元素含有多个属性
名字空间声明(必须) 其他在本文档中要用到的名字空间的声明(可选) 该文档描述的目标名字空间(可选) 语言(可选)等 常用格式为:
<xsd:schema xmlns:xsd= "http://www.w3.org/2001/XMLSchema"
xmlns[:名字空间名] = "URI"
targetNamespace= "URI"
xml:language= "语种">
若干子元素
</ xsd: schema>
3.2.3. 元素的声明
<elementType name="元素名"
content ="{empty|textonly|eltonly|mixed}"
dt:type= "类型参数"
order = "{one|seq|many}"
model = "{open|close}"
minOccurs="最少出现次数"
maxOccurs="最大出现次数">
</ elementType>
最简单的声明:<elementType name="A" content= "empty"/>
3.2.4. 属性声明
<AttributeType
name = "属性名"
dt:type= "属性类型"
dt:value= "枚举值列表"
default = "默认值"
required = "{yes|no}" />
例子
<Xsd: element name = "DNASample">
< xsd: complexType >
< xsd: sequence >
<xsd: element name = "sample" type = "dnaType" minOccurs= "2" maxOccurs= "5" />
</ xsd: sequence >
</ xsd: complexType >
</ Xsd: element >
不合法
< DNASample>
< sample> GATCTATC</ sample>
</ DNASample>
3.2.5. 类型定义
内置数据类型:数字、串、时间等预定义的基本数据类型,用于叶元素内容和属性值,还可用作简单类型的基 简单类型:对内置数据类型的约束、列表和联合,自定义数据的结构和范围,也用于叶元素内容和属性值 复杂类型:定义元素的子元素和属性,确定文档的逻辑结构,只能用于根元素和中间元素
3.2.5.1. Scheme XML 的两种类型
简单类型:
没有属性和子元素用来定义其他类型 包含40种以上的预定义的简单类型 复杂类型:
可以存在多个属性 可以用在其他复杂类型的定义中 不能用来定义简单类型 可以有子元素 内置基本类型
数字:decimal(十进制数)、float(浮点数)、double(双精度数)、hexBinary(十六进制数)、base64Binary(基64数) 时间:duration(期间)、dateTime(日期与时间)、time(时间)、date(日期)、gYearMonth(年月)、gYear(年)、gMonth(月)、gMonthDay(月日)、gDay(日) 其他:string(串)、boolean(布尔)、anyURI(任意统一资源标识符)、QName(限定名qualified name)、NOTATION(符号)
3.2.6. 有效性验证
解析器构造XML文档,判断文档是否格式良好 验证文档信息项(例如一个元素)
根据元素的名域URI ,获取Schema 将文档信息项关连到相应Schema Component(如元素声明) 判断Schema Component是否有效 判断Information Item是否符合Schema Component 重复第二步,直到验证完整个文档
[01] <?xml version="1.0"?>
[02] < students xmlns: stud= " http://cscw.buaa.edu.cn/Schema-Stud"
class = " SY9061" >
[03] < student SId = " 12345" >
[04] < name> Lin</ name>
[05] < age> 20</ age>
[06] </ student>
[07] < student sId = " 345657" >
[08] < name> Li</ name>
[09] </ student>
[10] </ students>
[01]< xsd: schema xmlns: xsd= http://www.w3.org/2000/08/XMLSchema
[02] targetNamespace = " http://cscw.buaa.edu.cn/Schema-Stud" >
[08] <xsd:elementname="students" type="StudentsType"/>
[09] <xsd:complexTypename="StudentsType">
[10] < xsd: sequence>
[11] <xsd:elementname="student" type="StudentType" maxOccus="unbounded"/>
[12] </ xsd: sequence>
[13] <xsd:attributename="class" type="xsd:NMTOKEN"/>
[14] </ xsd: complexType>
[15] <xsd:complexTypename="StudentType">
[16] < xsd: sequence>
[17] <xsd:elementname="name" type="xsd:string"/>
[18] <xsd:elementname="age" type="xsd:int" minOccus="0"/>
[19] </ xsd: sequence>
[20] <xsd:attributename="sId" type="xsd:NMTOKEN"/>
[21] </ xsd: complexType>
[22]</ xsd: schema>
4. XSL,XSLT 和 XPath
4.1. XSL
eXtensibleStylesheetLanguage,即可扩展样式表语言,w3c 推荐的一种标准,用以定义XML 文档的转换与格式化 包含三个部分
XSLT(XSL Transformations)用于转换XML 文档的语言 XPath(XML Path Language) 用于在XML 文档中导航的语言 XSL-FO(XSL Formatting Objects)一种用于格式化XML 文档的语言
4.1.1. Why need XSL
XML文档开发时会遇到的问题
面向一个应用设计的组织数据的结构可能对另外的应用不适应 需要根据用户不同而对源文件处理,使之呈现内容不同,或者隐藏掉一些内容 开发者选择的结构可能其他人员不熟悉,或者不习惯 相同数据在不同终端显示,设备不同,显示要求也不一样,XSLT使得避免了大量繁琐的工作 CSS是一种静态的样式描述格式,其本身不遵从XML的语法规范
4.1.2. XSLT文件的格式
宣告部分
<?xml version="1.0"?>
<xsl:stylesheetversion ="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
主程式部分 函数部分
4.1.3. XSLT的主程式
主程式必须由<xsl:template match="/">
标签开始,而以</xsl:template>s
结束 XSL 程式开始执行时,先执行主程式,其他函数的执行是透过主程式或别的函数来调用 XSL 程式的输出是HTML 、XML或其他结构化的文件
4.1.4. XSLT程式的函数
函数由<xsl:template>
标签开始,以</xsl:template>
结束 和主程式的写法类似,只是函数名称不同。主程式的名称是match="/" 中的"/" ,表示原来XML 文件的根标签 函数名称定义在<xsl:template match=“函数名称” > 标签中match 的attribute 值,即"函数名称" ,此函数名称是原来XML 文件中的标签名称
4.1.5. match=“具体匹配表达式”
从XML文档中取出一个特定的节点集合
<xsl:templatematch="/">
<xsl:templatematch="shoppingcart/item">
<xsl:templatematch="/shoppingcart/item">
< xsl: template match = " shoppingcart/item[@itemNo=' 3333' ]" >
< shoppingcart>
< item>
< itemNo> 3333</ itemNo>
< itemName> 屠龙刀</ itemName>
</ item>
< item>
< itemNo> 4444</ itemNo>
< itemName> 离别钩</ itemName>
</ item>
</ shoppingcart>
4.1.6. xsl:for-each select=“词语”
列举特定的元素出来一一进行处理 order-by="+名称"
"+“表示按降序排列;”-"表示按升序排列
<xsl:iftest=".[名称='..']">
< xsl: value-of select = " 元素名称/@属性名称" />
4.2. XPath
w3c颁布成为正式标准
XSL和XPointer对XML源文档进行匹配以定位文档或文档部分时,XPath提供了一套整合的定位语法,能够向前或向后对文档片段进行定位 XQuery中,也有广泛的应用 XML源文档经常被看作是一些节点的集合,称作源文档树
XPath的表达式描述了一条对特定节点或节点集合的路径 使用符号斜线"/"来分离路径上的节点
4.2.1. XML文档树节点类型
根节点 元素节点 文本节点 属性节点 名字空间节点 处理指令节点 注释节点
4.2.2. XPath表达式
XPath的核心语法构架是表达式,XPath表达式由一系列的步组成,从根节点开始,步步深入,层层分析,直到最后一步返回结果
数字类型 布尔类型 字符串类型 节点集合
4.2.3. 当前上下文
context node:XPath定位步中的活跃元素 Root/…/Ancestor/Parent/SELF/Child/Descendant
4.2.4. 定位路径组成
XPath定位路径是由一步或许多步构成,这些步被前斜线"/"分隔每一步都由三个部分组成
…/axis::nodetest[predicate]/… 轴(axis):由步选择的节点和当前上下文节点之间的关系 节点测试(nodetest):由步选择的节点类型和节点扩展名称 谓词(predicate):可以没有,由表达式进一步筛选节点测试选择的节点集
4.2.5. 定位路径的种类
绝对路径
从根节点开始搜索,并且表达式以:"/"开头 例如:/child::catalog/child::tools 相对路径:
基于当前上下文节点开始搜索 例如:child::tools/child::saw
4.2.6. 例子
/paper/chapter[1]/section[2]/title
: 第一章第二部分的标题/paper/chapter/title
: 所有章的标题/paper/*/title
: 论文中任何子元素的标题parent::node()or..
: 当前节点的父节点self::node()or.
:当前节点../..
:当前节点的父节点的父节点child::*
:当前节点的子节点./following-sibling::node()/@status
:后继兄弟节点status属性
4.2.7. 轴
4.2.8. 节点测试
*对任何主节点类型的节点测试结果都为真 形式为NCName:* 时,其前缀和限制名称一样利用当前基准的名域声明进行扩展,除了加入名域的限制外,其选择节点和 * 一样 还可以选择节点的类型
//Comment():提取文档中所有的注释 /book/chapter[2]//text():提取第二章中所有元素的实际文本内容;
4.2.9. 谓词
轴和节点测试得到初始节点,由谓词进一步过滤,谓词形式为在方括号中加入谓词表达式,表达式为真时,选择该节点,否则不选择,谓词表达式经计算后结果是数字和非数字两种,若为数字,而且结果和该元素在初始节点集中的位置一样,表达式为真,否则为假
4.2.10. XPath中的字符串函数
4.2.11. XPath中的数值函数
4.2.12. XPath中的布尔函数
4.2.13. 示例
<?xml version="1.0" encoding="ISO-8859-1"?>
< bookstore>
< book>
< title lang = " eng" > Harry Potter</ title>
< price> 29.99</ price>
</ book>
< book>
< title lang = " eng" > Learning XML</ title>
< price> 39.95</ price>
</ book>
</ bookstore>
/bookstore/book[1]选取属于bookstore 子元素的第一个book 元素。 /bookstore/book[last()] 选取属于bookstore 子元素的最后一个book 元素。 /bookstore/book[last()-1] 选取属于bookstore 子元素的倒数第二个book 元素。 /bookstore/book[position()❤️]选取最前面的两个属于bookstore 元素的子元素的book 元素。 //title[@lang]选取所有拥有名为lang的属性的title 元素。 //title[@lang=‘eng’]选取所有title 元素,且这些元素拥有值为eng 的lang属性。 /bookstore/book[price>35.00]选取所有bookstore 元素的book 元素,且其中的price 元素的值须大于35.00。 /bookstore/book[price>35.00]/title 选取所有bookstore 元素中book 元素的title 元素,其中的price 元素的值须大于35.00
5. XML解析
5.1. XML解析技术的分类
把代表XML文档的一个无结构的字符序列转换为满足XML语法的结构化组件的过程
面向文档的流式解析 面向文档的对象式解析 面向文档的指针式解析 面向应用的对象式解析
5.2. 面向文档的流式解析
一种基于事件的解析过程,解析器顺序读取XML文档,产生一个对应的事件流,并向事件处理程序发送所捕获的各种事件,如元素开始和元素结束等 能够立即读取数据,而不是等待所有的数据被处理 不需要将整个文档一次加载到内存,效率较高 易用性的降低,流式解析编程较为复杂 单遍解析特性,不支持随机访问 推式解析(SAX)和拉式解析(StAX)
5.3. 推式解析(SAX)
解析器控制着读循环,在文档结束之前控制权不会返回给应用程序。解析器通过回调的方式进行数据处理 SAX基于事件驱动,SAX解析器在读取XML文档的过程中生成一个事件流,并且对于每个事件通过回调事件处理程序中相应的方法来进行处理。比如元素开始和结束标记,元素内容,实体,语法分析错误等事件。针对下面的简单XML文档,所产生的事件如图所示,注意针对元素内的空格或回车也会生成一个文本事件
5.4. 拉式解析(StAX)
应用程序控制着读循环。循环中,应用程序负责反复调用解析器获得下一个事件,直到文档结束 通过保留解析过程的控制权,可以简化调用代码来准确地处理它预期的内容,并且可随时停止解析 没有基于处理程序回调,应用程序也不需要像SAX中那样模拟解析器的状态
5.5. 两套处理XML的API
基于指针的API:简单返回事件,此时事件用数值形式来表示。这是一种低层API,没有提供底层XML结构的抽象 基于迭代器的API:以对象方式返回事件,每个事件对象都封装了它所表示的特定XML结构固有的信息,因此可直接利用其方法获得属于该结构的信息,但也需要额外的对象创建开销
5.6. 面向文档的对象式解析技术
流式解析方式无法更改数据和不支持随机访问 DOM (Document Object Model) 用与平台和语言无关的方式对XML文档进行建模的W3C标准,提供一个可以通用于各种程序语言和应用程序的接口 DOM作为一种对象式解析技术,定义了层次化对象模型来表示XML文档。即为XML语法中的每个概念(如元素,属性,实体,文档等)定义对应的类,而解析器在读入XML文档的时候,会建立XML语法和类之间的一一映射 DOM的层次化对象模型是一个树形结构,它将一个XML文档看作一棵节点树,每个节点代表一个XML文档中的元素
5.7. DOM的基本节点对象
Document对象:树的最高节点,也是对整个文档操作的入口 Element和Attr对象:对文档中元素和元素属性的映射 Text对象:作为Element和Attr对象的子节点,代表元素或属性的文本内容 NodeList对象:对节点按指定的方式进行遍历
5.8. 面向文档的指针式解析技术
效率问题:提取解析模式,解析时提取一部分源文件(字符串),然后在内存中进行解析构建 VTD(Virtual Token Descriptor)记录每个元素的起始位置,长度,深度以及令牌的类型等信息,类似于XML文档中元素的指针,可以快速定位到某个元素 VTD-XML是一种无提取的XML解析方法,解决了DOM占用内存过大的缺点,并且还提供了快速的解析与遍历、对XPath的支持和增量更新等特性
5.8.1. VTD记录的比特层格式
令牌开始偏移量(即相对于XML文档头部的距离)是30 bits,能解析的最大文件是1G。令牌长度为20 bits,即一个令牌的最大长度是1M。令牌类型4bits,说明支持16种词汇类型
5.9. 面向应用的对象式解析技术
有的程序关心文档的XML结构;有的应用程序仅仅将XML作为数据交换的媒介,它们更关心的是文档数据本身 数据绑定是指将数据从一些存储媒介(如XML文档、文本文件和数据库)中取出,并通过应用程序表示这些数据的过程,即把数据绑定到虚拟机能够理解并且可以操作的某种内存中的结构 Hibernate就是针对数据库的轻量级数据绑定框架
5.9.1. 数据绑定的应用
编组(Marshalling) :把内存中的数据转换到存储介质中的过程。 解组(Unmarshalling) :把数据从存储媒介转换到内存中的过程 映射(Mapping) :用于编组和解组的一套规则
5.10. 文档模型和数据绑定模型比较
5.11. 四种XML解析技术的特性比较
5.12. 面向文档解析方式的性能比较