用 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)
猜你喜欢
- 使用ASP做网站虽然有点落伍,但在中国还是有很大市场的,因为大部分国内用户使用Windows Server服务器,在Windows Serv
- 在SQL查询中,关键词Like可提供模糊查询功能,它通常与通配符一起使用。1 Like条件适用数据库字段类型 &nbs
- 今天因为做一个效果的时候需要CSS的定位来实现,于是我就根据自己原来对CSS的了解,用absolute和relative摆弄了好一阵子,总是
- LOAD DATA INFILE '文件地址' INTO TABLE 表名 FIELDS TERMINATED BY
- 我们生活在信息繁杂的社会,尤其是在互联网时代,人们开始通过网络开始接触越来越多的信息,那么,如何获取/传递有效而准确的信息将非常重要。在网页
- 1.双击setup.exe.(出现安装向导界面) 2.在安装向导界面:选"基本安装",并选好主目录位置;创建启动数据库(
- 流程,通俗来讲,就是许多人,在做一系列的事情时,怎样相互协调,安排好这一系列事情的先后顺序,有什么事先的约定,需要达到怎样的预期目标。在UE
- 针对border边框属性在浏览器中的渲染方式很早以前就开始在QQ群中看到大家在讨论,而我也一直以border:0 none;的方式处理。其中
- 之前有写过一篇浏览器的tab设计,这回说说网站的tab设计。一说到tab很自然地就想到了导航、信息架构。随着网站信息结构的复杂化,选择tab
- Array.prototype._ = function(){var _p = 0;var _v = 0;(function(){ 
- win7 +Navicat Lite 9+ VMware7在VMware中安装openSUSE11.x mysql5 Navicat Lit
- CSS的出现使网页制作者在对网页元素的控制方便许多,当然,有利必有弊,CSS只能对颜色、大小、距离等静
- 通配符:通配符描述示例%包含零个或更多字符的任意字符串。WHERE title LIKE '%computer%' 将查找处
- 如果是感应触发.就选onmouseover如果是点击触发.就选onclick [把它们两互相替换,就可随时变为感应
- 作者:Dmitry @ Usability Post 版权所有 Copyright.译者:明月星光 @ UCD翻译小组原文:ht
- Mysql Explain 详解一.语法explain < table_name >例如: explain select * f
- 方法一一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大1、设置数
- 一.windows系统的解决方法1.首先以系统管理员身份登陆系统。2.停止MySQL的服务。3.进入命令窗口,然后进入MySQL的安装目录,
- 爱如风过 问:js如何能知道浏览者计算机或者浏览器使用的语言是繁体还是简体?如题,我想用jS检测到浏览者使用的是繁体还是简体中文,以便设置页
- 发现这个也是偶然,在测试的时候发现的,因此问题还发现一个bug。蛮有意思~ 假如输入http://www.aspxhome.com的话,在