用 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)


猜你喜欢
- 目录一、图示二、准备三、一个简单服务器应用四、向服务器发送图片五、最终关键yolov5调用代码:一、图示客户端请求输入一段视频或者一个视频流
- PDOStatement::executePDOStatement::execute — 执行一条预处理语句(PHP 5 >= 5.1
- 需要把一个从csv文件里读取来的数据集等距抽样分割,这里用到了列表表达式和dataframe.iloc先生成索引列表:index_list
- 本文实例讲述了php常用字符串长度函数strlen()与mb_strlen()用法。分享给大家供大家参考,具体如下:int strlen (
- 目录一、网址分析二、代码编写三、遇到的问题1. 获取评论的时候也将子评论爬虫进去了。2. 获取全部评论数,直接通过 requests 获取不
- 数据库连接:<% set conn=server.createobject("adodb.connection&q
- 其实关于验证码识别涉及很多方面的内容,入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足,对这感兴趣的朋友们下面跟着小编一
- 前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。闲来无事听听歌,听
- 在学习MySQL的过程中,常常会测试各种参数的作用。这时候,就需要快速构建出MySQL实例,甚至主从。 考虑如下场景:譬如我想测试
- python代码实现冒泡排序代码其实很简单,具体代码如下所示:代码Code highlighting produced by Actipro
- 呃,看到这个标题,我们可以首先将IE系浏览器无视了。我承认,我是有极简主义倾向的,我希望能够使用最少的代码和图片做更多的事情。虽然CSS3仅
- 实例如下:</pre><pre name="code" class="python"
- 网上async with和async for的中文资料比较少,我把PEP 492中的官方陈述翻译一下。异步上下文管理器”async with
- 代码如下:create proc p_sword_getblcolumn ( @tblN
- 本文实例讲述了python实现支持目录FTP上传下载文件的方法。分享给大家供大家参考。具体如下:该程序支持ftp上传下载文件和目录、适用于w
- 1. 项目背景视频传输: 在一台电脑上播放视频(捕捉摄像头画面),同局域网内另一台电脑上实时播放,尽量不卡顿。先放最后的照片,和用gif展示
- 目录jQuery的$.ajaxWebpack时代的开始深入了解Promise消灭嵌套await-to-js总结jQuery的$.ajax在开
- 今天拉了一个使用了tornado的项目在本地跑,按照源码作者的步骤配置完,运行,直接报错了,要求环境Python3.6+,我装的是Pytho
- 下载git客户端 FileàDefault Settingà Version Controlà GitPath to Git ex
- 最近项目里要做一个画板,需要对键盘事件进行监听,来进行诸如撤回、重做、移动、缩放等操作,因此顺手实现了一个键盘事件监听控件,期间略有收获,整