XML编程

一.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方法获取元素,如下:

时间: 2024-10-13 11:15:25

XML编程的相关文章

LINQ to XML 编程基础

1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: 隐藏行号 复制代码 ?创建 XML public static void CreateDocument() { string path = @"d:\website"; XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), new XEle

XML编程之语法规范

XML听起来很陌生,但是学习起来,感觉和HTML相比差不多,这是我对他最初的感觉,但是在学习的过程中我发现XML要比HTML强大的许多,甚至XML都可以当做一个小型的数据库来使用,XML并不是一门什么新的技术,已经出现很长的一段时间了,只是因为HTML的占有率过高,以及规范的不统一等诸多原因,我不知道其它的编程语言对XML的需要有多高,但是仅仅对于php来说,XML是很重要的,不仅仅如此,在学习AJAX的时候,因为XML作为数据传输的一种方式,这是必须要学习的,下面就是我对XML编程过程中的所有

【xml】xml编程

xml编程:利用java程序支增删改查(CRUD)XML中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了很多的解析api sun jaxp (比较弱)既有dom方式也有sax方式,并且这套解析api已经加入到j2se的规范中,意味这不需要导入任何第三方开发包就可以直接使用这种解析方式,但是这种解析方式效率低下 dom4j (比较强)可以使用dom方式高效的解析xml dom4j 导入开发包,通常只需要导入核心包就可以了,如果在使用的过程中提示少什么包到lib目录下在导

C++的XML编程经验――LIBXML2库使用指南[转]

C++的XML编程经验――LIBXML2库使用指南 写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML库,而且它同时支持多种编程语言:2)LIBXML2库的Tutorial写得不太好,尤其是编码转换的部分,不适用于中文编码的转换:3)网上的大多数关于Libxml2的介绍仅仅是翻译了自带的资料,没有详细介绍如何在windows平台下进行编程,更很少提到如何解决中文问题. 基于以上几点原因,决定写一个在

XML编程总结(七)——使用XPath对象查询xml文档

(七)使用XPath对象查询xml文档 XPath,一种为查询 XML 文档而设计的查询语言.XPath 并不是 Java 语言,事实上 XPath 不是一种完整的编程语言.有很多东西用 XPath 表达不出来,甚至有些查询也无法表达.幸运的是,可以把 XPath 结合到 Java 程序中,这样就能发挥两者的优势了:Java 做 Java 所擅长的,XPath 做 XPath 所擅长的.Java 程序执行 XPath 查询所需要的应用程序编程接口(API)还因形形色色的 XPath 引擎而各不相

XML编程总结(一)——目录

本系列文章对Java领域中常用的几种操作XML的编程方式进行归纳,归纳的知识属于基础范畴,概括的不全面.主要通过实例操作方法进行演示,原理部分的讲解甚少,如需请查阅详细文档资料.本文分为以下几个部分: (一)JAXP简介 (二)使用DOM接口操作xml (三)使用SAX接口操作xml (四)使用dom4j方式操作xml (五)使用StAX接口操作xml (六)使用JAXB进行java对象和xml格式之间的相互转换 (七)使用XPath对象查询xml文档 (一)JAXP简介 JAXP(Java A

C的xml编程-libxml2(转)

这里主要讲述libxml2在linux下的使用. (以下内容除了linux下的安装步骤是自己写的,其余均出自http://www.blogjava.net/wxb_nudt/archive/2007/11/28/161340.html,由于该篇文章讲解的非常详细,我也没必要重写一遍了.如果该篇文章早出些时候,早期开发我也不会走很多弯路了.虽然在该篇文章出现之前我已经对libxml2较熟悉了并开发完毕,但为了备忘,现在将该篇文章作为收藏之用.在此再次感谢这篇文章的大侠为大家整理了这篇文章^_^)

XML编程总结(五)——使用StAX接口操作xml

(五)使用StAX接口操作xml StAX,全称Streaming API for XML,一种全新的,基于流的JAVA XML解析标准类库.其最终版本于 2004 年 3 月发布,并成为了 JAXP 1.4(将包含在即将发布的 Java 6 中)的一部分.在某种程度上来说,StAX与SAX一样是基于XML事件的解析方式,它们都不会一次性加载整个XML文件.但是它们之间也有很大的不同. StAX和SAX的区别——拉式解析器和推式解析器的区别 虽然StAX与SAX一样基于XML事件解析,相比于DO

XML编程总结(三)——使用SAX接口操作xml

(三)使用SAX接口操作xml SAX解析器被称为SAXParser,SAXParser是由javax.xml.parsers.SAXParserFactory创建的.与DOM解析器不同,SAX解析器并不创建XML文档的内存表示,因此会占用更少的内存.SAX解析器通过调用回调方法(事件驱动)将XML文档结构通知客户端,也就是通过调用提供给SAXParser的org.xml.sax.helpers.DefaultHandler处理器内的方法. org.xml.sax.helpers.Default