Posted on 2006-03-23 22:01
fortune 阅读(512)
评论(0) 编辑 收藏 所属分类:
java技术
一、Xml可扩展性的优势与隐患
从Xml(Extensible Markup Language可扩展标记语言)这个名字就可以知道,Xml是易于扩展的。的确,作为一种描述"元数据"的标记语言,Xml规范虽然为构建Xml文档提供了一些基本语法,但是并没有定义确切的标记,任何人都能够根据需要使用自定义的元素和属性为Xml文档提供结构信息以扩充标记集。
Xml的可扩展是不难理解的,作为一种新标记语言,Xml语言提供了一个可扩展的、强有力的标准来描述数据,使得数据可以在应用程序中使用或在不同平台、不同应用中交换。Xml只关心如何描述数据,并不指定如何为一个最终用户或者系统显示数据。(当然,你可以通过Xml相关的其他技术如XPath、XSlt或者程序语言来操纵和显示这些数据)。
在这一点上,Xml与同样继承自SGML(Standard Generalized Markup Language 标准通用标记语言)并且也是SGML子集的Html有很大的不同。Html的目的是通过一个(例如一个浏览器)来显示数据,你只能使用那些预先定义的特定标记。例如,要建立一个链接,你必须使用<a>标记,并且,你只能在这个标记内使用"href"属性指定链接目标所在的位置;同样,要在Html中导入一幅图象,你也只能使用<img>标记,并且只能在这个标记中使用"src"属性指定图象文件的路径。其他Html的元素和属性也一样,它们都被预定义了特定的名称。
Xml这种允许自由地创建标记和属性的特点为应用带来了极大的方便。根据应用需要,你可以为那些标记指定更有意义的、自描述的名称而不用一味遵循那些有可能并不合适的某种限制。比如,你大可用<Link>取代<a>标记,用"path"取代"href"属性使链接一目了然。放心,这在Xml规范中是允许的。
实际上也正是由于Xml可扩展的优点,Xml文档在各个领域(如科技词典、法律词汇表、医学词汇表、计算机词汇表、公用电话交换网络词汇等)的标准化建设中得到了广泛的应用。
这种定制Xml文档标记的"自由"无疑具有明显的优势,并且在特定的环境下的确是这样。然而, Xml文档很多时候被用于数据交换,Xml为标记那些可以在应用程序之间以平台无关的方式进行交换的数据提供了一种非常有用而且可以扩展的框架。它被广泛地用于在应用程序对象之间、不同平台应用中,甚至是Internet上交换数据。这个时候,创建你自己的Xml文档元素和属性名字的能力确实需要付出一定的代价,当你想要与其他的不熟悉你的文当结构的客户或者应用程序交换Xml文档时,这种代价尤为突出。所有这些参与者(平台、应用程序及人)都能正确使用这些Xml文档吗?它们中的自定义标记能够被识别吗?
乍看起来,这样似乎已经导致了混乱。毕竟,如果每个人都可以使用不遵循任何命名规范的标记来创建Xml文档,其他人怎么能够使用这些文档呢?
二、Xml验证-自由的相对性
看来,完全遵循xml规范的格式正确的文档并不总能满足需要。许多情况下还需要保证文档的有效性。这时,一种"元数据"文档被创建来定义这个Xml文档中包含什么样的元素、属性和其他项目。有三种这样的"元数据"文档,它们是DTD、XML-DR Schema以及W3C Schema,它们定义了一个Xml文档必须遵循什么样的结构才是有效的。通过定义Xml文档的结构,应用能够在执行任何计算和转换之前对文档进行验证。
现在很清楚了,你尽可以在xml文档中自定义所需要的标记以描述数据,任何想使用这个文档的人也可以使用它,只要你为他们提供一个文档是如何组织以及使用什么样的标记描述数据的定义即可!由于XSD Schema是万维网联盟W3C的推荐标准,下面的验证均只针对它展开。
三、从Xml文档内部引用Xml Schema验证
在创建了一个Xml Schema文档之后,就可以用它来验证xml文档的有效性了。做起来很简单,只需要在xml文档根元素内引用该schema文件就可以了。不过,根据xml schema文档是否包含targetNamespace属性,xml文档内的引用有以下两种方式:
1、使用noNamespceSchemaLocation属性引用schema文件
当xml schema文档不包括targetNamespace属性时,应当通过xml文档根元素的noNamespaceSchemaLocation属性及W3C的schmea实例命名空间(xmlns:xsi="http://www.w3.org/2001/XMLScheam-instance")来引用名xml schema文件。下面的例子引用不包含"targetNamespace"属性的名为"noTargetNS.xsd"的架构文件:
<?xml version="1.0" encoding="utf-8" ?> <Employees Xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "xsi:noNamespaceSchemaLocation="noTargetNS.xsd"> <Name>LinY</Name> <Age>42</Age> </Employees>
|
2、使用schemaLocation属性引用schema文件
然而,如果xml schmea文件包含了一个targetNamespace 属性,在xml文档中就将通过schemaLocation属性而不是noNamespaceSchemaLocation属性来引用schema文档。而且,这个属性所指定的值必须是完整的。它需要包含以空格分开的两部分,前一部分是Uri,这个Uri与schema文档的targetNamespace属性内部引用的Uri是一致的;后一部分是schema文件完整路径及名称。另外,Xml文档的根元素也必须声明schema实例名字空间(xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"),下面的例子引用包含"targetNamespace"属性的名为yesTargetNS.xsd架构文件:
<?Xml version="1.0" encoding="utf-8" ?> <Employees Xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tuha.net yesTargetNS.xsd" Xmlns="http://www.tuha.net"> <Name>XiaoM</Name> <Age>25</Age> </Employees>
|
在xml文档内部正确地引用schema文件之后,在解析xml文档时将执行验证。
四、在Visual Studio.Net IDE中使用Xml Schmea验证
Visual Studio.Net IDE为使用xml架构提供了丰富的支持。其集成的xml架构设计器,能够以组件拖放的方式创建xml架构文档;集成的xml文档设计器,能够基于现有xml文档创建xml架构。这之后,你可以关联xml文档和xml架构文件并执行xml文档的正确性及有效性验证操作。这样做时,你只需要作简单的代码修改甚至不用手写一行代码就能完整文档验证的所有工作。
1、创建xml架构
可以通过任何文本编辑器创建xml架构文件,显然,这样做比较麻烦的,你必须熟知架构文档的规范。作为补充,Visual Studio.Net IDE中提供了好几种创建Xml架构文档的简单方式。使用Xml 架构设计器,从工具箱中拖入你需要的节点元素组件,就可以完成xml架构文档创建的绝大部分工作(如果你不需要修改节点数据类型的话,这也是创建xml架构文件的全部工作)。特别地,如果你已经创建了xml文档,你可以基于现有 XML 文件创建架构,通过简单的操作,就可以生成此xml文档应遵循的xml架构文件:
◇将Xml源文档(.xml 文件)加载到"Xml设计器"中。
◇从IDE菜单栏中选择"XML"菜单项并单击"创建架构"。
就这么简单,查看项目"所有文件",你会发现,与xml文档同名的 XML 架构(.xsd 文件)生成了。
不过,以这种方法产生xml架构时,所有数据类型都被默认设置为 xsd:string类型,因此,可能需要修改它们以符合 Xml文档的需要。
2、关联xml文档和xml架构文件
如果已经创建了xml源文件和Xml架构文件,要使该xml架构文件对xml文档发生作用,必须将xml源文件和xml架构文件关联起来。在Visual Studio.Net IDE(集成开发环境)中,实现这一关联非常简单,通过定义Xml文件的targetSchema属性就可以完成:
◇将Xml 文件加载到"Xml 设计器"中。
◇切换到"Xml"视图模式。
◇在属性窗口中,从"targetSchema"属性的下拉列表中选择与名字空间相关联的的架构文件。
这时你应该会注意到,targetSchema属性的下拉框将列出该项目包括的所有xml架构及一些建议的规范,包括相应的名字空间。这同时也告诉我们,如果所需要的xml架构并不包含在该项目中,你将需要在这里键入将用于验证 XML 文档的架构的统一资源标识符 (URI)。
完成这几步后,返回查看你的xml源文件,会发现,在根元素内,xml架构以默认名字空间被引用。
附带说明一下,清除targetSchema属性的内容就可以移除xml文档与xml架构间的关联。
3、执行验证操作
将xml架构文件与 Xml源文件关联后,"Xml 设计器"的验证功能可以检查Xml文件是否有效:
◇将要检查的 XML 文件加载到"XML 设计器"中。
◇从"XML"菜单选择"验证 Xml 数据"。
这时,执行验证操作。这一过程也同时检查xml文档的正确性,如果发现错误,状态栏将予以指示。如果发生有效性错误,系统将提示"发现验证错误"并在"任务列表"中提供详细说明,否则,系统提示"未找到验证错误"而通过验证。