day02-xml
? day02-XML[陈文文1]?XML? 1??????? XML的概述1.1 什么是XML XML全称为Extensible Markup Language,意思是可扩展的标记语言。XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。 W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本!!! ? 1.2 XML的应用场景 保存关系型数据: <student number="1001"> ?????????????????? <name>zhangSan</name> ?????????????????? <age>23</age> ?????????????????? <sex>male</sex> ??????? <teacher name=”liSi”> ????????? <wife id=”xxx”><name>xxx</name></wife> ??????? </teacher> ???????? </student> ? 配置文件: <servlet> ?????????????????? <servlet-name>MyServlet</servlet-name> ?????????????????? <servlet-class>cn.itcast.servlet.MyServlet</servlet-class> ???????? </servlet> ? 2 XML语法? 来看一个XML文档 students.xml
? 2.1 XML文档声明 l? 文档声明必须为<?xml开头,以?>结束; l? 文档声明必须从文档的0行0列位置开始; l? 文档声明只有三个属性:
? 2.2 元素 元素是XML文档中最重要的组成部分: l? 普通元素的结构:开始标签、元素体、结束标签,例如:<hello>大家好</hello>; l? 元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>,其中<b>元素的元素体是<a>元素,而<a>元素的元素体是文本; l? 空元素:空元素只有开始标签,而没有结束标签,例如:<c/>,当元素必须自己闭合。 ? 3 属性???????? <student number="1001"> ?????????????????? <name>zhangSan</name> ?????????????????? <age>23</age> ?????????????????? <sex>male</sex> ???????? </student> ? l? 属性是元素的一部分,它必须出现在元素的开始标签中; l? 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引; l? 一个元素可以有0~N个属性,但一个元素中不能出现同名属性; ? 4 注释XML的注释与HTML相同,即以“<!--”开始,以“-->”结束。注释内容会被XML解析器忽略! ? 5 转义字符和CDATA段5.1 转义字符[陈文文2]? XML中的转义字符与HTML一样。 因为很多符号已经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:“<”、“>”、“’”、“””、“&”。 ? ? 例如:<a><hello></a>,<a>元素内部会被解释为:<hello>! ? 5.2 CDATA[陈文文3]?段 当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。 在CDATA段中出现的“<”、“>”、“””、“’”、“&”,都无需使用转义字符。这可以提高xml文档的可读性。
? 在CDATA段中不能包含“]]>”,即CDATA段的结束定界符。 ? 6 处理指令处理指令[陈文文4]?,简称PI(Processing instruction)。处理指令用来指挥解析器如何解析XML文档内容。 例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析器,应用css文件显示xml文档内容。
? 处理指令以“<?”开头,以“?>”结束,这一点与xml文档声明相同。 ?
? 7 格式良好的XML文档格式良好的XML就是格式正确的XML文档,只有XML的格式是良好的,XML解释器才能解释它。下面是对格式良好XML文档的要求: l? 必须要有XML文档声明; l? 必须且仅能有一个根元素; l? 元素和属性的命名必须遵循XML要求:
l? 元素之间必须合理包含,例如:<a><b>xxx</b></a>是合理的,而<a><b>xxx</a></b>就是错误的包含。 ? DTD? 1 DTD概述1.1 什么是DTD DTD(Document Type Definition),文档类型定义,用来约束XML文档。或者可以把DTD理解为创建XML文档的结构!例如可以用DTD要求XML文档的根元素名为<students>,<students>中可以有1~N个<student>,<student>子元素为<name>、<age>和<sex>,<student>元素还有number属性。 DTD不是XML文档,它是XML文档的约束文件!就像法律与人一样! 展示DTD文档
? 1.2 DTD分类 l? 内部DTD:在XML文档内部嵌入DTD,只对当前XML文档有效; l? 外部DTD:独立的DTD文件,扩展名为.dtd;
? 1.3 内部DTD ? 内部DTD:
? l? 位置:内部DTD在文档声明下面,在根元素上面; l? 语法格式:放到“<!DOCTYPE 根元素名称 [”和“]>”之间; l? 只对当前XML文档有效; ? 1.4 SYSTEM DTD 本地DTD
? students.dtd
? l? 位置:本地硬盘上; l? 语法格式:直接定义元素或属性即可; l? 本地所有XML文档都可以引用这个dtd文件; ? 1.5 公共DTD 公共DTD
? 公共DTD是说,DTD由某个公司或权威组织发布的,供大家使用的DTD。其格式如下: <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD网址"> 当然你需要知道要使用的DTD的名称和网址。如果某个机构公布了DTD,那么一定也会公布DTD的名称和网址。 ? 2 DTD语法之定义元素2.1 定义元素语法 定义元素语法:<!ELEMENT 元素名 元素描述> l? <!ELEMENT name (#PCDATA)>,定义名为name的元素,内容为文本类型。 l? <!ELEMENT student (name,sex)>,定义名为student元素,内容依次为name、age、sex元素; l? <!ELEMENT student ANY>,定义名为student元素,内容任意; l? <!ELEMENT student EMPTY>,定义名为student元素,不能有内容,即空元素,注意空元素是可以有属性的。 ? 2.2 子元素出现次数 可以使用*、+、?来指定子元素出现的次数 l? *:可以出现0~N次; l? +:可以出现1~N次; l? ?:可以出现0~1次。 例如:<!ELEMENT student(name,age?,hobby*,grade+) >,定义student元素,第一子元素为name,必须且仅能出现一次,age是可有可无的,hobby可以出现0~N次,grade可以出现1~N次。 ? 2.3 枚举类型子元素 <!ELEMENT student (name | age | sex)>,表示student子元素为name、age、sex其中之一,必须仅且能选择其一。 ? 2.4 练习 l? 根元素为students,可以包含1~N个student元素; l? student元素依次包含:name、age、sex元素; l? name、age、sex元素的内容类型为文本内容; l? 要求SYSTEM外部DTD。 ? 3 DTD语法之定义属性3.1 定义属性的语法 <!ATTLIST 元素名 属性名 属性类型 设置说明> 例如:<!ATTLIST student number CDATA #REQUIRED>,给student元素定义属性number,类型为文本,这个默认是必须的。 ? 3.2 属性设置说明 l? #REQUIRED:说明属性是必须的; l? #IMPLIED:说明属性是可选的; l? 默认值:在不给出属性值时,使用默认值。 ? 3.3 属性的类型 l? CDATA:文本类型; l? Enumerated:枚举类型; l? ID:ID类型,ID类型的属性用来标识元素的唯一性,即元素的ID属性值不能与其他元素的ID属性值相同; l? IDREF:ID引用类型,用来指定另一个元素,与另一个元素建立关联关系,IDREF类型的属性值必须是另一个元素的ID。 ?
? 4 DTD语法之定义实体(了解)4.1 什么是实体 有时在XML中会出现很多相同的内容,例如“北京传智播客教育科技有限公司”,这个名称太长了,我们希望把这个值与一个“符号”绑定,然后在需要这个名称时使用它绑定的“符号”即可。这个符号就是实体了。例如:“&传智;”! 其中“传智”是实体名,而“北京传智播客教育科技有限公司”是实体值,XML被解析时,所有实体会被替换成实体名。 ? 4.2 实体分类 实体分为两种:一般实体和参数实体。 l? 一般实体:在XML文档中使用; l? 参数实体:在DTD使用。 ? 4.3 一般实体 l? 定义一般实体:<!ENTITY 实体名 “实体值”>,例如:<!ENTITY 大美女 “白冰”>; l? 一般实体引用:&实体名;,例如<xxx>&大美女;</xxx>。 ?
? 4.4 参数实体 l? 定义参数实体:<!ENTITY % 实体名 "实体值">,“%”与实体名之间的空格是必须的;
l? 参数实体引用:%实体名;;
? 参数实体是在DTD内部使用,而不是在XML中使用。 在内部DTD中使用参数实体会有诸多限制。 ?
? Schema? 1 Schema概述1.1 什么是Schema l? Schema是新的XML文档约束; l? Schema要比DTD强大很多; l? Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。 ? 1.2 Schema简介 本课程中不对Schema深入探讨,我们只对Schema有个了解即可。 ? students.xsd
? students.xml
? ? 2 Schema名称空间2.1 什么是名称空间 如果一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中使用了import java.util.*和import java.sql.*时,在使用Date类时,那么就不明确Date是哪个包下的Date了。 总之名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。 ? 2.2 目标名称空间 在XSD文件中为定义的元素指定名称,即指定目标名称空间。这需要给<xsd:schema>元素添加targetNamespace属性。 l? <xsd:schema targetNamespace="http://www.itcast.cn/xml"> 名称空间可以是任意字符串,但通常我们会使用公司的域名作为名称空间,这与Java中的包名使用域名的倒序是一样的!千万不要以为这个域名是真实的,它可以是不存在的域名。 如果每个公司发布的Schema都随意指定名称空间,如a、b之类的,那么很可能会出现名称空间的名字冲突,所以还是使用域名比较安全,因为域名是唯一的。 当使用了targetNamespace指定目标名称空间后,那么当前XSD文件中定义的元素和属性就在这个名称空间之中了。 ? 2.3 XML指定XSD文件 在XML文件中需要指定XSD约束文件,这需要使用在根元素中使用schemaLocation属性来指定XSD文件的路径,以及目标名称空间。格式为:schemaLocation=”目标名称空间 XSD文件路径” l? <students? schemaLocation="http://www.itcast.cn/xml students.xsd"> schemaLocation是用来指定XSD文件的路径,也就是说为当前XML文档指定约束文件。但它不只要指定XSD文件的位置,还要指定XSD文件的目标名称空间。 其中http://www.itcast.cn/xml为目标名称空间,students.xsd为XSD文件的位置,它们中间使用空白符(空格或换行)分隔。 也可以指定多个XSD文件,格式为: l? schemaLocation=”目标名称空间1 XSD文件路径1 目标名称空间2 XSD文件路径2” ? 下面是spring配置文件的例子,它一共指定两个XSD文件
? 下面是JavaWeb项目的配置文件:
? 2.4 定义名称空间 现在我们已经知道一个XML中可以指定多个XSD文件,例如上面Spring的配置文件中就指定了多个XSD文件,那么如果我在<beans>元素中给出一个子元素<bean>,你知道它是哪个名称空间中的么?
? 所以只是使用schemaLocation指定XSD是不够的,它只是导入了这个XSD及XSD的名称空间而已。schemaLocation的作用就相当于Java中导入Jar包的作用!最终还是在Java文件中使用import来指定包名的。 xmlns是用来指定名称空间前缀的,所谓前缀就是“简称”,例如中华人发共和国简称中国一样,然后我们在每个元素前面加上前缀,就可以处理名字冲突了。 格式为:xmln:前缀=”名称空间” 注意,使用xmlns指定的名称空间必须是在schemaLocation中存在的名称空间。 ?
? 2.5 默认名称空间 在一个XML文件中,可以指定一个名称空间没有前缀,那么在当前XML文档中没有前缀的元素就来自默认名称空间。
? 2.6 W3C的元素和属性 如果我们的XML文件中需要使用W3C提供的元素和属性,那么可以不在schemaLocation属性中指定XSD文件的位置,但一定要定义名称空间,例如:
? 上面定义了一个名称空间,前缀为xsi,名称空间为http://www.w3.org/2001/XMLSchema-instance。这个名称空间无需在schemaLocation中不存在这个名称空间。 你可能已经发现了,schemaLocation这个属性其实是w3c定义的属性,与元素一定,属性也需要指定“出处”,xsi:schemaLocation中的xsi就是名称空间前缀。也就是说,上面我们在没有指定xsi名称空间时,就直接使用schemaLocation是错误的。 ?[陈文文1]2018.6.7 ?[陈文文2] 不用记忆,需要百度搜索 ?[陈文文3]不用转义字符 它里面都是特殊字符 ?[陈文文4]xml文件的第一行 ?[崔5]处理指令 ?[崔6]定义元素students,其内容为1~N个student元素。 ?[崔7]定义元素student,内容依次为name、age、sex元素 ?[崔8]定义元素name,内容为文本 ?[崔9]定义元素age,内容为文本 ?[崔10]定义元素sex,内容为文本 ?[崔11]dtd文件路径 ?[崔12]定义students,可以包含1~N个student元素 ?[崔13]定义student元素,该元素为空元素,即不能有元素体 ?[崔14]为student定义属性number,类型为ID,该属性是必须出现的。 ?[崔15]为student定义属性name,类型为字符串,该属性是必须的。 ?[崔16]为student定义属性sex,类型为枚举,可选值为male或female,默认值为male ?[崔17]为student定义属性friend,类型为IDREF,该属性是可选的。 ?[崔18]引用一般实体 ?[崔19]定义一般实体 ?[崔20]定义参数实体 ?[崔21]参数实体引用 ?[崔22]指定目标名称空间名称 ?[崔23]定义students元素,类型为studentsType类型 ?[崔24]定义studentsType类型 ?[崔25]studentsType类型包含0~N个student元素 ?[崔26]定义studentType类型 ?[崔27]子元素必须按顺序出现 ?[崔28]studentType类型顺序包含子元素name,类型为字符串 ?[崔29]studentType类型顺序包含子元素age,类型为ageType ?[崔30]studentType类型顺序包含子元素sex,类型为sexType ?[崔31]studentType类型包含属性number,类型为numberType,该属性是必须的 ?[崔32]定义类型sexType ?[崔33]该类型是对string进行约束 ?[崔34]指定枚举选项 ?[崔35]定义ageType类型 ?[崔36]该类型对integer进行约束 ?[崔37]范围为0~100 ?[崔38]定义numberType类型 ?[崔39]对string类型进行约束 ?[崔40]指定正则表达式 ?[崔41]指定默认名称空间 ?[崔42]指定Schema约束文件 ?[崔43]子元素student,其中number属性是必须的,而且number属性值必须匹配正则表达式ITCAST_d{4} ?[崔44]子元素name,内容为任意字符串 ?[崔45]子元素age,内容必须是0~100之间的整数 ?[崔46]子元素sex,内容必须是male和female其中之一。 ?[崔47]第一个XSD文件的目标名称空间 ?[崔48]第一个XSD文件的位置,这个网址必须是真实的,不然就找不到XSD文件了。 ?[崔49]第二个XSD文件的目标名称空间 ?[崔50]经二个XSD文件的位置 ?[崔51]如果两个名称空间中都<bean>元素会怎么样呢? ?[崔52]指定b前缀 ?[崔53]指定aop前缀 ?[崔54]在使用元素时,需指定前缀,这就可以区别元素是哪个名称空间下的了。每个元素都要指定名称空间前缀,如果不指定那么元素就是没有名称空间。 ?[崔55]指定默认名称空间,即没有前缀的名称空间,如果元素没有指定前缀,那么表示来自这个名称空间 ?[崔56]来自默认名称空间,因为没有前缀。 ?[崔57]定义名称空间,这个名称空间来自w3c,所以在下面的schemaLocation中无需指定。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |