用 Schema 约束 XML 数据

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

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)

标签:XML,Schema,语言
0
投稿

猜你喜欢

  • my.ini(my.cnf)与mysql优化指南

    2009-12-15 16:20:00
  • MYSQL教程:数据列类型与查询效率

    2009-02-27 15:37:00
  • ASP读取MySQL数据库出现乱码的解决办法

    2010-03-08 14:25:00
  • asp如何用FileSystemObject组件来做一个站内搜索?

    2010-06-12 12:47:00
  • 兼容低版本 IE 的 JScript 5.5 实现

    2008-07-01 12:48:00
  • asp好用的函数集分享

    2011-09-13 12:49:07
  • MySQL Group By用法

    2012-01-05 19:05:14
  • 用ASP显示ACCESS数据库的GIF图象

    2008-11-16 18:09:00
  • MySQL中隐藏空间问题浅析

    2009-11-24 09:04:00
  • 细节设计之美:扩大可操作区域

    2009-08-01 11:32:00
  • 教你快速掌握 MySQL数据库中触发器的应用

    2008-12-03 15:33:00
  • 在SQL Server中使用索引的技巧

    2009-02-24 17:50:00
  • Asp.net实现简单的文字水印

    2007-08-24 09:28:00
  • ajax返回中文乱码问题解决

    2009-04-13 16:07:00
  • asp如何选择访问速度最快的站点?

    2010-06-10 18:34:00
  • 带你轻松接触MaxDB和MySQL之间的协同性

    2008-12-03 17:10:00
  • asp中怎么输出双引号?

    2008-01-31 13:30:00
  • 【推荐】汉字转为拼音的asp函数

    2007-08-17 11:11:00
  • 如何自己制作验证码的head.fix和body.fix文件

    2009-06-01 12:50:00
  • Oracle 启动例程 STARTUP参数说明

    2009-07-07 10:26:00
  • asp之家 网络编程 m.aspxhome.com