网络编程
位置:首页>> 网络编程>> XML编程>> 用 Schema 约束 XML 数据

用 Schema 约束 XML 数据

作者:快乐笛子 来源:快乐笛子blog 发布时间:2010-08-24 18:21:00 

标签:XML,Schema,语言

XML 是严格又自由的标记语言。我们都习惯于它的自由特性,自己想怎么定义都行,设计上非常自由,从不会因为它的标记特性约束到设计灵感的发挥。对于其严格特性,很多人的认识只停留在“标签的开始与结束必须一致,且不能错位嵌套”。本文主要想举例子来体现XML的严格特性。

举个例子,总公司需要收集所有子公司每个月份的销售数据(XML格式),这些子公司有些是收购来的,有些子公司产品具有地域特性与产品特性,这些子公司的销售数据不太一致。总公司为了收集这些数据,制定了一套约束数据的规则(Schema),子公司的数据只要通过有效性约束,就可以存入总公司的数据库。下面穿插一段从百度百科来的关于 Schema 的简介:

Schema是用于描述和规范XML文档的逻辑结构的一种语言,它最大的作用就是验证XML文件逻辑结构的正确性。可以理解成与DTD(文档类型定义)功能差不多,但是Schema在当前的WEB开发环境下优越很多。因为它本身就是一个有效的XML文档,因而可以更直观地了解XML的结构。除此之外,Schema支持命名空间,内置多种简单和复杂的数据类型,并支持自定义数据类型。由于存在这么多的优点,所以Schema渐渐成为XML应用的统一规范。

通过上述文字,可以看到 Schema 就是为了约束 XML 而设计的,它本身也是使用 XML 实现的(这是它比DTD更优秀的一个重要原因)。总公司通过设计一套严格的数据约束规范,就可以保证最终进入数据库的数据格式完整统一,可以生成有效的财务报表。

再来一个实际的例子,我的上一篇日志“使用 XMLSPY 设计项目的 Schema 原型 ”有一份定义邮件格式的 Schema 文件,只要发送的邮件数据可以通过该 Schema 的有效性约束,则认为是有效的邮件,可以发送出去。

假定这是一封邮件的XML数据,注意到其根节点引用了命名空间“http://www.w3.org/2001/XMLSchema-instance”,并在该空间下声明了特定的属性xsi:noNamespaceSchemaLocation,其值指向了一个远程的 Schema 文件。当 XML 处理器载入邮件的 XML 数据时,执行验证方法,就会根据 Schema 中的定义去校验数据,通过与否,立马有结果,如果不通过还能知道原因。

Dim dom   
Set dom = CreateObject("MSXML2.DOMDocument.6.0")   
dom.async = False  
dom.resolveExternals = True '处理外部扩展,   
dom.validateOnParse = False '如果为true,则在load的方法内部执行 validate 方法   
Dim status   
status = dom.load("http://www.caizq.com/uploadfiles/20100814175137110.xml")   
MsgBox "载入XML数据:" & status ' 是否成功载入 XML 数据,与 Schema 无关。   
Dim e   
Set e = dom.validate '执行 Schema 校验   
If e.errorCode<>0 Then    
   MsgBox "数据不能通过 Schema 校验,原因:" & Chr(13) & e.reason   
End If  

MSDN 上看到微软正强烈推荐用户使用 MSXML 6.0 以替换 3.0/4.0 等老版本。6.0版本改进了对W3C XSD 1.0 标准的支持,并且提高了与.Net Framework 2.0 中System.Xml的兼容性。新版本简化了 Schema 的加载过程,终于可以告别 3.0 的 XMLSchemaCache COM对象。

根据此代码,制作成一个小工具,用于校验XML数据的有效性:

远程下载:点击下载  本地下载XMLSchema.rar (1.17 KB)

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com