概述
XML(eXtensible Markup Language)全称可扩展标记语言。XML是跨平台的,这也是它为什么被广泛应用的原因。XML主要被用存储数据,系统配置和数据交换。
语法
1、 文档声明:只能位于xml的第一行,前面不能有空行或者注释。
<?xml version="1.0" encoding="UTF-8" standalone="yes/no"?>
version用来声明xml的版本,encoding指定xml的编码方式,standalone表示该xml文档是否依赖其他文件运行。
在使用记事本或eclipse编写xml时,会出现乱码的问题,都是与xml的编码格式以及本地的编码有关。要注意。
2、 元素:是xml文件中出现的标签。由开始和结束标签组成。如果一个元素没有内容可以使用简写。整个xml文档中只能有一个根标签,另外标签不能交叉使用。
<root> 有且只有一个根标签
<a>xxxx</a> 一个普通标签
<a/> 没有内容的标签的简写
<b><c></b></c> 错误的写法
</root>
3、属性:使用“”或”括起来
<a name='xx' id='1'></a>
4、注释:xml声明之前不能有注释嵌套,注释不能嵌套使用。
<!-- 注释内容 -->
<!-- <!-- --> --> 错误的写法
5、CDATA区:xml不会进行语法处理,只会原样输出。
<![CDATA[
something...
]]>
6、转译字符:显示一些特殊字符。比如在标签中显示大于号>, 小于号<之类的。
> 表示 > 符号。< 表示 < 符号。
7、处理指令:简称PI,用来指挥解析器如何解析xml文档。
xml文档中引入xx.css
<?xml version="1.0" encoding="gb2312" standalone="yes" ?>
<?xml-stylesheet type="text/css" href="xx.css" ?>
<root>
<cat id='cat1'>cat1</cat1>
</root>
xx.css文档
#cat1{
color: red;
text-font: 30px;
}
在解析xml文档时,就会按照css文件中的设置来显示字体。
约束
就是编写一个xml文档来约束另一个xml的书写规范。又叫文档约束。
常用的约束有DTD约束和Schema约束。
1、DTD约束:
Document Type Definition,全称文档类型定义。DTD约束的文档的后缀名为.dtd。
DTD约束可以写在一个单独的文件中,也可以写在xml文件中。写在xml文件中的格式:
<!DOCTYPE 根节点 [ 约束内容 ]>
在xml文件中引入dtd文件又分为两种,引入本地文件和引入公共文件。
引入本地文件的格式:
<!DOCTYPE 根节点 SYSTEM "xx.dtd">
引入公共文件的格式:
<!DOCTYPE 根节点 PUBLIC "DTD名称" "DTD的URL">
(1)定义元素:使用ELEMENT声明一个元素。
<!ELEMENT 元素名称 元素类型>
元素类型可以是元素内容或类型。如果为元素类型那么得使用()括起来。
<!ELEMENT 书 (书名,作者,售价)> 都得出现,并且出现的顺序不能有误
<!ELEMENT 书 (书名|作者|售价)> 出现一个就行
<!ELEMENT 书名 (#PCDATA)> 字符串类型
元素内容:, 符号,|符号,+、?、*符号。
元素类型:EMPTY(定义空元素),ANY(任意类型)
(2)定义属性:要使用ATTLIST声明属性。
格式:
<!ATTLIST 元素名
属性名1 属性值类型 设置声明
....
>
属性值类型:CDATA(字符串),ENUMERATED(枚举), ID(唯一的), ENTITY(实体)。ID属性是不能以数字开头的,只能以字母或下划线开始。
设置声明:#REQUIRED(必须的), #IMPLIED(可选的), #FIXD(固定值), 还有一个默认值。一般对于FIXD和默认值,在写xml时,可写可不写。
默认值声明
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
XML:
<square width="100" />
REQUIRED声明
DTD:
<!ATTLIST person number CDATA #REQUIRED>
正确的 XML:
<person number="5677" />
错误的 XML:
<person />
属性可选的
DTD:
<!ATTLIST payment type (check|cash) "cash">
XML :
<payment type="check" />
或
<payment type="cash" />
(3)定义实体:给一段内容创建别名,以后再使用这段内容的时候就可以直接使用别名。使用ENTITY声明一个实体。
分类:引用实体和参数实体。
引用实体:主要被用于xml引用。
格式:<!ENTITY 实体名称 "实体内容">
引用:&实体名称
DTD 实例:
<!ENTITY writer SYSTEM "xxxx">
XML :
<author>&writer;</author>
参数实体:主要在dtd内部引用。
格式:<!ENTITY % 实体名称 "实体代码">
引用:%实体名称
2、Schema约束:
在使用DTD约束时,可以感觉到DTD约束的不够细致。比如在属性类型的设置中就没有数字类型的。所以为了弥补DTD约束的不足,Schema约束就诞生了。Schema约束符合XML语法结构,所以可以使用dom,sax解析Schema。另外Schema对命名空间支持较好(独有特点),但是不能定义实体(DTD的)。
Schema约束文件的后缀名为.xsd,这份约束文档又称为模式文档(根节点必须为Schema),根据这份约束文档写出的xml文档叫实例文档。
<?xml version="1.0"?>
<xs:schema>
...
...
</xs:schema>
在写Schema约束时,要将模式文档中的所有元素绑定到一个uri地址(名称空间)上,以后就直接调用uri。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.xxx.com"
xmlns="http://www.xxx.com"
elementFormDefault="qualified">
...
...
</xs:schema>
xmlns="xxx"
xmlns说明了默认的命名空间是什么。
targetNamespace="http://www.xxx.com"
targetNamespace表示将当前Schema中的元素绑定到哪个命名空间。
xmlns:xs="http://www.w3.org/2001/XMLSchema"
显示了当前Schema中用到的元素来自”http://www.w3.org/2001/XMLSchema“这个命名空间,以后再使用这个空间的东西时要加上前缀xs。
elementFormDefault="qualified"
说明以后再使用这个命名空间中的元素时,必须加上命名空间的名字。
在xml中引入schema约束
<?xml version="1.0"?>
<note xmlns="http://www.xxx.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.xxx.com xxx.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
xmlns="http://www.xxx.com"
表示当前使用的命名空间是什么。
xsi:schemaLocation="http://www.xxx.com xxx.xsd"
表示具体使用命名空间中的哪个约束。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
指出schemaLocation命名空间的指向。
具体的教程可以看schema帮助文档或者去菜鸟。
XML解析
现在的主要解析方式有两种:dom解析和sax解析。
dom解析又可以分为jaxp解析,jdom解析和dom4j解析。解析效率从左到右依次增高,所以目前最常使用的是dom4j解析。但是jaxp是sun公司的,所以也有必要学习。
dom在解析xml文件时,会读取xml文件,将整个xml加载成一个dom树放进内存中。sax在解析xml文件时,是一行一行读取解析的,所以sax就只适合读取xml文件,不适合对xml文件删除、修改、增加的操作。但是dom解析时占用的内存会比sax的多。
各个解析的具体过程写到另外的文章中。