1、 XML概述
1.1xml概念:xml本质上是一中数据存储的格式,可以在保存数据的同事保存数据之间的关系。Xml利用标签来保存数据的内容,利用标签之间的嵌套关系来保存数据之间的关系。
1.2xml运用场景
1.2.1数据传输:xml本质上是一段字符串,具有跨平台的特点,所有的开发语言、操作系统都支持,利用这样的特点可以用xml进行跨平台语言的数据传输。
1.2.2作为配置文件来使用:xml在保存数据内容的同时也可以保存数据之间的层级关系,利用这样的特点,xml常被用来作为配置文件使用。
1.3xml文件:将符合xml格式的数据写入到一个文件中去,那这样的文件就是一个xml文件,这样的文件通常都以.xml作为后缀名,请注意,不要将xml狭隘的理解成xml文件,xml除了文件形式还可以以其他的形式存在(内存中构建或网络中传输)。
1.4xml校验:浏览器除了内置html解析器外,还内置了xml解析器,利用这一点,我们可以使用浏览器对xml进行校验。如果xml符合规范,浏览器就可以正常打开,如果不符合规范则提示错误信息和错误行数。
2.xml语法
2.1文档声明:告诉解析器如何解析当前xml,是对当前xml一个声明,文档声明必须在xml的第一行出现,而且只能出现一次。一个不包含文档声明的xml成为格式不良好的xml,虽然很多的解析器都可以解析,但这是不符合规范的、有风险的,所以不建议这样做。
2.1.1<?xml version=”1.0“?>注意:所有的问好空格都必须是英文半角,version代表当前xml所遵循的规范,到目前为止都是1.0规范
2.1.2<?xml version="1.0" encoding="gb2312"?>encoding属性指定当前xml所使用的编码集,解析器将用该编码集去解码xml。xml文件如果保存使用的编码和encoding所指定的编码不同就会导致乱码问题,一定要注意。
2.1.3<?xml version="1.0" standalone="no"?>standalone属性声明当前文档是否是一个独立的文档,默认值为yes,如果该文档要依存于其他文档存在,则应该将此属性设置为no。很多的解析引擎并不会真的参考这个属性,但是标准就是标准,我们要按标准学习
2.2元素
一个标签就是一个xml元素。
2.2.1标签可以分文开始标签和结束标签,在开始标签和结束标签之间的文本称为标签体,如果一个标签既不包含标签体也不包含其他元素,可以将开始标签和结束标签进行合并,这样的标签就叫做自闭标签。
例子:<a>我是标签体</a> <a/>
2.2.2标签可以嵌套子标签,注意所有的嵌套都必须是合理嵌套。
2.2.3格式良好的xml必须包含且只能包含一个根标签。
2.2.4xml元素的命名规范:
区分大小写,例如,<P>和<p>是两个不同的标记。
不能以数字或"_" (下划线)开头。
不能以xml(或XML、或Xml 等)开头。
不能包含空格。
名称中间不能包含冒号(:)。
2.3属性
2.3.1一个xml元素可以包含多个属性,一个属性分为属性名和属性值,其中属性值应该用双引号或单引号给引起来。
2.3.2其实一个元素的属性可以转化为该元素的子标签,在表示的内容上是同效的。
例子<chinacaptital="beijing"/>
--->
<china>
<capital>
beijing
</capital>
</china>
2.3.3属性也要遵循和元素相同的命名规范。
2.4注释
<!--注释内容-->
2.4.1注视不能出现在文档声明之前。
2.4.2注视不能再嵌套注释
2.5CDATA区: 被CDATA区包含的内容将不会被解析器解析,而会当作文本来处理。
<![CDATA[
转义的内容
]]>
2.6转义字符
转义字符用来转义xml中特殊字符。
&--》 &
<--》<
>--》>
" --》"
' --》'
注意:CDATA区用来转义一段内容,转义字符只能用来转义单个字符。CDATA转义是通过通知处理器不要去解析其中的内容来实现的,本质传输的还是那个特殊字符。转义字符是将特殊字符用其他字符进行了替代,解析在看到转以后的字符后会用特殊字符去展现,其实他背后传输的是转义后的字符。
2.7处理指令
用来通知解析器以何种方式去解析xml
<?xml-stylesheettype="text/css" href="1.css" ?>
其实文档声明也是一种特殊的处理指令
多学一点:其实xml最初出现的目的就是替代html做网页用的,结果这个家伙太复杂了,对于做前台的开发的美工小mm们太过复杂,所以一直没推行开,反倒是做为配置文件和传输数据的时候用的多一点。
3.xml的约束技术
xml约束技术就是可以提供一个文档用来约束一个xml文档的写法。
市面上最常见的两种xml约束技术是DTD SChema,这两个技术都是标准,都由w3c组织负责发布。
3.1DTD
3.1.1如何在xml中引入DTD
(1)外部引入:dtd约束写在外部文件中,然后在xml中进行引入
<1>本地硬盘中的dtd文件的引入
<!DOCTYPE根元素的名称 SYSTEM"dtd文件路径">
例如:<!DOCTYPE 书架 SYSTEM “book.dtd”>
<2>引入公共位置上的dtd
<!DOCTYPE根元素的名称 PUBLIC"DTD名称""DTD所在的URL">
例如:<!DOCTYPE web-app PUBLIC
"-//SunMicrosystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
(2)内部引入:dtd约束直接卸载xml文件中
例子:
<!DOCTYPE书架 [
<!ELEMENT书架 (书+)>
<!ELEMENT书 (书名,作者,售价)>
<!ELEMENT书名(#PCDATA)>
<!ELEMENT作者(#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
3.1.2如何约束xml元素
<!ELEMENT元素名称 元素约束>
元素约束:
(1)元素内容:元素内容必须用小括号引起来
<!ELEMENT书架 (.....)>
“,”: 如果括号内的内容用逗号进行分割的话,表明其中的内容必须按顺序出现。
“|”: 如果括号内的内容用竖线进行分割的话,表明其中的内容只能出现其中之一。
#PCDATA:表明该元素中只能写标签体
+:一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)
利用括号还可以进行组操作,形成更复杂的元素约束
例子: <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
(2)存放类型
EMPTY:表明当前元素不能再包含其他元素了
ANY:表明当前元素可以包含任意元素
3.1.3如何约束xml属性
<!ATTLIST元素名
属性名1 属性类型属性约束
属性名2 属性类型属性约束
……
>
(1)属性约束
#REQUIRED表明该属性是一个必须存在的属性
#IMPLIED表明该属性是一个可选的属性
#FIXED"固定值" 表明该属性必须取给定的固定值,如果强行设定成其他值dtd校验不通过,如果不给值解析器会默认将加上该属性,并设定为给定的值
"默认值" 如果该该属性没有指定,则取默认值,如果指定成其他则用指定的值
(2)属性类型
CDATA:表示属性值为普通文本字符串。
ENUMERATED枚举,属性的值只能取给定的值中的一个
例子: 类型 (科技|文学|教育) #REQUIRED
ID:表明此属性是一个标志性的属性,在整个xml文档中该属性的值不能重复出现。注意:ID的值不能以数字开头,不能出现空白字符
例子:书号 ID #REQUIRED
3.1.4ENTITY(实体)
实体:就是对一段内容的引用
实体分为引用实体和参数实体
(1)引用实体:这段引用是被用在xml文件中的
<!ENTITY实体名称 "实体内容">
引用的方式: &实体名称;
例子:<!ENTITY网址 "www.itheima.cn">
<书 类型="科技" 书号="a111" 网址="&网址;">
(2)参数实体 用在DTD中的实体
<!ENTITY % 实体名称 "实体内容" >
引用参数实体:%实体名称;