XML(XML基础,XML验证,XML解析)
一:了解XML
XML:eXtensive Markup Language
可扩展的标记语言
HTML:HyperText Markup Language
超文本的标记语言,做静态界面的
标记语言:<***>…</***>
可扩展:标签名是自定义
XML和HTML的区别:
1)XML标签名是自定义
HTML标签名是预定义,
由W3C预定义:World Wide Web Consortium
2)HTML重点在显示数据,做静态界面的
XML重点在保存数据,传输数据,配置数据
想用xml保存自己的信息?
myinfo.xml
二:why?
1)保存数据
io/file保存数据—>解析数据
保存数据的格式不规范
解析数据的方式不统一
数据库保存数据
不是一个轻量级的保存数据的方式
重点是方便操作数据
xml保存数据
是轻量级的保存数据的方式(.xml文件)
保存数据的格式规范
解析数据的方式统一
2)xml是跨平台,跨语言
目前主流的语言(java,c++,PHP…)都支持xml
3)保存个性化的连接
Socket s=new Socket(“127.0.0.1”,8888);
.class---->jar
info.xml
127.0.0.1
8888
读取文件—>获取ip,port—>String[]
Socket s=new Socket(str[0],Integer.parseInt(str[1]);
4)重要文件:web.xml,JavaEE开发的配置文件
各种框架的使用也有很多xml的配置文件
android中UI布局文件和配置文件
5)在网络传输中也会使用xml数据(异步更新)
网络传输中也会使用HTML数据
三 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可以描述复杂的数据关系。
从普通文件中读取数据的速度肯定是比从数据库中读取数据的速度快,
只不过这样不是很安全而已
五:语法
a)文档声明
XML文件的后缀为.xml
XML文本要求文件有一个头部声明: 用来告诉解析器一些相关信息
<?xml version="1.0" encoding="UTF-8"?>
表明当前文件是xml文件,XML版本为1.0,文件内容使用的字符编码为UTF-8
注意:要小心在系统中这个xml文件保存时候的编码,
是否和文件内容中设置的编码一致
ansi (American National Standards Institute)美国国家标准协会
ansi编码 是这个协会组织制定的一种字符编码
ansi编码在不同国家表示是不用的 中文操作系统中的ansi编码是GB2312
b)结构
Larry Zhao
Kevin Ding
Renee Xue
briup元素内容由CEO,CTO,CFO元素
和4个空白字符
开始标签:<标签名>,如
结束标签:</标签名>,如
元素:由开始标签和结束标签组成
元素内容:开始标签和结束标签中间的内容
元素内容可能出现的情况:
1)元素内容为空—>空元素
也可以写成:
2)元素内容为字符内容—>字符元素
字符内容由字符和空字符,实体组成
zhang san
3)元素内容为另外一个元素—>子元素
zhangsan
4)元素内容由子元素和字符内容组成—>混合元素
zhangsan
stu元素内容由name元素和2个空白字符组成
六:xml的语法规则
作用:规范该文件是否是一个良构xml文件,
良构xml:结构良好的文件.
写一个xml文件必须是一个良构xml文件
1)第一行必须写指令处理:<?xml ?>
指令处理可以包含版本号version=“1.0”
可以包含编码格式:
encoding=“UTF-8”
2)有并且只有一个根元素
xml数据转换相应树的结构.
3)元素使用规则
a)元素由开始标签和结束标签组成
b)属性放在开始标签中
c)注意空元素的写法:
4)元素嵌套规则:一个元素除了根元素外必须嵌套
在外围元素的开始标签和结束标签中。
//error
5)元素名和属性名的命名规则
a)以字母和_开头的,由字母,数字,-._组成的
b)区分大小写
c)名字中不能出现空格
d)不能使用W3C中的保留字
6)属性使用规则
a)属性格式:属性名=“属性值”
属性必须有属性值
b)属性放在元素的开始标签中
c)元素可以有多个属性,并且多个属性使用
空格隔开,属性名必须唯一。
d)属性值必须使用单引号或者双引号引起来
students.xml保存所有学生的信息
id作为属性
name,age,gender
courses.xml保存从开始到目前所学课程的信息
name,time
七:注释
八:PCDATA,CDATA,实体
a)PCDATA:可以被xml文档解析器解析的
有些字符如果要解析,需要借助实体.
在浏览器显示 xml中
< <
b)CDATA:不可以被xml文档解析器解析的,
按照字符串原样输出.
格式:<![CDATA[输入的内容]]>
在浏览器显示 xml中
< <![CDATA[<]]>
c)实体 entity
xml文件中有些特殊的字符是不能直接表示出来的,例如:大于号,小于号,单引号、双引号等等
并且实体可以用来代替某些东西
使用实体的格式: &实体名字;
预定义字符实体,由XML规范预先定义好了
< <
> >
& &
" "
’ ’
自定义实体:ENTITY
格式:
]>
eg:
]>
其中:company为实体名称
"昆山杰普软件科技有限公司"是实体内容
实体的使用:&company;
九: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文件中的编写太过于自由,这样在很多种情况下并不合适。
常用的约束技术
XML DTD
DTD文件的后缀名为 .dtd
DTD文件有自己独立的语法规范
XML Schema
Schema文件的后缀名为 .xsd
Schema文件符合xml语法规范
十一: DTD Document Type Define
a)DTD的定义:描述元素、属性和其他杂项在xml文档中
的使用规则的说明
b)DTD的分类:
1).外部的DTD:DTD和xml文档不在同一个文件中
2).内部的DTD:DTD和xml文档在同一个文件中
3).混合的DTD:既有外部DTD,又有内部DTD
c)DTD的目的:
验证该xml文档是否是有效的xml文档
如果一个良构的xml文档满足了DTD的声明就是一个有效的xml文档。
注意:良构 不一定 有效,但是有效一定良构
d)DTD的所定义的内容:
a)元素可能出现还是必须出现
b)元素出现的频率
c)元素如何嵌套
d)属性时允许出现,还是必须出现,以及属性的默认值
e)声明元素的使用规则
语法: <!ELEMENT elementName contentModel>
contentModel分为四种:
1) EMPTY: 声明元素内容为空
DTD: <!ELEMENT root EMPTY>
XML: 或者
2) ANY: 声明元素内容为任意(空、字符数据
或者子元素),主要使用在元素内容不确定的情况下。
DTD: <!ELEMENT root ANY>
<!ELEMENT name (#PCDATA)>
XML: a) <root/>
b) <root>abc</root>
c) <root><name>jack</name></root>
3) Elements:声明元素的内容仅仅是子元素
(可以是序列、选择、一个或多个等)控制元素出现的顺序和频率
<!ELEMENT name(a,b)> sequence
<!ELEMENT name(a|b)> choice
<!ELEMENT name(a)> one
<!ELEMENT name(a)+> one or more
<!ELEMENT name(a)*> zero or more
<!ELEMENT name(a)?> zero or one
4) Mixed: 声明的元素内容为混合类型,
分为两种:
a) <!ELEMENT root (#PCDATA)>
元素内容可以为字符、空、空格、ENTITY的组合。
b)DTD:
<!ELEMENT root (#PCDATA|name|gender)*>(固定格式)
XML: <root>
abc
<name>jack</name>
def
</root>
元素内容可以为#PCDATA和子元素的组合,
且子元素name和gender可以出现也可以不出现,
出现范围只能这两个元素,
但是出现顺序和频率不限制。
<!ELEMENT review (#PCDATA|子元素)*> <!ELEMENT stu (#PCDATA|name|age)*>
stu:可以多个字符内容
可以包含多个name,或者多个age,或者
多个name和age,name和age顺序没有关系,
频率也没有关系的。子元素只能出现在
name和age这两个元素。
六:声明元素属性的使用规则
语法: <!ATTLIST elementName attributeName attributeType attributeDefault>
或者
<!ATTLIST elementName (一个元素中出现多个属性) attributeName attributeType attributeDefault ... attributeName attributeType attributeDefault>
attributeType(属性值的类型):
1) CDATA: 声明属性值为CDATA类型
2) ID: 指明属性的值是唯一的(针对整个xml文档),
并且属性的值必须符合xml的名字命名规则。属性值不能重复。
3) (enumerated): 声明属性值为枚举类型,可以从指定的值中选择一个。
attributeDefault(属性的默认值):
1) #REQUIRED
声明的属性必须出现在元素的开始标记中
2) #IMPLIED
声明的属性出现是可选的,若属性不出现则没有默认的属性值。
3) attribute-value
声明的属性出现可选,若不出现属性值则采用指定的默认值(attribute-value)
4) #FIXED
属性的出现可选,但是不管是否出现,
属性值都采用#FIXED后面声明的常量,而且不能改为其它值。
七:引入外部的dtd
SYSTEM:引用本地的dtd
PUBLIC:引用网络上的dtd