XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。首先有两点是需要肯定的: 第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会; 第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高。不要害怕和逃避,毕竟我们还年轻。 本文共分五大部分。分别是XML快速入门,XML的概念,XML的术语,XML的实现,XML的实例分析。最后附录介绍了XML的相关资源。作者站在普通网页设计人员的角度,用平实生动的语言,向您讲述XML的方方面面,帮助你拨开XML的神秘面纱,快速步入XML的新领域。 • 第一章:XML快速入门 • 一. 什么是XML? • 二. XML是新概念吗? • 三. 使用XML有什么好处? • 四. XML很难学吗? • 五. XML和HTML的区别 • 六. XML的严格格式 • 七. 关于XML的更多 • 第二章:XML概念 • 一. 扩展性 • 二. 标识 • 三. 语言 • 四. 结构化 • 五. Meta数据 • 六. 显示 • 七. DOM • 第三章:XML的术语 • 导言 • 一.XML文档的有关术语 • 二.DTD的有关术语 • 第四章:XML的语法 • 一.XML语法规则 • 二.元素的语法 • 三.注释的语法 • 四.CDATA的语法 • 五.Namespaces的语法 • 六.entity的语法 • 七.DTD的语法 • 第五章:XML实例解释 • 一.定义新标识 • 二.建立XML文档 • 三.建立相应的HTML文件 • 第六章:XML相关资源 五. XML和HTML的区别 XML和HTML都来自于SGML,它们都含有标记,有着相似的语法,HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如< H1>表示首行标题,有固定的尺寸。相对的,XML则没有固定的标记,XML不能描述网页具体的外观,内容,它只是描述内容的数据形式和结构。 这是一个质的区别:网页将数据和显示混在一起,而XML则将数据和显示分开来。 我们看上面的例子,在myfile.htm中,我们只关心页面的显示方式,我们可以设计不同的界面,用不同的方式来排版页面,但数据是储存在myfile.xml中,不需要任何改变。 (如果你是程序员,你会惊讶的发现,这与模块化面向对象编程的思想极其相似!其实网页何尝不是一种程序呢?) 正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的数据处理方法,将使网络跨越到一个新的境界。 六. XML的严格格式 吸取HTML松散格式带来的经验教训,XML一开始就坚持实行"良好的格式"。 我们先看HTML的一些语句,这些语句在HTML中随处可见: 1. sample 2.< b>< i>sample< /b>< /i> 3.< td>sample< /TD> 4.< font color=red>samplar< /font> 在XML文档中,上述几种语句的语法都是错误的。因为: 1.所有的标记都必须要有一个相应的结束标记; 2.所有的XML标记都必须合理嵌套; 3.所有XML标记都区分大小写; 4.所有标记的属性必须用""括起来; 所以上列语句在XML中正确的写法是 1. sample 2.< b>< i>sample< /i>< /b> 3.< td>sample< /td> 4.< font color="red">samplar< /font> 另外,XML标记必须遵循下面的命名规则: 1.名字中可以包含字母、数字以及其它字母; 2.名字不能以数字或"_" (下划线) 开头; 3.名字不能以字母 xml (或 XML 或 Xml ..) 开头; 4.名字中不能包含空格。 在XML文档中任何的差错,都会得到同一个结果:网页不能被显示。各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都会被报告。你可以将上面的myfile.xml修改一下,比如将< email>改为< Email>,然后用IE5直接打开myfile.xml,会得到一个出错信息页面: <?xml version="1.0" encoding="GB2312"?> <myfile> <title>XML轻松学习手册</title> <author>ajie</author> <Email>ajie@aolhoo.com</email> <date>20010115</date> </myfile> 七. 关于XML的更多 好了,到现在你已经知道: 1.什么是XML; 2.XML,HTML,SGML之间的关系和区别; 3.XML的简单应用。 恭喜你!你已经不再对XML一无所知,并且已经走在了网络技术的前沿。整个学习过程好象并不很难哦:) 五.Meta数据(Metadata)---专业的XML使用者会使用meta数据来工作。 在HTML中我们知道可以使用meta标识来定义网页的关键字,简介等,这些标识不会显示在网页中,但可以被搜索引擎搜索到,并影响搜索结果的排列顺序。 XML对这一原理进行了深化和扩展,用XML,你可以描述你的信息在哪里,你可以通过meta来验证信息,执行搜索,强制显示,或者处理其他的数据。 下面是一些XML metadata在实际应用中的用途: 1.可以验证数字签名,使在线商务的提交动作(submission)有效。 2.可以被方便的建立索引和进行更有效搜索。 3.可以在不同语言之间传输数据。 W3C组织正在研究一种名为RDF(Resource Description Framework)的metadata处理方法,可以自动交换信息,W3C宣称,使用RDF配合数字签名,将使网络中存在"真实可信"的电子商务。 六.显示 单独用XMl不能显示页面,我们使用格式化技术,比如CSS或者XSL,才能显示XML标记创建的文档。 我们在前面第一章讲到XML是将数据和格式分离的。XML文档本身不知道如何来显示,必须有辅助文件来帮助实现。(XML取消了所有标识,包括font,color,p等风格样式定义标识,因此XML全部是采用类似DHTML中CSS的方法来定义文档风格样式。),XML中用来设定显示风格样式的文件类型有: 1.XSL XSL全称是Extensible Stylesheet Language(可扩展样式语言), 是将来设计XML文档显示样式的主要文件类型。它本身也是基于XML语言的。使用XSL,你可以灵活的设置文档显示样式,文档将自动适应任何浏览器和PDA(掌上电脑)。 XSL也可以将XML转化为HTML,那样,老的浏览器也可以浏览XML文档了。 2.CSS CSS大家很熟悉了,全称是Cascading Style Sheets(层叠样式表),是目前用来在浏览器上显示XML文档的主要方法。 3.Behaviors Behaviors现在还没有成为标准。它是微软的IE浏览器特有的功能,用它可以对XML标识设定一些有趣动作。 七.DOM DOM全称是document object model(文档对象模型),DOM是用来干什么的呢?假设把你的文档看成一个单独的对象,DOM就是如何用HTML或者XML对这个对象进行操作和控制的标准。 面向对象的思想方法已经非常流行了,在编程语言(例如java,js)中,都运用面向对象的编程思想。在XML中,就是要将网页也作为一个对象来操作和控制,我们可以建立自己的对象和模板。与对象进行交流,如何命令对象,就要用到API。API全称Application Programming Interface,它是访问和操作对象的规则。而DOM就是一种详细描述HTML/XML文档对象规则的API。它规定了HTML/XML文档对象的命名协定,程序模型,沟通规则等。在XML文档中,我们可以将每一个标识元素看作一个对象---它有自己的名称和属性。 XML创建了标识,而DOM的作用就是告诉script如何在浏览器窗口中操作和显示这些标识 上面我们已经简要的讲述了一些XML的基本原理,我们来看看它们之间的关联以及它们是如何工作的,先看这里一张图: 1.XML描述数据类型。例如:"King lear"是一个标题元素; 2.CSS储存并控制元素的显示样式。例如:标题将被以18pt字体显示 3.script脚本控制元素如何动作。例如:当一个title元素"out of stock",将被用红色显示。 4.DOM则为脚本和对象的交流提供一个公共平台,并将结果显示在浏览器窗口。 如果任何一个部分发生错误,都不会得到正确结果。 好了,看到这里,我们已经对XML是如何工作的有一个整体的大致的概念。通过这一章的学习,我们可能感觉到XML似乎更偏向数据处理,更方便程序员学习。实际情况也是这样的,XML设计的目的就是用来方便的共享和交互数据的。下一章,我们将系统的了解关于XML的各种术语。 二.DTD的有关术语 什么是DTD,我们上面已经简略提到。DTD是一种保证XML文档格式正确的有效方法,可以比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。 DTD文件也是一个ASCII的文本文件,后缀名为.dtd。例如:myfile.dtd。 为什么要用DTD文件呢?我的理解是它满足了网络共享和数据交互,使用DTD最大的好处在于DTD文件的共享。(就是上文DTD说明语句中的PUBLIC属性)。比如,两个相同行业不同地区的人使用同一个DTD文件来作为文档创建规范,那么他们的数据就很容易交换和共享。网上有其他人想补充数据,也只需要根据公用的DTD规范来建立文档,就立刻可以加入。 目前,已经有数量众多的写好的DTD文件可以利用。针对不同的行业和应用,这些DTD文件已经建立了通用的元素和标签规则。你不需要自己重新创建,只要在他们的基础上加入你需要的新标识。 当然,如果愿意,你可以创建自己的DTD,它可能和你的文档配合的更加完美。建立自己的DTD也是很简单的一件事,一般只需要定义4-5个元素就可以了。 调用DTD文件的方法有两种: 1.直接包含在XML文档内的DTD 你只要在DOCTYPE声明中插入一些特别的说明就可以了,象这样: 我们有一个XML文档: <?xml version="1.0" encoding="GB2312"?> <myfile> <title>XML轻松学习手册</title> <author>ajie</author> </myfile> 我们在第一行后面插入下面代码就可以: <!DOCTYPE myfile [ <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ENTITY copyright "Copyright 2001, Ajie."> ]> 2.调用独立的DTD文件 将DTD文档存为.dtd的文件,然后在DOCTYPE声明行中调用,例如,将下面的代码存为myfile.dtd <!ELEMENT myfile (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> 然后在XML文档中调用,在第一行后插入: <!DOCTYPE myfile SYSTEM "myfile.dtd"> 我们可以看到DTD文档和HTML中js的调用是差不多的,关于DTD文档具体如何写,我们将在下一章和XML文档的语法一起介绍。 下面我们来了解DTD有关的术语: 1.Schema(规划) schema是数据规则的描述。schema做两件事: a.它定义元素数据类型和元素之间的关系; b.它定义元素所能包含的内容类型。 DTD就是关于XML文档的一个schema。 2.Document Tree(文档树) "文档树"在前面第二章我们已经提到过,它是文档元素分级结构的形象表示。一个文档结构树包含根元素,根元素是最顶级的元素,(就是紧接着XML声明语句后的第一个元素)。看例子: <?xml version="1.0"?> <filelist> <myfile> <title>...</title> <author>...</author> </myfile> </filelist> 上面的例子分三级结构排列成"树"状,其中的<filelist>就是根元素。在XML和DTD文件中,第一个定义的都是根元素。 3.Parent Element(父元素)/Child Element(子元素) 父元素是指包含有其它元素的元素,被包含的元素称为它的子元素。看上面的"结构树",其中<myfile>是父元素,<title>,<author>是它的子元素,而<myfile>又是<filelist>的子元素。象<title>这样没有包含任何子元素的最后一级元素我们也称之为"页元素"。 4.Parser(解析软件) Parser是一种检查XML文档是否遵循DTD规范的工具软件。 XML的parser发展为两类:一种是"非确认类paeser",只检测文档是否遵守XML语法规则,是否用元素标识建立了文档树。另一种是"确认类paeser",它不但检测文档语法,结构树,而且比较解析你使用的元素标识是否遵守了相应DTD文件的规范。 Parser能独立使用,也可以成为编辑软件或浏览器的一部分。在后面的相关资源列表里,我列出了当前比较流行的一些parsers。 好了,通过第三章的学习,我们已经了解了一些XML和DTD的基本术语,但是我们还不知道怎样来写这些文件,需要遵循什么样的语法,在下一章,将重点介绍有关撰写XML和DTD文档的语法。 第四章 XML语法 七.DTD的语法 DTD是"有效XML文档"的必须文件,我们通过DTD文件来定义文档中元素和标识的规则及相互关系。如何建立一个DTD文件呢?让我们一起来学习: 1.设置元素 元素是XML文档的基本组成部分。你要在DTD中定义一个元素,然后在XML文档中使用。元素的定义语法为:<!ELEMENT DESCRIPTION (#PCDATA, DEFINITION)*> 说明: "<!ELEMENT" 是元素的声明,说明你要定义的是一个元素; 声明后面的"DESCRIPTION",是元素的名称; "(#PCDATA, DEFINITION)*>"则是该元素的使用规则。规则定义了元素可以包含的内容以及相互的关系。下面的表格概要列出了元素的规则: 2.元素规则表: Symbol 含义 举例 #PCDATA 包含字符或文本数据 <MYFILE(#PCDATA)> 元素MYFILE包含一个文本数据 #PCDATA, element-name 包含文本和其它子元素 <MYFILE(#PCDTATA,TITLE)> MYFILE元素必须包含文本和TITLE子元素 , 使用逗号分隔排序 <MYFILE (TITLE,AUTHOR,EMAIL)> MYFILE元素必须依次包含TITILE,AUTHOR,EMAIL三个子元素 | 使用"|"表示或者 <MYFILE (TITLE | AUTHOR | EMAIL)> MYFILE元素必须包含TITLE,或者AUTHOR或者EMAIL子元素。 name 只能使用一次 <MYFILE (TITLE)> MYFILE元素必须包含TITLE子元素,而且只能使用一次。 name? 使用一次或者不使用 <MYFILE (TITLE,AUTHOR?,EMAIL?)> MYFILE元素必须包含TITLE子元素,而且只能使用一次;可以包含或者不包含AUTHOR和EMAIL子元素,但是如果使用,只能一次。 name+ 使用至少一次或多次 <MYFILE (TITLE+,AUTHOR?,EMAIL)> MYFILE元素必须包含TITLE子元素,而且使用至少一次;接下来可以跟随AUTHOR子元素,也可以不跟;最后必须包含EMAIL子元素,而且只能使用一次。 name* 使用一次,多次,或者根本不使用 <MYFILE (TITLE*)> MYFILE元素可以包含一个,多个或者不包含TITLE子元素 ( ) 设置组,可以嵌套 <MYFILE(#PCDATA | TITLE)*> 元素MYFILE包含一个或者更多的文本或者TITLE子元素。 <MYFILE((TITLE*, AUTHOR?, EMAIL)* | COMMENT)> MYFILE元素必须包含一些内容,内容或者是一个注释;也或者是多个组,组里包含:一个,多个或者没有TITLE子元素,接着是一个或者没有AUTHOR子元素,再接着是一个必须的EMAIL子元素。 另外,我们还可以为元素定义属性,因为我们不推荐使用属性,在这里就不详细展开了。 最后,我们来总结一些前四章学习的内容,写一个包含DTD,XML,以及Script的简单实例,便于读者理解: 1.将下面文件存为myfile.dtd <!ELEMENT myfile (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> 2.然后建立XML文档myfile.xml: <?xml version="1.0" encoding="GB2312"?> <!DOCTYPE myfile SYSTEM "myfile.dtd"> <myfile> <title>XML轻松学习手册</title> <author>ajie</author> </myfile> 3.建立HTML文档myfile.html <html> <head> <script language="JavaScript" for="window" event="onload"> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.load("myfile.xml"); nodes = xmlDoc.documentElement.childNodes; title.innerText = nodes.item(0).text; author.innerText = nodes.item(1).text; </script> <title>在HTML中调用XML数据</title> </head> <body bgcolor="#FFFFFF"> <b>标题: </b> <span id="title"></span><br> <b>作者: </b> <span id="author"></span><br> </body> </html> 4.用IE5.0以上浏览器打开myfile.html就可以看到效果了。 第三步:建立相应的HTML文件。 1.导入XML数据。 我们知道,目前流行的浏览器中,暂时只有微软的IE5.0以上版本浏览器支持XML。IE是通过在HTML中的object物件来支持插入XML,并通过js的XMLDocument.load()方法来导入数据。我们看代码: <object WIDTH="0" HEIGHT="0" CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" ID="xmldso"> </object> 定义一个object,ID名为xmldso。然后在head区用js引入xml数据: <script for="window" event="onload"> xmldso.XMLDocument.load("cd.xml"); </script> 2.捆绑数据。 然后将用<SPAN>标识来将XML数据绑定在表格中。其中ID,DATASRC,DTATFLD都是<SPAN>的属性。代码如下: <table> <tr><td>Title:</td><td><SPAN ID="title" DATASRC=#xmldso DATAFLD="TITLE"></SPAN></td></tr> <tr><td>Artist:</td><td><SPAN ID="artist" DATASRC=#xmldso DATAFLD="ARTIST"></SPAN></td></tr> <tr><td>Year:</td><td><SPAN ID="year" DATASRC=#xmldso DATAFLD="YEAR"></SPAN></td></tr> <tr><td>Country:</td><td><SPAN ID="country" DATASRC=#xmldso DATAFLD="COUNTRY"></SPAN></td></tr> <tr><td>Company:</td><td><SPAN ID="company" DATASRC=#xmldso DATAFLD="COMPANY"></SPAN></td></tr> <tr><td>Price:</td><td><SPAN ID="price" DATASRC=#xmldso DATAFLD="PRICE"></SPAN></td></tr> </table> 3.动作操作。 最后,为数据提供浏览按钮: <INPUT TYPE=button VALUE="上一张CD" ONCLICK="moveprevious()"> <INPUT TYPE=button VALUE="下一张CD" ONCLICK="movenext()"> 并利用js来完成两个鼠标点击功能:movenext()和moveprevious()。在head区加入如下代码: <script language="JavaScript"> function movenext() { if (xmldso.recordset.absoluteposition < xmldso.recordset.recordcount) { xmldso.recordset.movenext(); } } function moveprevious() { if (xmldso.recordset.absoluteposition > 1) { xmldso.recordset.moveprevious(); } } </script> 好,我们先看HTML文件的全部原代码: <html> <head> <script for="window" event="onload"> xmldso.XMLDocument.load("cd.xml"); </script> <script language="JavaScript"> function movenext() { if (xmldso.recordset.absoluteposition < xmldso.recordset.recordcount) { xmldso.recordset.movenext(); } } function moveprevious() { if (xmldso.recordset.absoluteposition > 1) { xmldso.recordset.moveprevious(); } } </script> <TITLE>CD Navigate</TITLE> </head> <body> <p> <object WIDTH="0" HEIGHT="0" CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39" ID="xmldso"> </object> <table> <tr><td>Title:</td><td><SPAN ID="title" DATASRC=#xmldso DATAFLD="TITLE"></SPAN></td></tr> <tr><td>Artist:</td><td><SPAN ID="artist" DATASRC=#xmldso DATAFLD="ARTIST"></SPAN></td></tr> <tr><td>Year:</td><td><SPAN ID="year" DATASRC=#xmldso DATAFLD="YEAR"></SPAN></td></tr> <tr><td>Country:</td><td><SPAN ID="country" DATASRC=#xmldso DATAFLD="COUNTRY"></SPAN></td></tr> <tr><td>Company:</td><td><SPAN ID="company" DATASRC=#xmldso DATAFLD="COMPANY"></SPAN></td></tr> <tr><td>Price:</td><td><SPAN ID="price" DATASRC=#xmldso DATAFLD="PRICE"></SPAN></td></tr> </table> <p> <INPUT TYPE=button VALUE="上一张CD" ONCLICK="moveprevious()"> <INPUT TYPE=button VALUE="下一张CD" ONCLICK="movenext()"> </p> </body> </html> 将以上代码存为cd.htm文件,于第二步的cd.xml文件放在一起。打开cd.htm文件,你就看见和上面实例一样的效果了。 第六章:XML相关资源 一. XML的大本营 XML是由W3C(World Wide Web Consortium)国际组织负责开发和制定标准的。关于XML最权威,最新的消息都来自W3C。网址是:http://w3c.org/XML/ 另外一个名为OASIS的前著名的SGML研究组织也在一起推动XML的发展,网址是:http://www.oasis-open.org/ 二. XML指南 http://www.w3.org/TR/REC-xml W3C关于XML规范的详细,完整的说明。不用多说,绝对权威。 http://www.xml.com/axml/testaxml.htm 这是Tim Bary写的XML规范说明书,非常的详细和严密,是学习XML规范的好帮手。 三. XML常见问题 Peter Flynn的 XML FAQ http://www.ucc.ie/xml/ 包含大量详细的资料,经常更新,由W3C协会XML组维护。 Lisa Rein’s finetuning XML FAQs http://www.finetuning.com/faq.html 这个FAQ列表有侧重点,主要包含XSLT FAQ,XPath FAQ和IE5中的XSL FAQ。 Dave Pawson’s XSL FAQ http://www.dpawson.co.uk/xsl/idx.html 提供最好的关于XSL方面的FAQ,创建于1999年。 jGuru’s Extensible Markup Language (XML) FAQ http://www.jguru.com/jguru/faq/faqpage.jsp?name=XML 这个FAQ列表是一个典型的"老百晓",任何问题,从普通的到非常细节的XML问题都可以在这里找到。 Ronald Bourret’s XML Namespaces FAQ http://www.informatik.tu-darmstadt.de/DVS1/staff/bourret/xml/ NamespacesFAQ.htm 创建于2000初,是关于namespaces概要的FAQ。 四. XML主题网站 http://www.xml.com/ 一个以XML为主题的内容丰富的网站 http://www.xml-zone.com/ 另一个比较知名的XML网站,提供XML的新闻和资讯。 http://www.xmlinfo.com/ 网站创建者James Tauber’s是W3C组织XML发展组的成员之一,他的网站提供了大量的连接和例子。 http://www.simonstl.com/ 网站创建者Simon St. Laurent也是XML发展组的成员。他是W3C中XML初级入门教程的作者,他的站点主要提供有关XML的发展信息。 http://msdn.microsoft.com/xml/c-frame.htm#/xml/default.asp 微软的MSDN关于XML的主题网站。微软在推进XML应用方面不遗余力。 http://www.xmlsoftware.com/ 是XML info的姐妹网站,内容包括XML/DTD/XSL编辑软件,XML API软件等。 http://xmlhack.com/ 1999年9月建立的大型XML新闻网站,同时提供XML人才信息。 http://xml.apache.org/ Apache软件基金会(ASF),提供了大量open source的XML和XSL的工具软件。 http://www.biztalk.org/ BizTalk是微软发起的以XML商业应用为目标的组织。BizTalk不是一个标准组织。 五. XML的编辑软件 目前XML文档的编辑软件依然很少。虽然我们可以手工编写,但是如果有一个好的软件(类似用DW/FP编写HTML),可以减少差错和提高效率。下面是现有的一些编辑软件。 http://www.macromedia.com/software/dreamweaver/ Macromedia最新的Dreamweaver 4.0已经支持XML文档的编写。推荐使用。 http://www.microsoft.com/xml/notepad/intro.asp 微软在这方面向来不会落后,它推出的XML Notepad是一个非常小巧灵活的XML文档编辑器。推荐使用。 http://www.adobe.com/prodindex/framemaker/prodinfosgml.html Adobe公司的Framemaker plus是目前较好的XML编辑软件。 http://www.arbortext.com/ Arbortext公司是重点开发XML游戏的公司。 http://www.inso.com/ Inso,好象是用来处理大型SGML或者XML文档的软件。 http://www.softquad.com/ Softquad 是HTML和SGML软件的开发商,对XML自然不会放过。 六. 支持XML的浏览器 http://www.microsoft.com/windows/ie/ IE 5.X是目前流行浏览器唯一支持XML的,它可以在微软的网站免费下载到。 http://developer.netscape.com/software/communicator/ngl/ index.html?cp=dev09fg01 Gecko是另一种支持XML的浏览器,但目前只是测试版。 七. XML parser Parser是一个检查XML文档语法是否符合DTD定义,并进行解析的软件。 在线的parser http://validator.w3.org/ W3C组织提供的一个在线paeser。可以根据你在线提交的XML文档URL,进行验证和解吸。 http://www.stg.brown.edu/service/xmlvalid/ 一个Brown大学科技小组提供的parser,非常方便和容易理解。。 可下载的Parser 有很多可以下载到本机上运行的parser,下面列出一些主要的: http://www.jclark.com/xml/expat.html James Clark是在SGML/XML领域的元老,他写的parser被广泛的运用。 http://www.alphaworks.ibm.com/tech/xml 一个以Java语言编写的Parser,来自IBM。 http://www.microsoft.com/xml/parser/cparser.asp 微软的XML Parser,用C++写成。 http://www.stud.ifi.uio.no/~larsga/download/python/xml/xmlproc.html 用Python写的parser。 http://www.jeremie.com/Dev/XML/ 用Javascript写的parser,只用来检查语法,不进行解吸析。 http://w3c.org/RDF/Implementations/SiRPAC/ 来自W3C组织的SiRPAC,全称是Simple RDF Parser and Compiler。 八. Schema编辑软件 Schema我们前面介绍过,DTD就是一种Schema,我们可以手工写DTD,但现在已经有一些Schema编辑软件来帮助我们更方便的建立DTD。 http://www.extensibility.com/ Extensibility这个软件被称为XML权威。可以以图形化方式建立和编辑schema,包括DTD文件。 九. 国内XML资源 http://www.xml.net.cn/ XML中国论坛是一个非赢利的学术网站。由北京大学计算机科学与技术研究所创办,北大方正集团公司提供赞助。 http://www.xml.org.cn:8188 中国XML联盟将建立为国内第一个开放性网络标准组织,提供XML技术认证、咨询和交流。由上海易方公司赞助。 http://www.xml.com.cn/ chinaasp.com的子站,提供XML文章和技术交流等。 http://www.egroups.com/group/china_xml_list/info.html 中国XML邮件组包括中文XML资源, XML的最新资料,同行的交流空间。由非盈利性组织中国XML联盟负责维护。 http://weblab.crema.unimi.it/xmlzh/XML_FAQ.htm 一个XML FAQ邮件列表的中文翻译,可惜是1998年10月的。 一日精通Ajax技术 Ajax这个名称怎么来的,本人也不得而之了,大概是(Active Javascript Action Xml)吧,说白一点就是运用了 javascript、xmlhttp和xmldom技术及网站后台来处理用户的一些操作的方法吧。 那么本人就分三步来说明如何使用 Ajax 技术来做开发。 一、用 javascript 操作 xmlhttp 对象 二、服务器部对xmlhttp请求的响应(PHP范例) 三、xmldom 的使用方法 先说第一部份: 一、用 javascript 操作 xmlhttp 对象 IE7, Mozilla ,Firefox等浏览器中,javascript是内置有 XMLHttpRequest 这个对象的,但IE5+则没有,需要用如下方法来启动: //IE 6 try{ xhttp = new ActiveXObject("Msxml2.XMLHTTP";} catch(e){ ; } //IE5+ if(xhttp == null) try { xhttp = new ActiveXObject("Microsoft.XMLHTTP";} catch(e){ ; } 那考虑不同浏览器的兼容,启动一个xmlhttp一般都要按如下方式: CODE:[Copy to clipboard]var xhttp = null; if(window.XMLHttpRequest){ //IE7, Mozilla ,Firefox 等浏览器内置该对象 xhttp = new XMLHttpRequest(); }else if(window.ActiveXObject){ //IE6、IE5 try{ xhttp = new ActiveXObject("Msxml2.XMLHTTP");} catch (e){ ; } if( xhttp == null) try { xhttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (e){; } } 对于 xmlhttp 的使用,一般遵守如下的顺序: 1、初始化 xmlhttp 对象(上文); 2、打开链接 方法 xhttp.open("GET", purl, true); 参数一:用 GET 或 POST 方式发送数据 参数二、请求网址(只能请求你服务器上的资源,一般浏览器安全限制不能读取跨域的数据) 参数三、true 表示异步传输(服务器返回信息完成前,你可以进行其它操作),false 表示阻断方式的传输。 3、设定要发送的 http 请求头 方法: xhttp.setRequestHeader(key,value); 一般来说,默认要发送的头是:xhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"; 这种表示发送的内容类型的请求头用于发送文本数据,而且javascript默认是以unicode发送的,还有另外一种形式是:xhttp.setRequestHeader("Content-Type","multipart/form-data";这表示发送二制形式的数据,由于安全性原因,javascript一般不能用这种方式来发送数据,所以这个头一般没什么用。 如果你的网站开启了使用 refer 参数来防盗链,那么你必须用这个方法指定 Refer 参数,或者如果用户需要登录才能进行某操作,那么要指定 Cookie 的请求头。 4、send 数据 方法:xhttp.send(postdata); 对于用 get攻手请求,不需要指定postdata,直接用 test.php?a=a&b=b 这样形式的网址来请求即可。 如果是post方式,需要用 key1=value2&key2=value2 这样的形式来对数据进行处理,把它合并在 postdata 字串中,然后发送。 注意事项: javascript默认发送数据的方式是unicode,处理返回的数据必须是utf-8格式,因此,在发送的时候,需要用escape()函数来处理postdata和网址的value,在服务器上必须还原这些value,并把unicode转为页面编码值,因此如果用 jsp 或 asp.net 都会比较简单,但如果用php处理起来是什么费劲的,等下会教你如何做。 5、确认服务器返回资料完成下载 [1] 如果用阻断的方式来发送请求,那么直接用 if(xhttp.readyState == 4)就能判断是否完成。 readyState 的具体属性值为: 0 没open 1 没send 2 状态未知 3 正在传送 4 传送完成 当然为了保障起见,还需要加多一重判断,就是 if(xhttp.status == 200) ,status 就是 http 协议里的返回头代码 1xx 表示(唉呀,忘记了) 2xx 表示成功的信息 3xx 表示页面转移 4xx 页面不存在 5xx 表示服务器的各种错误 如果你的页面没特殊处理,一般用 if(xhttp.status == 200) 来确信内容返回是正确的 [2] 如果用异步传输,需要用 onreadystatechange 的事件来监听 xhttp.onreadystatechange = function() { //这里来进行上面阻断方式的判断 if(myajax.xhttp.readyState == 4){ if(myajax.xhttp.status == 200){ //要进行的后续操作 } } } 6、获取返回结果 属性: [1]xhttp.responseBody; [2]xhttp.responseStream; [3]xhttp.responseXml; [4]xhttp.responseText; 其中1、2都是二进制的方式,一般很少会用到,4不用看都知道了 如果服务端无意外的话[3]返回的是一个xmldom的对象 二、服务器部对xmlhttp请求的响应(PHP范例) 为了简化操作,在这里把 xmlhttp的各作操作封装为一个类 CODE:[Copy to clipboard]function DedeAjax(WiteOKFunc){ //WiteOKFunc 为异步状态事件处理函数 //xmlhttp和xmldom对象 this.xhttp = null; this.xdom = null; //post或get发送数据的键值对 this.keys = Array(); this.values = Array(); this.keyCount = -1; //http请求头 this.rkeys = Array(); this.rvalues = Array(); this.rkeyCount = -1; //请求头类型 this.rtype = 'text'; //初始化xmlhttp if(window.XMLHttpRequest){//IE7, Mozilla ,Firefox 等浏览器内置该对象 this.xhttp = new XMLHttpRequest(); }else if(window.ActiveXObject){//IE6、IE5 try { this.xhttp = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) { } if (this.xhttp == null) try { this.xhttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) { } } this.xhttp.onreadystatechange = WiteOKFunc; //rs: responseBody、responseStream、responseXml、responseText //以下为成员函数 //-------------------------------- //初始化xmldom this.InitXDom = function(){ var obj = null; if (typeof(DOMParser) != "undefined") { // Gecko、Mozilla、Firefox var parser = new DOMParser(); obj = parser.parseFromString(xmlText, "text/xml"); } else { // IE try { obj = new ActiveXObject("MSXML2.DOMDocument");} catch (e) { } if (obj == null) try { obj = new ActiveXObject("Microsoft.XMLDOM"); } catch (e) { } } this.xdom = obj; }; //增加一个POST或GET键值对 this.AddKey = function(skey,svalue){ this.keyCount++; this.keys[this.keyCount] = skey; this.values[this.keyCount] = escape(svalue); }; //增加一个Http请求头键值对 this.AddHead = function(skey,svalue){ this.rkeyCount++; this.rkeys[this.rkeyCount] = skey; this.rvalues[this.rkeyCount] = svalue; }; //清除当前对象的哈希表参数 this.ClearSet = function(){ this.keyCount = -1; this.keys = Array(); this.values = Array(); this.rkeyCount = -1; this.rkeys = Array(); this.rvalues = Array(); }; //发送http请求头 this.SendHead = function(){ if(this.rkeyCount!=-1){ //发送用户自行设定的请求头 for(;i<=this.rkeyCount;i++){ this.xhttp.setRequestHeader(this.rkeys[i],this.rvalues[i]); } } if(this.rtype=='binary'){ this.xhttp.setRequestHeader("Content-Type","multipart/form-data"); }else{ this.xhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); } }; //用Post方式发送数据 this.SendPost = function(purl){ var pdata = ""; var i=0; this.state = 0; this.xhttp.open("POST", purl, true); this.SendHead(); if(this.keyCount!=-1){ //post数据 for(;i<=this.keyCount;i++){ if(pdata=="") pdata = this.keys[i]+'='+this.values[i]; else pdata += "&"+this.keys[i]+'='+this.values[i]; } } this.xhttp.send(pdata); }; //用GET方式发送数据 this.SendGet = function(purl){ var gkey = ""; var i=0; this.state = 0; if(this.keyCount!=-1){ //get参数 for(;i<=this.keyCount;i++){ if(gkey=="") gkey = this.keys[i]+'='+this.values[i]; else gkey += "&"+this.keys[i]+'='+this.values[i]; } if(purl.indexOf('?')==-1) purl = purl + '?' + gkey; else purl = purl + '&' + gkey; } this.xhttp.open("GET", purl, true); this.SendHead(); this.xhttp.send(); }; } // End Class DedeAjax 上面代码保存为: dedeajax.js ok 那现在做个最简单的测试吧 test.htm CODE:[Copy to clipboard]<script language='javascript' src='dedeajax.js'></script> <script language='javascript'> function WiteOK() { var myinfo = document.getElementById("myinfo"); if(myajax.xhttp.readyState == 4){ if(myajax.xhttp.status == 200){ myinfo.innerHTML = myajax.xhttp.responseText; } } } var myajax = new DedeAjax(WiteOK); myajax.AddKey("key1","----------------------------"); myajax.SendPost("test.php"); </script> <div id='myinfo'><div> test.php CODE:[Copy to clipboard]<? header("Content-Type: text/html; charset=gb2312"); echo $_POST['key1']; ?> 看到了什么了呢?不用激动,真正让你头痛的东西还没有出来。 把类里面的 CODE:[Copy to clipboard]this.AddKey = function(skey,svalue){ this.keyCount++; this.keys[this.keyCount] = skey; this.values[this.keyCount] = svalue;//escape(svalue); }; escape 屏蔽掉 发送 myajax.AddKey("key1","-----中---国----人-----"; 看到什么了,乱码是吧?呵呵,这回开始头大了 先把 escape放回去 this.values[this.keyCount] = escape(svalue); 那么看到的就是 -----%u4E2D---%u56FD----%u4EBA----- 如何把 %u4E2D 这些东西弄回来呢?对于php而言这是一个很复杂的问题,如果用asp就简单多了 下面是我写的一个函数: CODE:[Copy to clipboard]//unicode url编码转gbk编码函数 function Unicode2Gbk($str) { //载入对照词典 if(!isset($GLOBALS['GbkUniDic'])) { $ds = file("./data/gbk_unicode.dic"); foreach($ds as $l){ $GLOBALS['GbkUniDic'][hexdec('0x'.substr($l,0,4))] = substr($l,5,4); } } //处理字符串 $glen = strlen($str); $okstr = ""; for($i=0; $i < $glen; $i++) { if( $glen-$i > 4){ if($str[$i]=='%' && $str[$i+1]=='u'){ $uni = hexdec('0x'.substr($str,$i+2,4)); if(isset($GLOBALS['GbkUniDic'][$uni])){ $uni = $GLOBALS['GbkUniDic'][$uni]; $okstr .= chr(hexdec(substr($uni,0,2))).chr(hexdec(substr($uni,2,2))); } else $okstr .= "&#{".hexdec("0x".$uni).";"; $i = $i+5; } else $okstr .= $str[$i]; } else $okstr .= $str[$i]; } return $okstr; } 词典文件: http://www.ce86.com/myimg/data.rar 把test.php 输出改为 echo Unicode2Gbk($_POST['key1']); 正常了吧 以下说下面和xml有关的东西的了 三、xmldom 的使用方法 由于本文仅是牵针引线的作用,这一章就简单些,因为针对的是 php ,如果针对的是 asp.net 或 jsp 写涉及 web server 类的通信,已经不单纯是 ajax 的问题了,本章的任务是把test2.php CODE:[Copy to clipboard]<? header("Content-Type: text/xml; charset=gb2312"); echo '<'.'?'."xml version=\"1.0\" encoding=\"gb2312\" ".'?'."> <myhome> <item sex=\"男\">我是小一</item> <item sex=\"女\">我是小二</item> </myhome> "; ?>这个xml文档在客户端用自己的方式展现出来。因为xml这种东西比较麻烦,所以语法也必须严格,test2.htm的页面的源码为 CODE:[Copy to clipboard]<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>ajax测试</title> </head> <body onload="WiteLoadDocument()"> <script language='javascript' src='dedeajax.js'></script> <script language='javascript'> var myajax = new DedeAjax(WiteOK); function WiteOK() { var myinfo = document.getElementById("myinfo"); var mydom = null; myinfo.innerHTML = "以下是处理结果:<br/>"; if(myajax.xhttp.readyState == 4){ mydom = myajax.xhttp.responseXml; alert(mydom); } } function WiteLoadDocument() { myajax.SendGet("test2.php"); } </script> <div id='myinfo'><div> </body> </html> 在IE中测试一下,如果弹出的对话框是 [object] 就表示成功获得返回的xml的xmldoc了。 那下面是处理: CODE:[Copy to clipboard]function WiteOK() { var myinfo = document.getElementById("myinfo"); var mydom = null; myinfo.innerHTML = "以下是处理结果:<br/>"; if(myajax.xhttp.readyState == 4){ mydom = myajax.xhttp.responseXml; var nodeList = mydom.selectNodes("/myhome/item"); var mynode = null; var myatt = null; var mysex = ""; for(i=1;i<=nodeList.length;i++) { mynode = nodeList[i-1]; for(j=0;j < myinfo.attributes.length;j++) { if(!mynode.attributes[j]) break; myatt = mynode.attributes[j]; if(myatt.name=='sex') mysex = myatt.value; } myinfo.innerHTML += "我是:"+mynode.text+",我的性别是:"+ mysex +"<br/>"; } } } 结果: CODE:[Copy to clipboard]以下是处理结果: 我是:我是小一,我的性别是:男 我是:我是小二,我的性别是:女 OK,目的已经达到 关于dom的部份只在IE6中测试过,可能在firefox中会有问题,大家可能参考与兼容性有关的文档。





剩余25页未读,继续阅读

评论2
最新资源