当前页面位置: » 丰搜网 » 文档中心 » 详细内容
xml与其相关技术
xml有很多相关的技术,将这些技术结合起来,才能充分发挥xml的强大功能。这些技术包括:xlink与xpointer(设置xml的超链接)、dom(document object model:文件对象模型,存取、操作文件的内容)、namespaces(解决不同元素有相同名称的问题)、xhtml(下一代的html)等。
■xlink与xpointer
在xml的规范中,我们看到它并没有规定有关文件链接的问题。为了使xml文件也能够有类似html文件超链接的功能,w3c制定了xlink和xpionter两种规范,其中xlink是规定xml文件之间的链接规范(和html中的外链接相似),xpointer是规定xml文件中不同位置之间的链接规范(类似html中的内链接)。
1.xlink:xlink所设定的链接分为simple link和extended link。其中,simple link的链接功能和html的超链接基本上一样,而extended link则超出了html超链接的功能,它链接的对象可以一次设定多个,由多个标记来共同制定该链接。
在xml文件中使用xlink元素的时候,必须要在dtd中声明这个元素。完整的声明样本如下(本样本声明了一个名为simple的simple link 类型的xlink元素):
〈!element simple any〉 〈!attlist simple xml:link cdata #fixed"simple" href cdata #required role cdata #implied title cdata #implied inline (truefalse) "true" content-role cdata #implied content-title cdata #implied show (embedreplacenew) #implied actuate (autouser) #implied behavior cdata #implied〉 |
可以看到,xlink元素有多种属性,通过对这些属性赋值,可以编制出多种多样的链接方式。下面我们对这些属性作些解释。
xml:link:指明链接类型是simple link还是extended link。
href:用来设定链接的地址,与html中a标记中的href属性一样。
role:叙述该链接功能,提供给应用程序读取。
title:叙述该链接功能,提供给用户读取,与html中a标记的alt属性相似。
inline:有“true”和“false”两种取值,声明建立的链接是否以嵌入方式链接,缺省为“true”。
content-role和content-title:和role、title类似,但它们叙述的是指向的内容,而不是链接的内容。
show:有三种取值,replace表示将链接的内容取代当前的内容,new表示将链接的内容在一个新的窗口打开,embed表示将链接的内容加入到当前的内容中。
actuate:设置该链接是如何被激活。auto表示xml文件被解读后,链接自动被激活。而user表示,该链接必须被用户手动激活,也就是用户必须要用鼠标点击一下该链接。
behavior:设置该链接被激活后,将自动引发一些动作,可用一些指令来设置链接激活后应用程序要作的事情。
当我们在dtd中声明xlink元素后,就可以在xml文件中使用这个元素。例如:
〈simple href="http://www.cbinews.com/xml.htm" title="这是一篇介绍xml的文章" role="xml article" content-role="good" cont-title="first" show="new" actuate="user" behavior="goto zero"/〉 |
另外一种xlink链接方式是extended link,它的特点是可以一次设定多个链接对象。同样,在使用extended link类型的xlink元素前必须在dtd中声明这个元素。声明方式和simple link类型的xlink元素类似,不同之处有两点,第一,声明xml:link属性时,语句变为:xml:link cdata #fixed “extended”;第二,没有任何href属性和任何目标描述,声明extended link类型的xlink元素,必须包括一套包含href定位的子元素。即在声明了extended link类型的xlink元素之后,还必须声明一个xml:link属性值为locator的子元素。例如:
〈!element aaa any〉 〈!attlist aaa xml:link cdata #fixed "extended" inline (truefalse) "true" content-role cdata #implied content-title cdata #implied〉 〈!element bbb any〉 〈!attlist bbb xml:link cdata #fixed "locator" role cdata #implied href cdata #reauired title cdata #implied show (embedreplacenew) "replace" actuate (autouser) "user" behavior cdata #implied 〉 |
这样,我们就可以在xml文件中使用定义过的extended link的xlink元素。如: 〈aaa〉文章资料 〈bbb href="http://www.cbinews.com/xml1.htm title="xml入门"/〉 〈bbb href="http://www.cbinews.com/xml2.htm title="xml进阶"/〉 〈bbb href="http://www.cbinews.com/xml3.htm title="xml应用"/〉 〈/aaa〉 |
当我们通过css或xsl将这个xml文件在浏览器中显示出来后,用户点击“文章资料”这个extended link的xlink链接,将会出现一个选单,列出所有子元素中的标题,并将用户带到相应的位置。
2.xpointer:xpointer用来设定xml文件内不同位置的链接,和html中的内链接类似,但是,xpointer提供了5种不同的在xml文件内定位的方法,可将地址定位到相应的地方,功能上比html中的内链接更为强大。
绝对定位:root()——将地址定位到xml文件中的根元素位置。
属性名(x)——将地址定位到属性值为x的特定属性位置。
相对定位:child(x)——将地址定位到当前地址下的第x个子标记处。
child(x,y)——将地址定位到当前地址下第x个标记名为y的标记处。
child(x).child(y,z)——将地址定位到当前地址下的第x个标记处,然后将这个标记作为当前地址,再找出该标记下的第y个标记名为z的控制标记。
范围定位:span(xpointer1,xpointer2)——选择所有的在第一个xpointer开始和第二个xpointer结束之间的内容。其中xpointer1、xpointer2表示其他的定位方法。
属性定位:attr(x)——找出第一个具有x属性的标记。
字符串定位:搜寻特定的字符串,然后将地址定位到特定的字符串处。
合并定位:将上述的定位方法进行组合,产生更多的功能。各种定位方法之间用“.” 符号分隔。
■dom(document object model)
早在html中,dom就有应用了。dom可以看作是一种activex对象,它绑定封装了一部分文件存取api(应用程序编程接口),使用户能够使用脚本语言(vbscript、javascript等)来调用dom对象,达到存取、操作文件内容的目的。以前在html中,我们利用dom来创建动态网页,在xml文件中,我们同样可以利用dom来创建动态网页,并且dom可以用来加载xml文件,并加以解析、截取和操作xml文件中的信息。
ie 5支持xml和dom的结合应用,提供了四种dom对象:xmldomdocument、xmldomnode、xmldomnodelist、xmldomnamenodemap。这些dom对象提供了很多方法和属性,用法同一般的activex对象也没有什么区别。具体的属性、方法可以参阅微软的web站点。
我们下面举个例子,3.htm这个html文件用到了xmldom对象,在这个html文件中使用javascript创建了dom对象,然后调用dom对象,将我们前几期讲xsl时的xml文件、xsl文件的例子读入,然后将xml文件依照xsl样式表的设定显示在浏览器中。例:
〈html〉 〈head〉 〈title〉dom应用举例〈/title〉 〈script language="javascript" for="window" event="onload"〉 var xmlfile=new activexobject("microsoft.xmldom"); xmlfile.load("2.xml"); var xslfile=new activexobject("microsoft.xmldom"); xslfile.load("first.xsl"); document.all.item("dom应用").innerhtml=xmlfile.transformnode(xslfile.documentelement); 〈/script〉 〈/head〉 〈body〉 〈div id="dom应用"〉〈/div〉 〈/body〉 〈/heml〉 |
■namespaces
考虑一下,当我们建立xml应用的时候,会为具体的行业应用创建特定的dtd,规定可用的元素。有时会出现下面情况——两个同名的元素在不同的地方可能会有不同的含义。例如,我们定义〈title〉这个标记,在书店应用中,这个标记中的字符含义是书的名称,而在人事部门中,这个标记中的字符含义却是人的称谓、头衔。如果我们写一个包含书名、作者、作者身份等信息的xml文件,将在书名和作者身份两个地方用到同样的〈title〉标记,但它们有不同的含义,计算机程序无法分辨哪一个是书名,哪一个是作者身份。这样就给我们的自动化处理带来了问题,这就是namespaces要解决的问题。namespaces的概念非常直接——对于每一套特定应用的dtd,给它一个独一无二的标志来代表,如果在xml文件中使用dtd中定义的元素,需将dtd的标志和元素名、属性连在一起使用,相当于指明了元素来自什么地方,这就不会和其他同名元素混淆(像我们的电话号码,两个城市可能存在相同的号码,但是我们在前面用区号将它限定了,一个地方的区号在一个国家中是独一无二的)。在xml中,采用现成的、在全球范围唯一的“域名”作为namespaces,即用url作为xml的namespaces。前面我们学习xsl的时候,实际上就接触到了namespaces,xsl文件中的标记名称前面都有一个“xsl:”,实际上这就是xsl中元素的namespaces。声明语句就是:〈xsl:stylesheet xmlns:xsl="http://www.w3.org.tr.wd-xsl"〉,后面的xmlns:xsl="......"。其中,声明中的xsl称为前置字符串,在文件中引用元素时要加上前置字符串,如:〈xsl:templed〉。
例: 〈?xml version="1.0" encoding="gb2312"?〉 〈c:客户名单 xmlns:c="http://www.aaa.com/custom.dtd"〉 xmlns:职工="http://www.aaa.com/employee.dtd〉 〈c:客户〉 〈c:姓名〉张三〈/c:姓名〉 〈c:电话〉028-6666666〈/电话〉 〈c:接待人〉 〈职工:姓名〉李四〈/职工:姓名〉 〈职工:电话〉5555555〈/职工:电话〉 〈/c:接待人〉 〈/c:客户〉 ....... |
这个例子在前面定义了两个namespaces——c:和职工:。在应用元素时,前面都加了特定的namespaces。那么应用程序在读到同名元素,如:〈姓名〉、〈电话〉时,就能够区分哪一个是客户姓名、电话,而哪一个又是本单位职工的姓名、电话了。
利用namespaces,我们还可以在xml文件中直接利用html的标记,不使用xlink或xpionter,也让xml文件具有超级链接、显示图片的功能。在使用html标记之前,必须声明它的namespaces。下面这个例子就是xml和html的混合使用。
例:
〈?xml version="1.0" encoding="gb2312" ?〉 〈?xml-stylesheet href="first.css" type="text/css" ?〉 〈data xmlns:html="http://www.w3.org/tr/xhtm1"〉 〈book〉 〈title〉xml入门精解〈/title〉 〈html:a href="mailto:lionliao@yeah.net"〉 〈author〉作者:张三〈/author〉 〈/html:a〉 〈picture〉 〈html:img src="zhangsan.jpg" width="80" height="80"〉〈/html:img〉 〈/picture〉 〈price unit="人民币"〉价格:$20.00〈/price〉 〈content〉 〈html:a href="http://www.cbi.com"〉点击查看主要内容〈/html:a〉 〈/content〉 〈/book〉 〈/data〉 |
注意:在xml中使用html时要严格遵守xml的语法规定,元素必须正确关闭。
通过css或xsl可将这个xml文件显示出来,如图1所示。
■xhtml
xhtml最早叫html in xml,就是把过去用sgml定义的html,用xml来重新定义(不要忘了,xml是一种定义语言的语言)。实际上,xhtml中的标记基本上还是html 4.0中的那些标记,各种标记、属性的用法基本不变。只不过因为它是通过xml定义的,所以必须严格遵守xml的规定,不像过去那样随便。那为什么要发展xhtml呢?
现在,手机上网、信息家电等炒得如火如荼,好像什么都应该连到因特网上。xhtml正是适应这种潮流而出现的。大家知道,现在的html越来越复杂,而且存在大量的不规范html网页(并不是能够在ie.netscape正确显示就算是规范的网页),而浏览器为了能够适应这种情况,包容了大量五花八门的html网页,已经变得非常臃肿(这就是虽然你的html语法错误,有时还是能够正确显示出来的原因,设计浏览器的工程师绞尽脑汁来适应、包容错误)。对于pc来说,这不算什么,因为pc的性能已经得到了很大程度的提升,而对于那些掌中设备、信息家电,可没有这么多存储空间可用。xml标准简单但是非常严格,主要目的就是减轻解析器、浏览器的开发负担以及这些软件的体积。一般的xml解析器的体积不过几百kb。根据xml标准定义出来的xhtml当然继承了xml的特性,同时也保留了html在表现形式上的优越性,它摒弃了html中的“不干净”代码,提供了良好的可伸缩性,可大可小。
xhtml通过将过去的html功能,按照使用者的需要和浏览器的能力,划分为多个模块,每一组模块仅支持部分html标记。针对于特定模块开发的解析器、浏览器显然比大而全的解析器、浏览器体积要小得多。这就达到了“可小”的目的。比如说:掌上电脑屏幕本身很小,显然它浏览网页的时候不需要使用html中的“frame”功能,那么针对这种设备,有它专门的一套适用的、不包含“frame”的标记。当然,每个模块都需要有它们的专用dtd来声明可以使用哪些标记。现在w3c已经定义好了几种专用的dtd。
“可大”呢?实际上就是利用xml的特点,xml是什么?可扩展标记语言呀!以前,html中的标记是已经定义好了的,是不能够改变,只能拿来使用,而xhtml就可以像xml一样,能够自定义标记。
使用xhtml和使用html基本上一样,不过要注意的是,我们再不能偷懒了。xhtml也像xml一样,首先必须是well-formed。规则如下:
1. 标记必许正确结束。
2. 标记与标记之间不允许交叉嵌套。像以前的“〈i〉斜体〈b〉粗斜体〈/i〉〈/b〉”这样的语句是不行的,而必须写成“〈i〉斜体〈b〉粗斜体〈/b〉〈/i〉”才合格。
3. 空元素(开始标记与结束标记间无内容)必须按xml的规定写成〈元素名/〉。
4. 属性值必须用“ ”号括起来,像以前的“〈td width=100〉”的语句必须改写成“〈td width="100"〉”。
5. 属性都要赋值。以前有些标记的属性如果不赋值,它就取缺省值,在xhtml中,必须明确地给它赋值。
6. 标记名称、属性名称都用小写字母。
7. 使用正确的根元素加上namespaces。
8. 〈head〉〈body〉不能够省略。〈title〉必须是〈head〉中出现的第一个子元素。
9.原来html网页中的vbscript、javascript、样式表区域,必须像xml的cdata区一样包装起来,如:
〈script language="javascript"〉 〈![cdata[ ...... if (i 〈 3 &&&& ...... ]]〉 〈/script〉 |
满足了上述条件,并不表示xhtml就是最好的,而仅仅是格式正确的xhtml文件,需要正确地引用dtd,才成为真正正确的xhtml。w3c已经定义了三种xhtml的dtd供大家使用,它们分别是strict、transitional、frameset。从现在开始,写html网页时就需要按照xhtml的规定来写,并且最好不要用font之类的标记,尽量使用css来表现你的html网页。等到xhtml、xml普及了,你就会暗笑了,因为你实现网页转换是非常容易的。
本系列讲座介绍了xml的语法、结构以及相关的一些技术。并非了解这些,就能够使用xml了。有关xml的具体开发应用现在的讨论也是非常多,如:xml用于电子商务、xml用于文档管理、xml用于数据驱动应用程序等。我们学习xml,关键就是要在以后的开发中应用它,明白了xml的基础知识,将会在应用开发中起到重要作用。