XML编程

Posted a魏国

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML编程相关的知识,希望对你有一定的参考价值。

.XML基本概念

1.什么是xml

XMLeXtensible Markup Language,可扩展标记语言

 

标记语言

htmlxhtmlhtml5xml

不同点:xmlhtml系列

ü 目的不同,html用于显示,xml用于传输数据库

ü 内容不同,html有预定义好的标签,而xml没有,所有的都需要自己来定义。

 

可扩展

所谓可扩展,就是可以自己定义标签。如图:

 

实际上,在xml中,所有的标签都是需要自己来定义。

 

ü XML 指可扩展标记语言,是独立于软件和硬件的信息传输工具。

ü XML 是一种标记语言,很类似 HTML

ü XML 的设计宗旨是传输数据,而非显示数据

ü XML 标签没有被预定义。您需要自行定义标签。

ü XML 被设计为具有自我描述性。

ü XML W3C 的推荐标准。

 

2.xml的作用

 

主要是两大块:

 

数据存储

 

数据传输(交换)

 

 

 

 

 

存储方面:

ü 配置文件,如qqfeiq、迅雷

ü 小型数据库,对于一些不经常变化的数据(数据量不是很大),可以使用xml来保存

 

数据传输方面:

 

ü AjaxAsynchronous javascript and xml,异步的jsxml

 

ü Web serviceweb 服务 天气预报、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.文档声明

 

通常有两个属性:

ü versionxml的版本,目前是1.0

ü encoding:字符集编码,选择utf-8即可。

 

ü standalone:用来表示该文件是否呼叫其它外部的文件(DTDschema),取值范围:yes/no   yes:没有呼叫,默认yes

 

要注意的一个问题,就是编码的问题。

 

3.命名规则

由于所有的标签和属性都是自己来定义,意味着我们需要给他们命名。

 

ü 名称可以含字母、数字以及其他的字符

ü 名称不能以数字或者标点符号开始

ü 名称不能以字符xml”(或者 XMLXml)开始

ü 名称不能包含空格

ü 可使用任何名称,没有保留的字词。

 

☞ 注意事项

ü 避免 "-" 字符。如:"first-name",一些软件会认为你需要提取第一个单词。

ü 避免 "." 字符。如:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。

ü 避免 ":" 字符。冒号会被转换为命名空间来使用。

 

命名要见名知意,尽量简洁。book_title √,  the_title_of_the_book (x)

4.定义元素

xml中, 有三种节点:

ü 元素节点

ü 属性节点

ü 文本节点

 

元素,有时候称之为标签。类似xhtml中的标签。

 

5.定义属性

 

属性是依赖于某个元素而存在的,像寄生虫一样。

 

定义,一定是在元素的开始标签中进行定义的。

 

如图:

需要有一些注意的地方:

ü 一个元素可以有多个属性

ü 元素的属性不能重复

ü 所有的属性都应该用引号包含

ü 凡是属性都可以使用子元素的方式来表示。

 

 

格式: <元素名称> </元素名称>  <元素名称 /> 

所有的元素都是自己来定义的。

 

重点是元素的表现(构成)形式:

ü 仅包含元素的元素,如bookstore元素

ü 仅包含文本的元素,如authoryear等元素

ü 包含文本和元素的混合的元素,如title元素

 

 

 

需要有一些注意的地方:

ü 一个元素可以有多个属性

ü 元素的属性不能重复

ü 所有的属性都应该用引号包含

ü 凡是属性都可以使用子元素的方式来表示。

 

用属性来表示元素,有以下缺点:

ü 属性无法包含多重的值(元素可以)

ü 属性无法描述树结构(元素可以)

ü 属性不易扩展(为未来的变化)

ü 属性难以阅读和维护

ü 请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息

 

<file type="gif">computer.gif</file>

以数据库中的表为例:

user

id  username    passaword

1   jordan      23

2   beckham    7

3   jackson     99

 

在具体处理的时候,和业务逻辑相关的有usernamepassword,而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文档是否是合法的,通常有两种技术:

 

ü DTDDocument Type Definition,文档类型定义,目前使用最多的,简单

 

ü schema: XSD XML Schema Definition,文档结构定义,未来的趋势,功能强大

我们要学习的DTD

 

2.快速入门

 

对于xml的验证,需要用到DTD。此时,就产生了两个东西:dtdxml文档

 

(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或多个

ü ?,01

 

 

看一个案例,以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

DOMDocument Object Model,文档对象模型

如何理解呢?

 

ü DDocument,文档本身,包括xmlhtml文档

ü OObject,对象,对象有属性和方法,通过属性和方法就可以完成相应的一些操作

ü MModel,模型,这里的模型是指树模型。将文档中的元素、属性和文本转成树模型中的元素节点、属性节点和文本节点。每一个节点都是一个对象。

 

过程:xml文档---> 转成树模型 ---> 将其转换回来

 

WOMWorld Object Model,世界对象模型

 

DOM提供了一系列的API,通过它可以完成对xml/html的增删改查等操作。

 

ü DOMDocument Object Model,文档对象模型)定义了访问和操作文档的标准方法。

ü DOM是一个平台,一个中立于语言的应用程序编程接口 (API),允许程序访问并更改文档的内容、结构和样式。

ü DOM标准是由W3C World Wide Web Consortium)组织制定的。

 

2.DOM操作XML步骤

步骤,分为三大步:

具体完成,需要用到如下四个对象:

首当其冲是 DOMDocument对象

3.DOM操作原理解析

[需求]:将bookstore.xml文档中的内容以表格的形式输出到浏览器上,如图所示:

 

载入文档之后,可以使用getElementsByTagName方法获取元素,如下:

 

 

以上是关于XML编程的主要内容,如果未能解决你的问题,请参考以下文章

XML编程总结——目录

XML编程

Capl编程xml标签语法 —— CAN报文周期检测/错误帧检测/信号改变检测。。。

CANoe中XML编程常用标签语法 —— 变量,系统变量的定义和读取

以编程方式添加组件的样式与 XML 布局中的样式不同

Android如何以编程方式调整(缩放)xml矢量图标