XML基础XML概念

XML (EXtensible Markup Language)指可扩展标记语言,XML 被设计用来传输和存储数据。

没有任何行为的 XML

也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。

下面是 John 写给 George 的便签,存储为 XML:

George

John

Reminder

Don't forget the meeting!

上面的这条便签具有自我描述性。它拥有标题以及留言,同时包含了发送者和接受者的信息,XML 标签没有被预定义,需要自行定义标签。

这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

用途(作用)

XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享。

· XML 把数据从 HTML 分离

· XML 简化数据共享

· 简化数据传输

· 简化平台的变更

· 使您的数据更有用

语法(规则)所有 XML 元素都须有关闭标签标签对大小写敏感

XML 标签对大小写敏感。在 XML 中,标签 与标签 是不同的。

必须使用相同的大小写来编写打开标签和关闭标签:

这是错误的。

这是正确的。

XML 必须正确地嵌套

在 HTML 中,常会看到没有正确嵌套的元素,下述语句是错误的。

This text is bold and italic

在 XML 中,所有元素都必须彼此正确地嵌套:

This text is bold and italic

XML 文档必须有根元素

XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。

XML 的属性值须加引号

与 HTML 类似,XML 也可拥有属性(名称/值的对)。

在 XML 中,XML 的属性值须加引号。请研究下面的两个 XML 文档。第一个是错误的,第二个是正确的:

George

John

George

John

在第一个文档中的错误是,note 元素中的 date 属性没有加引号。

XML 中的注释

在 XML 中编写注释的语法与 HTML 的语法很相似:

XML树结构

XML 文档形成一种树结构

XML 文档必须包含根元素。该元素是所有其他元素的父元素。

XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

所有元素均可拥有子元素。

打开网易新闻 查看精彩图片

上图表示下面的 XML 中的一本书:

打开网易新闻 查看精彩图片

例子中的根元素是 。

文档中的所有 元素都被包含在 中。

元素有 4 个子元素:、< author>、、。

XML元素

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。

元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。

打开网易新闻 查看精彩图片

在上例中, 和 都拥有元素内容,因为它们包含了其他元素。 只有文本内容,因为它仅包含文本。

在上例中,只有 元素拥有属性 (category="CHILDREN")。

XML 属性

属性通常提供不属于数据组成部分的信息。在下面的例子中,文件类型与数据无关,但是对需要处理这个元素的软件来说却很重要:

computer.gif

元素与属性的选择和应用

下面的三个 XML 文档包含完全相同的信息:

方法一:使用 date 属性

George

John

Reminder

Don't forget the meeting!

方法二:使用了date 元素

08/08/2008

George

John

Reminder

Don't forget the meeting!

方法三:使用扩展的 date 元素

08

08

2008

George

John

Reminder

Don't forget the meeting!

形式良好的 XML 文档

"形式良好"或"结构良好"的 XML 文档拥有正确的语法。

"形式良好"(Well Formed)的 XML 文档会遵守前几章介绍过的 XML 语法规则:

· XML 文档必须有根元素

· XML 文档必须有关闭标签

· XML 标签对大小写敏感

· XML 元素必须被正确的嵌套

· XML 属性必须加引号

George

John

Reminder

Don't forget the meeting!

查看 XML 文件

通过右击浏览器,查看页面源代码的方式,查看XML文件。

打开网易新闻 查看精彩图片

XML实例1. 用XML表示中国部分省市数据

打开网易新闻 查看精彩图片

源码:

中国

黑龙江

哈尔滨

大庆

广东

广州

深圳

珠海

台湾

台北

高雄

新疆

乌鲁木齐

XML高级

所有 XML 文档中的文本均会被解析器解析。

只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。

1. PCDATA

PCDATA 指的是被解析的字符数据(Parsed Character Data)。

XML 解析器通常会解析 XML 文档中所有的文本。

当某个 XML 元素被解析时,其标签之间的文本也会被解析:

此文本也会被解析

解析器之所以这么做是因为 XML 元素可包含其他元素,就像这个例子中,其中的 元素包含着另外的两个元素(first 和 last):

BillGates

而解析器会把它分解为像这样的子元素:

Bill

Gates

CDATA

术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

在 XML 元素中,"<" 和 "&" 是非法的。

"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。

"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 "" 开始,由 "" 结束:

在上面的例子中,解析器会忽略 CDATA 部分中的所有内容。

PHP操作XML——DOMDocument1. 创建和解析XML

DOMDocument还是PHP5后推出的DOM扩展的一部分,可用来建立或解析html/xml,目前只支持utf-8编码。

1) 创建DOMDocument对象,加载xml文件(load)

打开网易新闻 查看精彩图片

2) 获取节点,返回DomNodeList对象

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

3) 根据索引获取节点元素,返回DomElement对象

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

4) 获取节点值

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

5) 遍历节点集合(DOMNodeList对象),获取节点值XML文档的解析

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

6) 获取节点属性

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

使用loadXML方法加载含有xml数据的字符串

打开网易新闻 查看精彩图片

服务器端返回XML1. 后台PHP程序,响应前端ajax请求,返回xml格式数据。

打开网易新闻 查看精彩图片

前端程序,发送ajax请求,获取数据,输出节点值

打开网易新闻 查看精彩图片

· 客户端接收到的数据是XMLDocument对象。

打开网易新闻 查看精彩图片

· 节点值

打开网易新闻 查看精彩图片

PHP操作XML——simpleXML

SimpleXML是PHP5后提供的一套简单易用的xml工具集,可以把xml转换成方便处理的对象,也可以组织生成xml数据。

1. 通过字符串构建XML对象

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

案例

从数据库中读取数据,在PHP中使用simpleXML构建XML格式数据,生成XML文件。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

生成的messages.xml文件内容

打开网易新闻 查看精彩图片

查看源代码

打开网易新闻 查看精彩图片

json与xml区别1. 可读性

JSON和的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。

可扩展性

XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。

编码难度

XML有丰富的,比如Dom4j、JDom等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON串,不过,xml文档要多很多结构上的字符。

解码难度

的解析方式有两种:

一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName("tagName"),但是这样是要在预先知道文档结构的情况下使用,无法进行通用的封装。

另外一种方法是遍历节点(document 以及 childNodes)。这个可以通过来实现,不过解析出来的数据仍旧是形式各异,往往也不能满足预先的要求。

凡是这样可扩展的结构数据解析起来一定都很困难。

JSON也同样如此。如果预先知道JSON结构的情况下,使用JSON进行数据传递简直是太美妙了,可以写出很实用美观可读性强的代码。如果你是纯粹的前台开发人员,一定会非常喜欢JSON。但是如果你是一个应用开发人员,就不是那么喜欢了,毕竟xml才是真正的结构化,用于进行数据传递。

而如果不知道JSON的结构而去解析JSON的话,那简直是噩梦。费时费力不说,代码也会变得冗余拖沓,得到的结果也不尽人意。但是这样也不影响众多前台开发人员选择JSON。因为json.js中的toJSONString()就可以看到JSON的字符串结构。当然不是使用这个字符串,这样仍旧是噩梦。常用JSON的人看到这个字符串之后,就对JSON的结构很明了了,就更容易的操作JSON。

以上是在Javascript中仅对于数据传递的xml与JSON的解析。在Javascript地盘内,JSON毕竟是主场作战,其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象,而且不知道其结构的话,我相信很多程序员也一样是哭着解析JSON的。

除了上述之外,JSON和XML还有另外一个很大的区别在于有效数据率。JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不像XML那样需要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力[2] 。

实例比较

XML和JSON都使用结构化方法来标记数据。

用XML表示中国部分省市数据如下:

打开网易新闻 查看精彩图片

用JSON表示:

打开网易新闻 查看精彩图片