用 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
投稿

猜你喜欢

  • Golang+Vue轻松构建Web应用的方法步骤

    2024-05-29 22:06:42
  • python Matplotlib基础--如何添加文本和标注

    2022-09-17 15:51:05
  • Python中的 ansible 动态Inventory 脚本

    2022-10-23 07:53:08
  • SQL Server 2000 SP4补丁打不上的解决办法

    2010-03-08 13:13:00
  • 基于python 爬虫爬到含空格的url的处理方法

    2023-04-16 09:55:47
  • javascript面向对象编程(四)

    2008-03-07 14:20:00
  • 从网页设计开始

    2008-06-30 12:17:00
  • js使用栈来实现10进制转8进制与取除数及余数

    2024-04-19 09:52:12
  • 浅谈视觉设计的准确性

    2007-09-18 17:59:00
  • Python中赋值运算符的含义与使用方法

    2022-05-21 12:13:45
  • Matplotlib中rcParams使用方法

    2022-12-14 03:41:46
  • python获取代码运行时间的实例代码

    2023-11-04 02:25:10
  • Python机器学习入门(五)之Python算法审查

    2021-10-15 09:27:48
  • pandas实现按行选择的示例代码

    2021-08-04 01:53:50
  • python Graham求凸包问题并画图操作

    2023-06-01 12:37:00
  • django 连接数据库 sqlite的例子

    2023-08-03 19:03:15
  • 关于DOM元素定位属性的深入学习

    2008-04-02 11:46:00
  • 如何用Python进行回归分析与相关分析

    2023-11-24 01:08:14
  • Python配置文件yaml的用法详解

    2023-07-04 21:02:56
  • SQLServer2005与SQLServer2008数据库同步图文教程

    2024-01-27 22:17:54
  • asp之家 网络编程 m.aspxhome.com