标题 ##※ XML简单的历史介绍
1969年 GML 通用标记语言
用于计算机之间的通信,通信就会传输数据,那么就需要一种数据的规范。
1985年 SGML 标准通用标记语言
对GML进行完善。
1993年 HTML 超文本的标记语言(HyperText Markup Language)
随着万维网的推广,在SGML的基础上,又出现了HTML语言,用于万维网上的页面展示。
1998年 XML 可扩展的标记语言(Extensible Markup Language)
HTML有不少的缺陷,HTML语言的标记不能自定义,HTML语言的标记本身不能用来描述数据,HTML语言的标记没有国际化(不同浏览器显示同一页面的效果可能不一样),W3C组织在1998年推出了可扩展标记语言XML,XML语言的本身是用来替代HTML语言的,但是俩种语言还有一定差异的,所以中间出现了一种过渡的语言:XHTML,但实际上XML语言已经很难替代HTML语言了,因为HTML语言的使用在整个万维网上使用太广泛了。
※ XML有什么作用,为什么要学习XML
第一个需求: 数据传输需要一定的格式
1.数据的可读性
2.将来的扩展
3.将来的维护
XML现在已经是业内传输数据的标准,它和语言无关。
第二个需求: 配置文件,之前使用的.properties资源文件中描述的信息不丰富
第三个需求: 保存数据,充当小型的数据库,保存数据一般是使用数据库保存,或者使用一般的文件保存,这个时候也可以选择XML文件,因为XML可以描述复杂的数据关系。从普通文件中读取数据的速度肯定是比从数据库中读取数据的速度快,只不过这样不是很安全而已。
※ 语法
1.文档声明
XML文件的后缀为.xml
XML文本要求文件有一个头部声明: 用来告诉解析器一些相关信息
<?xml version="1.0" encoding="UTF-8"?>
表明当前文件是xml文件,XML版本为1.0,文件内容使用的字符编码为UTF-8
注意:要小心在系统中这个xml文件保存时候的编码,是否和文件内容中设置的编码一致
2.元素
2.1
每个XML文档必须有且只有一个根元素。root
根元素是一个完全包括文档中其他所有元素的元素。
根元素的起始标记要放在所有其他元素的起始标记之前。
根元素的结束标记要放在所有其他元素的结束标记之后。
2.2
xml文件中的标记也可以叫标签、元素、节点。
XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
包含标签体:
<a>www.baidu.com</a>
不含标签体的:
<a></a>, 可以简写为:<a/>
一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:
<a>你好!<b>程序员</a></b>
这样嵌套是可以的
<a>你好!<b>程序员</b></a>
2.3
对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。
<name>tom</name>
<name>
tom
</name>
由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,要特别注意。但是在一些封装好的解析方式中,是可以忽略掉这些空格和换行的.(例如在一些第三方提供的jar包中)
2.4
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范
a)区分大小写,例如,<P>
和<p>
是两个不同的标记。
b)不能以数字或”_” (下划线)开头。
c)不能包含空格。
3.属性
<student id="100">
<name>TOM</name>
</student>
a)属性值用双引号(”)或单引号(’)分隔
b)一个元素可以有多个属性,它的基本格式为:
c)<元素名 属性名=”属性值”>
d)特定的属性名称在同一个元素标记中只能出现一次
e)属性值不能包括<, >, &
4.实体 entity
xml文件中有些特殊的字符是不能直接表示出来的,例如:大于号,小于号,单引号、双引号等等 。
使用实体的格式: &实体名字;
预定义字符实体,由XML规范预先定义好了
< <
> >
& &
" "
' '
自定义实体 ENTITY entity格式:
<!DOCTYPE 根元素名称[
<!ENTITY 实体名 实体内容>
]>
eg:
<!DOCTYPE courses[
<!ENTITY company "昆山杰普软件科技有限公司">
]>
其中:company为实体名称
"昆山杰普软件科技有限公司"是实体内容
实体的使用:&company;
4.注释
<!--这是一个注释-->
注释内容中不要出现- -;
不要把注释放在标记中间;
<Name <!--the name--> > TOM </Name>
注释不能嵌套;
可以在除标记以外的任何地方放注释
5.PCDATA,CDATA
PCDATA (Parsed Character Data) 会被xml文档解析器解析的,但是有些特殊字符需要借助实体才可以被解析器解析。
XML文件中的正常内容基本都是PCDATA
CDATA (Character Data) 不会被xml文档解析器解析的,按字符串原样输出。有些内容不想让解析,按照内容原样输出就可以了,这种情况可以使用CDATA
格式:
<![CDATA[需要原样输出的字符串]]>
<![CDATA[.....]]>
※ 语法测试演示:
<?xml version="1.0" encoding="UTF-8"?>
<!-- <? xml版本 字符编码 ?> -->
<!-- 标签构建的时候
1.又开始标签一定要有结束标签
2.只能有一个跟标签(一级标签)
3.标签大小写敏感
4.标签的名字不能出现空格
5.名字不能以数字开头或者含有特殊符号,下划线可以写
6.标签不能交叉嵌套<name><age></name></age>error
7.没有内容的标签可以是一个标签。<name></name>等价于<name/>
8.test/xml-->
<!-- 属性:
1.属性以key=value的形式出现
2.必须在开始标签中,以双引号或者单引号引起来
3.属性不能有key,没有value,也不能value不用标记引起来 -->
<!-- 实体:用一些变量替换标记
< <
> >
& &
" "
' ' -->
<!-- 自定义实体变量声明 -->
<!DOCTYPE students[
<!ENTITY company "杰普软件有限公司">
]>
<!-- xml格式中数据两种类型PCDATA CDATA
默认:xml文件中的所有内容格式是PCADATA,改格式会被验证是否符合语法,
不符合语法直接报错,CDATA需要自己执行,里面的数据不会被验证器验证
(会被忽略),CDATA一般限定含有特殊符号的内容 如:<>... -->
<students>
<program>
<!-- CDATA的声明 -->
<![CDATA[for(int i=0;i<10;i++){3>10&"'}]]>
</program>
<user>
<company>&company;</company>
</user>
<student id="1" class="test" kk='23'>
<!-- 两个name里内容表示的不一样 -->
<name>tom</name>
<name>
tom
</name>
<age>33</age>
</student>
<student>
<name>tom1</name>
<age>33</age>
</student>
</students>
6.处理指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,使用css文件显示xml文档内容。
<?xml-stylesheet type="text/css" href="css文件路径"?>
处理指令必须以 <?
作为开头,以 ?>
作为结尾,XML文件的头部声明语句就是最常见的一种处理指令。
XML文件中可以有多个处理指令
例如: class.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="class.css" type="text/css"?>
<class>
<student id="001">
<name>张三</name>
<age>20</age>
</student>
<student id="002">
<name>李四</name>
<age>20</age>
</student>
</class>
class.css文件:
name{
font-size:30px;
font-weight:bold;
color:red;
}
age{
font-size:30px;
font-weight:bold;
color:green;
}
<!--test1.xml文件-->
<?xml version="1.0" encoding="UTF-8"?>
<!-- 处理指令的声明
href引css文件的路径,注意:路径以相对路径描述相对本文件的位置
当test.css与test1.xml的上级目录同级时,改为"../test.css"
type=文档类型-->
<?xml-stylesheet type="text/css" href="test.css"?>
<stu>
<name>tom</name>
<age>33</age>
</stu>
<!--test.css文件-->
name{
color:#6bff3c;
font-size:35px;
}
age{
color:red;
font-weight:900;
}
※ XML命名空间 namespace
※ XML 命名空间提供避免元素命名冲突的方法。
在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。如果出现相同的标签,两组标签标示的含义不同,用命名空间进行区分用的。命名空间一般指向唯一资源(本地,网络)。
例如:
这个 XML 文档携带着某个表格中的信息:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
这个 XML 文档携带有关桌子的信息(一件家具):
<table>
<name>茶几</name>
<width>80</width>
<length>120</length>
</table>
假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table>
元素,就会发生命名冲突。XML 解析器无法确定如何处理这类冲突。
第一种解决方案:使用前缀来避免命名冲突
此文档带有某个表格中的信息:
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
此 XML 文档携带着有关一件家具的信息:
<f:table>
<f:name>茶几</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table>
元素 (<h:table>
和 <f:table>
)。通过使用前缀,我们创建了两种不同类型的 <table>
元素。
第二种解决方案:使用命名空间(Namespaces)
这个 XML 文档携带着某个表格中的信息:
<h:table xmlns:h="http://www.briup.com/h">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
此 XML 文档携带着有关一件家具的信息:
<f:table xmlns:f="http://www.briup.com/f">
<f:name>茶几</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
与仅仅使用前缀不同,我们为 <table>
标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。
※ XML Namespace (xmlns) 属性
XML 命名空间属性被放置于元素的开始标签之中(一般都会在根元素中声明),并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。
※ 默认的命名空间(Default Namespaces) 使用以下的语法:
xmlns="namespaceURI"
为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。
这个 XML 文档携带着某个表格中的信息:
<table xmlns="http://www.briup.com">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
此 XML 文档携带着有关一件家具的信息:
<table xmlns="http://www.baidu.com">
<name>茶几</name>
<width>80</width>
<length>120</length>
</table>
※ XML约束
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
需要XML约束的原因:xml由于是可扩展的标记语言,所以在xml文件中的编写太过于自由,这样在很多种情况下并不合适。
※ 常用的约束技术:
1)XML DTD
DTD文件的后缀名为 .dtd
DTD文件有自己独立的语法规范
2)XML Schema
Schema文件的后缀名为 .xsd
Schema文件符合xml语法规范
※ DTD约束
<?xml version="1.0" encoding="UTF-8"?>
<!-- 对xml约束两种
dtd 文件结尾.dtd
schema 文件结尾.xsd
-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
※ 添加TDT约束
复制:-//Hibernate/Hibernate Configuration DTD 3.0//EN
找到eclipse中的preferences,搜索XML Catalog,把复制内容复制到Key中,在File-System或Workspace中找到文件hibrnate-configuration-3.0.dtd(需下载:hibrnate-configuration-3.0.dtd)然后添加OK就行了。
※ Schema约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
</beans>
※ 添加Schema约束
同样的将:
http://www.springframework.org/schema/context
复制到key中,然后在File-System或Workspace中找到文件spring-context-3.2.xsd(需下载:spring-context-3.2.xsdspring-bean-3.2.xsd)然后Key-type选择Schema-localhost添加OK就行了。