您的位置 首页 php

「原创」PHP实战-XML详细教程

XML基础

XML概念

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

没有任何行为的 XML

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

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

<note>

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don’t forget the meeting!</body>

</note>

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

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

用途(作用)

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

&middot; XML 把数据从 HTML 分离

&middot; XML 简化数据共享

&middot; 简化数据传输

&middot; 简化平台的变更

&middot; 使您的数据更有用

语法(规则)

所有 XML 元素都须有关闭标签

标签对大小写敏感

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

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

< message >这是错误的。</message>

<message>这是正确的。</message>

XML 必须正确地嵌套

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

<b><i>This text is bold and italic</b></i>

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

<b><i>This text is bold and italic</i></b>

XML 文档必须有根元素

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

<root>

<child>

<subchild>…..</subchild>

</child>

</root>

XML 的属性值须加引号

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

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

<note date=08/08/2008>

<to>George</to>

<from>John</from>

</note>

<note date=”08/08/2008″>

<to>George</to>

<from>John</from>

</note>

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

XML 中的注释

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

<!– This is a comment –>

XML树结构

XML 文档形成一种树结构

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

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

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

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

例子中的根元素是 <bookstore>。

文档中的所有 <book> 元素都被包含在 <bookstore> 中。

<book> 元素有 4 个子元素:<title>、< author>、<year>、<price>。

XML元素

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

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

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

在上例中,只有 <book> 元素拥有属性 (category=”CHILDREN”)。

XML 属性

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

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

元素与属性的选择和应用

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

方法一:使用 date 属性

<note date=”08/08/2008″>

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don’t forget the meeting!</body>

</note>

方法二:使用了date 元素

<note>

<date>08/08/2008</date>

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don’t forget the meeting!</body>

</note>

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

<note>

<date>

<day>08</day>

<month>08</month>

<year>2008</year>

</date>

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don’t forget the meeting!</body>

</note>

形式良好的 XML 文档

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

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

&middot; XML 文档必须有根元素

&middot; XML 文档必须有关闭标签

&middot; XML 标签对大小写敏感

&middot; XML 元素必须被正确的嵌套

&middot; XML 属性必须加引号

<?xml version=”1.0″ encoding=”UTF-8″ ?>

<note>

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don’t forget the meeting!</body>

</note>

查看 XML 文件

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

XML实例

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

源码:

<?xml version=”1.0″ encoding=”utf-8″?>

<country>

<name>中国</name>

<province>

<name>黑龙江</name>

<cities>

<city>哈尔滨</city>

<city>大庆</city>

</cities>

</province>

<province>

<name>广东</name>

<cities>

<city>广州</city>

<city>深圳</city>

<city> 珠海 </city>

</cities>

</province>

<province>

<name>台湾</name>

<cities>

<city>台北</city>

<city>高雄</city>

</cities>

</province>

<province>

<name>新疆</name>

<cities>

<city>乌鲁木齐</city>

</cities>

</province>

</country>

XML高级

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

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

1. PCDATA

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

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

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

<message>此文本也会被解析</message>

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

<name><first>Bill</first><last>Gates</last></name>

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

<name>

<first>Bill</first>

<last>Gates</last>

</name>

CDATA

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

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

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

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

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

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

CDATA 部分由 “<![CDATA[” 开始,由 “]]>” 结束:

<script>

<![CDATA[

function matchwo(a,b)

{

if (a < b && a < 0) then

{

return 1;

}

else

{

return 0;

}

}

]]>

</script>

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

PHP操作XML&mdash;&mdash;DOMDocument

1. 创建和解析XML

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

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

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

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

4) 获取节点值

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

6) 获取节点属性

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

服务器端返回XML

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

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

&middot; 客户端接收到的数据是XMLDocument对象。

&middot; 节点值

PHP操作XML&mdash;&mdash;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表示:

文章来源:智云一二三科技

文章标题:「原创」PHP实战-XML详细教程

文章地址:https://www.zhihuclub.com/76500.shtml

关于作者: 智云科技

热门文章

网站地图