一.XML基本概念
1.什么是xml
XML:eXtensible Markup Language,可扩展标记语言
标记语言
Html,xhtml,html5,xml
不同点:xml和html系列
ü 目的不同,html用于显示,xml用于传输数据库
ü 内容不同,html有预定义好的标签,而xml没有,所有的都需要自己来定义。
可扩展
所谓可扩展,就是可以自己定义标签。如图:
实际上,在xml中,所有的标签都是需要自己来定义。
ü XML 指可扩展标记语言,是独立于软件和硬件的信息传输工具。
ü XML 是一种标记语言,很类似 HTML。
ü XML 的设计宗旨是传输数据,而非显示数据
ü XML 标签没有被预定义。您需要自行定义标签。
ü XML 被设计为具有自我描述性。
ü XML 是 W3C 的推荐标准。
2.xml的作用
主要是两大块:
数据存储
数据传输(交换)
存储方面:
ü 配置文件,如qq、feiq、迅雷
ü 小型数据库,对于一些不经常变化的数据(数据量不是很大),可以使用xml来保存
数据传输方面:
ü Ajax:Asynchronous JavaScript and xml,异步的js和xml
ü Web service:web 服务 天气预报、ip查询、电话号码归属地查询,机票查询
新的应用:svg
Svg:可伸缩的矢量图形
伴随着H5(移动端)而生的。
重点还是在传输方面。尤其是web service。
二.XML结构
整体层面了解xml的结构
首先,看一个简单的demo
它其实是一个树模型,如图:
ü 第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码(UTF-8)
ü XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”
ü XML 文档必须包含根元素。该元素是所有其他元素的父元素。(有且仅有一个)
ü XML 文档中包含三种节点:元素、属性和文本
三.XML语法
学习理念:通过已经掌握的知识,来学习新的知识,效率最高。
在学习xml的时候,和xhtml做一个对比,就会非常简单。
不妨回忆一下xhtml的语法规范,有哪些?
ü 所有的标签都需要关闭。双标签<div></div> 单标签 <br />
ü 标签是可以嵌套的,但是不能交叉(骑跨),<div><p></p></div> √<div><p></div></p> ×
ü 所有的属性都应该加引号(单双均可)
ü 所有的属性都应该有值,如果没有值,就是要属性本身作为它的值,checked=‘checked‘
ü 所有的标签和属性都要小写。
1.语法总则
ü 它必须以 XML 声明开头
ü 它必须拥有唯一的根元素
ü 开始标签必须与结束标签相匹配
ü 元素对大小写敏感(区分大小写)
ü 所有的元素都必须关闭
ü 所有的元素都必须正确地嵌套
ü 必须对特殊字符使用实体
2.文档声明
通常有两个属性:
ü version:xml的版本,目前是1.0
ü encoding:字符集编码,选择utf-8即可。
ü standalone:用来表示该文件是否呼叫其它外部的文件(DTD或schema),取值范围:yes/no yes:没有呼叫,默认yes
要注意的一个问题,就是编码的问题。
3.命名规则
由于所有的标签和属性都是自己来定义,意味着我们需要给他们命名。
ü 名称可以含字母、数字以及其他的字符
ü 名称不能以数字或者标点符号开始
ü 名称不能以字符 “xml”(或者 XML、Xml)开始
ü 名称不能包含空格
ü 可使用任何名称,没有保留的字词。
? 注意事项
ü 避免 "-" 字符。如:"first-name",一些软件会认为你需要提取第一个单词。
ü 避免 "." 字符。如:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。
ü 避免 ":" 字符。冒号会被转换为命名空间来使用。
命名要见名知意,尽量简洁。book_title √, the_title_of_the_book (x)
4.定义元素
在xml中, 有三种节点:
ü 元素节点
ü 属性节点
ü 文本节点
元素,有时候称之为标签。类似xhtml中的标签。
5.定义属性
属性是依赖于某个元素而存在的,像寄生虫一样。
定义,一定是在元素的开始标签中进行定义的。
如图:
需要有一些注意的地方:
ü 一个元素可以有多个属性
ü 元素的属性不能重复
ü 所有的属性都应该用引号包含
ü 凡是属性都可以使用子元素的方式来表示。
格式: <元素名称> </元素名称> <元素名称 />
所有的元素都是自己来定义的。
重点是元素的表现(构成)形式:
ü 仅包含元素的元素,如bookstore元素
ü 仅包含文本的元素,如author和year等元素
ü 包含文本和元素的混合的元素,如title元素
需要有一些注意的地方:
ü 一个元素可以有多个属性
ü 元素的属性不能重复
ü 所有的属性都应该用引号包含
ü 凡是属性都可以使用子元素的方式来表示。
用属性来表示元素,有以下缺点:
ü 属性无法包含多重的值(元素可以)
ü 属性无法描述树结构(元素可以)
ü 属性不易扩展(为未来的变化)
ü 属性难以阅读和维护
ü 请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。
<file type="gif">computer.gif</file>
以数据库中的表为例:
user表
id username passaword
1 jordan 23
2 beckham 7
3 jackson 99
在具体处理的时候,和业务逻辑相关的有username和password,而id则和业务逻辑无关的。
和表做一个对比。
最后总结一下:在定义xml的时候,98%的都是元素,只有2%左右的才是属性。
6.实体引用
文本节点并不是用标签来表示,就是元素中的内容。
在书写内容的时候,对一些特殊的字符需要做一个引用处理 -- 实体引用。
看看xhtml中的实体引用
< : <
空格:
版权部分:?
在xml中,有5个预定义的实体,如下:
假如有一大段的内容,其中都有特殊的符号,怎么办?
可以使用CDATA节来处理。
书写的时候,需要注意:遵守写法,不要脱节。
? 注意事项
ü CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束。
ü CDATA 部分中的所有内容都会被解析器忽略。
ü CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。
ü 标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。
7.注释
和xhtml一样。
注意点:
ü 一定要放在文档声明之后
ü 不要嵌套
8.练习
编写xml文档,将如下所示user数据用XML方式来保存
练习说明:
四.DTD验证
Xml的作用是什么?
最主要的作用 传输或交换数据
Xml的内容是什么?
由于没有预定义标签,所以可以随便写。
甲方 ----> 乙方
乙方 ----> 甲方
如果是随便写的,没有一个规范,那么就会出现你传过来的数据不是我所需要的。
寄信
1.什么是Xml验证
在实际需求中,通常要求交换(传输的)xml,是符号某种固定格式(规范)。
所以说,我们需要有一种机制能够验证xml文档是否是符号规范的。
两个:
ü 格式良好的xml文档:语法正确。
ü 合法的xml文档:在语法正确的基础上, 然后符合某种规范。
请问:
格式良好的xml文档是否是合法的xml,不一定
合法的xml是否是格式良好的,一定
验证xml文档是否是合法的,通常有两种技术:
ü DTD:Document Type Definition,文档类型定义,目前使用最多的,简单
ü schema: XSD XML Schema Definition,文档结构定义,未来的趋势,功能强大
我们要学习的DTD。
2.快速入门
对于xml的验证,需要用到DTD。此时,就产生了两个东西:dtd和xml文档
(1).先编写一个xml文档
(2).再定义一个dtd
Dtd可以直接在xml中来定义,也可以单独定义,然后引入。
此处,采取直接在文档中定义,如下:
3).使用工具来验证xml文档是否符合dtd的定义
工具有很多:
ü 专业软件 iexmltls (只针对IE浏览器)
ü 代码校验 (只针对IE浏览器)
ü 在线验证(http://validator.w3.org/)
ü xml编辑器--spyxml(推荐)
在线验证
用spyxml工具(推荐)
3.DTD作用
回头再看一下的DTD的作用,或者说可以通过DTD来干什么?
ü 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
ü 而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
ü 您还可以使用 DTD 来验证您自身的数据。
? 注意事项
ü DTD描述了XML文档有哪些节点、节点之间的关系以及节点的值等。(学习重点)
ü DTD验证的不是语法,而是验证XML文档中应该有哪些节点,节点之间的关系是什么,元素的值、属性的值应该由什么内容组成。
ü XML没有DTD,可以正常工作,但不能很好的工作。
ü 合法的 XML 文档是“形式良好”的 XML 文档,且遵守文档类型定义 (DTD) 的语法规则。
在我们的xml中,有三种节点,分别是否元素节点、属性节点以及文本节点。
4.元素定义
格式:<!ELEMENT 元素名 元素内容模型>
重点是元素内容模型
回顾一下元素的表现形式(构成):
ü 仅包含元素的元素
ü 仅包含文本的元素
ü 包含元素和文本混合的元素
还有两种特殊:
ü 空元素
ü 任意元素
意味着要处理五种情况
在定义元素的时候,需要用到的符号,如下:
还有两种特殊:
ü 空元素
ü 任意元素
意味着要处理五种情况
在定义元素的时候,需要用到的符号,如下:
(1).仅包含文本的元素
说白了,就是该元素中只有纯文本。没有其他内容(元素)。
使用 (#PCDATA)
Parse Character data,可解析的字符串数据
如果声明了pcdata,则不能再出现任何的元素了。
(2).仅包含元素的元素
比较单一,通常有两种结构:
ü 顺序结构,使用() 和 ,
ü 选择结构,使用() 和 |
A.顺序结构
使用 逗号
在声明的内容中,所有的元素都必须出现一次,且按照声明的顺序依次出现。
不能出现多次,也不能不出现。
B.选择结构
使用 |
对于选择结构,二者必须出现其中的一个,不能同时出现两个,也不允许都不出现。
如果要想出现多次,该如何实现呢?
此时,应该使用数量词,和正则的数量词一模一样。
ü *,表示任意个,包括0
ü +,表示1或多个
ü ?,0或1个
看一个案例,以user.xml为例
(3).包含元素和文本混合的元素
情况比较复杂,需要多加注意。如下:
此时,应该结合 仅包含文本 和 仅包含元素的 两种情况。
请看分解动作
可以这么看:
一共重复了三次,所以会使用数量词
单就每一次而言,会有两种情况,要么是仅包含文本的,要么就是仅包含元素的,实际上是 或的关系,所以会使用 |。
所以,可以声明如下:
有一些注意点:
ü 必须以#PCDATA打头
ü 数量词只能使用*,不能使用+或?
(4).空元素
使用EMPTY关键字来声明,没有小括号。
最好的方式是使用单标签,如下:
5).任意元素
使用ANY关键字来声明,不需要小括号。
一般不会使用any,因为一旦使用了any,就可以随意的包含任何内容,也就是失去了约束的作用。和DTD的初衷是相违背的。
5.属性定义
属性是依赖于元素而存在的。
思考,如果需要定义属性,需要知道哪些东西?
属性是属于哪个元素的?
属性的名字是什么?
属性的值是什么类型的?
属性的取值方式是怎样的?
属性定义格式:<!ATTLIST 元素名 属性名 属性值类型 取值方式>
重点是后面两个
属性值类型有哪些?
取值方式有哪些?
例子:
取值方式
#REQUIRED ,说明该属性是必须要加上的
#IMPLIED,说明该属性是可有可无的
#FIXED value,说明该属性的固定值是value,如果你写了,只能写这个值,如果没有写,就是这个值。
默认值,直接写值,如果添加了属性,就以添加的为准,会覆盖掉,如果没有添加属性,则就是默认值。
如果一个元素有多个属性,可以一次声明,如下:
? 注意事项
ü 在声明属性时,必须要声明属性的取值方式,如果属性没有默认值,也没有固定值,也不是必须值,那么必须将其声明为隐含值(IMPLIED)。
ü 属性值可使用枚举类型,使用 | 即可,如<!ATTLIST phone kind (home | work | cell | fax) #IMPLIED>
ü 我们可以在一个ATTLIST语句中声明多个属性。
6.实体定义
在文本节点,有时候需要重复的书写某个内容,我们可以将其定义为实体。
Xml预定义五个实体:
ü <
ü >
ü ‘
ü “”
ü &
如果需要使用其他实体,则需要自己来定义。
在xml中,有两种实体:
ü 一般实体
ü 参数实体
(1).一般实体
在DTD中定义,然后在xml中引用的实体,就是一般实体。
定义格式:<!ENTITY 实体名 值>
引用格式:&实体名;
使用范围:在内部DTD中和外部DTD中都可以定义,然后在xml中使用。
案例:
内部方式定义并引用
实体定义之后,没有引用也是可以的。
外部定义并引用
在xml中引用,
(2).参数实体
在DTD中定义,然后仍然在DTD中引用的实体,就是参数实体。
定义格式:<!ENTITY % 实体名 值>
引用格式:%实体名;
使用范围:只能是针对外部DTD的方式,也就是需要一外部的方式独立的定义DTD,然后在DTD中直接引用参数实体。
看案例:
对应xml中引用如下:
如果别人定义好了DTD,能够看懂。
新的学习理念:在学习完新的知识后,再回头看以前的知识,会有新的发现。
看一个小小的应用
DTD,我们并不陌生,只要写HTML,都有DTD的影子。
如果我们来定义xhtml的一些元素,看是否能够定义出来。
Html,<!ELEMENT html (head,body)>
Ul,<!ELEMENT ul (li+)>
结论:xhtml其实一种特殊的XML文档。
很多人没有遵循xhtml的规范,也没有问题,为何?
因为它使用的是传统的过渡型的xhtml,所以兼容与老的html的写法。
7.留两个练习(参考PPT):
(1).给定DTD,编写对应的xml文档,并进行验证
对应的xml文档如下:
Dtd如下:
(2).对给定的xml文档,编写对应DTD。
使用外部DTD的方式,
Xml文档如下:
对应的dtd定义如下:
五.DOM方式操作XML
为什么要操作xml?
Xml 的作用:保存数据、交换数据。
由于xml在浏览器中直接显示的效果是非常难看的。所以实际上,不会直接在浏览器中显示,而是先经过一系列的处理,然后是以html的方式显示在页面中。
关于操作xml的方式十分的多,
1.什么是DOM
1.什么是DOM
DOM:Document Object Model,文档对象模型
如何理解呢?
ü D:Document,文档本身,包括xml和html文档
ü O:Object,对象,对象有属性和方法,通过属性和方法就可以完成相应的一些操作
ü M:Model,模型,这里的模型是指树模型。将文档中的元素、属性和文本转成树模型中的元素节点、属性节点和文本节点。每一个节点都是一个对象。
过程:xml文档---> 转成树模型 ---> 将其转换回来
WOM:World Object Model,世界对象模型
DOM提供了一系列的API,通过它可以完成对xml/html的增删改查等操作。
ü DOM(Document Object Model,文档对象模型)定义了访问和操作文档的标准方法。
ü DOM是一个平台,一个中立于语言的应用程序编程接口 (API),允许程序访问并更改文档的内容、结构和样式。
ü DOM标准是由W3C (World Wide Web Consortium)组织制定的。
2.DOM操作XML步骤
步骤,分为三大步:
具体完成,需要用到如下四个对象:
首当其冲是 DOMDocument对象
3.DOM操作原理解析
[需求]:将bookstore.xml文档中的内容以表格的形式输出到浏览器上,如图所示:
载入文档之后,可以使用getElementsByTagName方法获取元素,如下: