假使说XML是一个数据库,那么XSD就是这个数据库的结构。由此可见,XSD是如此重要,如果没有它,我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢?那是不可能完成的任务,如果你将XML数据文件当作普通的文本文件去验证的话。

我用下面一个例子来解释如何定义XSD以及如何使用它来验证

1. 首先来看一下我们的数据文件

<?xml version="1.0" encoding="utf-8" ?>
<Order><OrderID>10248</OrderID><OrderDate>2009-01-01</OrderDate><Details><OrderItem><ItemNumber>1</ItemNumber><ProductID>1</ProductID><Quantity>2</Quantity><UnitPrice>20</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>1</ProductID><Quantity>2</Quantity><UnitPrice>20</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>1</ProductID><Quantity>2</Quantity><UnitPrice>20</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>1</ProductID><Quantity>2</Quantity><UnitPrice>20</UnitPrice></OrderItem></Details>
</Order>

这是一个典型的订单数据。我们来分析一下这份文档

  • 必须有OrderID,而且必须是整数型,integer
  • 必须有OrderDate,而且必须是日期型,datetime
  • 必须有至少一个OrderItem,这个Item必须包含四部分信息
    • ItemNumber,integer
    • ProductID,integer
    • Quantity,double
    • UnitPrice,double

2. 我们来定义一个XSD文件。有关XSD的知识很多,有兴趣的朋友可以参考下面这个链接

http://www.w3school.com.cn/schema/index.asp

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="OrderSchema"targetNamespace="http://tempuri.org/OrderSchema.xsd"elementFormDefault="qualified"xmlns="http://tempuri.org/OrderSchema.xsd"xmlns:mstns="http://tempuri.org/OrderSchema.xsd"xmlns:xs="http://www.w3.org/2001/XMLSchema"
><xs:element name="Order"><xs:complexType><xs:sequence><xs:element name="OrderID" type="xs:integer"></xs:element><xs:element name="OrderDate" type="xs:date"></xs:element><xs:element name="Details"><xs:complexType><xs:group ref="OrderItemGroup" minOccurs="1" maxOccurs="unbounded"></xs:group></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><!-- 定义一个OrderItem的复杂类型 --><xs:group name="OrderItemGroup"><xs:sequence><xs:element name="OrderItem"><xs:complexType><xs:sequence><xs:element name="ItemNumber" type="xs:integer"></xs:element><xs:element name="ProductID" type="xs:integer"></xs:element><xs:element name="Quantity" type="xs:double"></xs:element><xs:element name="UnitPrice" type="xs:double"></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:group>
</xs:schema>
 
【备注】这个架构也可以通过Visual Studio的“XML”菜单=》“创建架构”得到。

3. 下面来看看如何使用该架构对数据文件进行验证

.NET Framework并没有提供简单易行的验证方法,我们需要写一些代码

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title></title>
</head>
<body><form id="form1" runat="server"><div><asp:Button ID="btValidateFile" runat="server" Text="验证文档" OnClick="ValidateFile" /></div></form>
</body>
</html>

代码文件

using System;
using System.Text;
using System.Xml;namespace WebApplication1
{public partial class _Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){}StringBuilder sb = null;protected void ValidateFile(object sender, EventArgs e){string dataFile = Server.MapPath("Order.xml");string schemaFile = Server.MapPath("OrderSchema.xsd");string namespaceUrl = "http://tempuri.org/OrderSchema.xsd";XmlReaderSettings settings = new XmlReaderSettings();settings.ValidationType = ValidationType.Schema;settings.Schemas.Add(namespaceUrl, schemaFile);settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler);string errorMessage="这不是一个合乎规范的数据文件";sb = new StringBuilder();XmlReader reader = XmlReader.Create(dataFile, settings);try{reader.MoveToContent();while (reader.Read()){if (reader.NodeType == XmlNodeType.Document && reader.NamespaceURI != namespaceUrl){Response.Write(errorMessage);break;}}}catch (XmlException ex){sb.AppendFormat("{0}<br />", ex.Message);}finally{reader.Close();}if (sb.Length == 0)Response.Write("该文档是合法的");elseResponse.Write(sb.ToString());}void settings_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e){sb.AppendFormat("{0}<br />", e.Message);}}
}

准备就绪之后,我们可以立即按下F5键进行调试。因为现在文档确实是合法的,所以点击按钮之后,会输出一个正确的消息。

我们故意将文档改成下面这样子

<?xml version="1.0" encoding="utf-8" ?>
<Order xmlns="http://tempuri.org/OrderSchema.xsd"><OrderID>1</OrderID><OrderDate>2009-1-1</OrderDate><Details></Details>
</Order> 
我们没有提供OrderItem,同时,OrderDate的格式是不正确的。(XML里面的日期必须是类似这样的格式:YYYY-MM-DD)
此时我们去点击页面中的按钮,就会发现下面这样的错误提示
 
 
小结一下:我们可以通过XMLReader的读取,验证XML文档的合法性。关键点在于我们指定给这个XMLReader一些Settings
这些代码还可以封装一下,以免更好的重复利用。
之前有一位XML方面的MVP也专门写了一个组件,可以方便地做验证。请参考http://msdn.microsoft.com/zh-cn/library/aa468554.aspx

4. 对于有命名空间的情况,则会复杂很多

我已经多次提到如果有命名空间的情况,XML的操作(包括验证和转换等等)都会变得更加复杂。但仍然需要面对这个现实

我们假设,XML数据文件是类似下面的格式

<?xml version="1.0" encoding="utf-8" ?>
<Order xmlns:d="http://www.xizhang.com"><d:OrderID>1</d:OrderID><OrderDate>2009-01-01</OrderDate><Details><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem></Details>
</Order> 

与之前的文档相比,这个文档多了一个命名空间的信息,在OrderID上面,我们加上了命名空间的限定

我们通过点击菜单:“XML”=》“创建架构”来生成架构。它会生成两个文件,分别如下

Order.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:d="http://www.xizhang.com" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://www.xizhang.com" /><xs:element name="Order"><xs:complexType><xs:sequence><xs:element ref="d:OrderID" /><xs:element name="OrderDate" type="xs:date" /><xs:element name="Details"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" name="OrderItem"><xs:complexType><xs:sequence><xs:element name="ItemNumber" type="xs:unsignedByte" /><xs:element name="ProductID" type="xs:unsignedByte" /><xs:element name="Quantity" type="xs:unsignedByte" /><xs:element name="UnitPrice" type="xs:unsignedByte" /></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element>
</xs:schema>

还有一个Order1.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://www.xizhang.com" attributeFormDefault="unqualified" 
elementFormDefault="qualified" targetNamespace="http://www.xizhang.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="OrderID" type="xs:unsignedByte" />
</xs:schema>

我们注意到,在Order.xsd中,用了一个ref的方式,实现了一个元素的引用。其他它是引用了Order1.xsd中的OrderID元素。

但是,我们怎么知道是这样的引用关系呢?我们并没有在Order.XSD中看到这个关系呢

其实是有的。你可以在Order.xsd文件中,按下F4键,查看属性

点击架构右侧的那个按钮

下面我们来测试一下,带有命名空间的情况下如何验证

  • 首先,你应该选中Order.xsd和Order1.xsd,并将它们保存到项目根目录。因为他们默认是被创建在临时文件夹的
  • 为Order.xsd添加一个TargetNamespace
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:d="http://www.xizhang.com" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs=http://www.w3.org/2001/XMLSchema 
targetNamespace="http://www.xizhang.com"><xs:import namespace="http://www.xizhang.com" /><xs:element name="Order"><xs:complexType><xs:sequence><xs:element ref="d:OrderID" /><xs:element name="OrderDate" type="xs:date" /><xs:element name="Details"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" name="OrderItem"><xs:complexType><xs:sequence><xs:element name="ItemNumber" type="xs:unsignedByte" /><xs:element name="ProductID" type="xs:unsignedByte" /><xs:element name="Quantity" type="xs:unsignedByte" /><xs:element name="UnitPrice" type="xs:unsignedByte" /></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element>
</xs:schema>
  • 修改一下代码
            string dataFile = Server.MapPath("Order.xml");string schemaFile = Server.MapPath("Order.xsd");string namespaceUrl = "http://www.xizhang.com";XmlReaderSettings settings = new XmlReaderSettings();settings.ValidationType = ValidationType.Schema;settings.Schemas.Add(namespaceUrl, schemaFile);
            settings.Schemas.Add(namespaceUrl, Server.MapPath("Order1.xsd"));//这里要加第二个文件
 
 
 
同样道理,我们故意去修改一下数据文件
<?xml version="1.0" encoding="utf-8" ?>
<Order xmlns:d="http://www.xizhang.com"><d:OrderID>1</d:OrderID>
  <OrderDate>2009/1/1</OrderDate><Details><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem></Details>
</Order> 
 

小结:

这样我们就完成了对包含有命名空间的XML数据文件的验证工作。这个操作需要两个XML架构文件,他们之间形成一个引用关系。如果有多个不同的命名空间,则可能会有多个辅助的架构文件。

需要注意的是,在Order.xsd中,最好是用下面的语法去定义schemaLocation

<xs:import namespace="http://www.xizhang.com" schemaLocation="Order1.xsd" />

如果这样定义了,代码中就可以省略掉添加第二个架构文件的代码

//settings.Schemas.Add(namespaceUrl, Server.MapPath("Order1.xsd"));//这里要加第二个文件

使用架构(XSD)验证XML文件相关推荐

  1. 针对Java中的XSD验证XML

    有许多工具可用于根据XSD 验证XML文档 . 其中包括操作系统脚本和工具,例如xmllint ,XML编辑器和IDE,甚至是在线验证器. 由于前面提到的方法的局限性或问题,我发现拥有自己的易于使用的 ...

  2. 如何在Java中针对XSD验证XML

    Java XML Validation API can be used to validate XML against XSD in java program. javax.xml.validatio ...

  3. 【XML和Java】手写Java程序引用xsd验证xml

    一.首先要有一个xml文件和xsd文件 (1) database.conf.xml <?xml version="1.0" encoding="UTF-8" ...

  4. java xsd校验,java中使用xsd验证xml | 学步园

    1. 首先要导入包,axiom包请到apache上下载 2. xsd和xml 文件放在工程 bin路径下即可. package xmlValidate; import java.io.ByteArra ...

  5. java xsi type_无法使用BPMN 2.0 XSD验证XML与元素类型“conditionExpression”关联的属性“xsi:type”的前缀“xsi”未绑定...

    嗨我在我的应用程序中使用Activiti框架来管理工作流.我为演示目的创建了一个非常基本的流程定义,它工作得非常好. 但我得到了上述错误,当我在过程定义中包含条件表达式获取上述异常. 以下是流程定义无 ...

  6. java xsd_『XSD校验XML』使用java通过XSD校验XML文件

    本文简单介绍使用java语言,通过XSD文件来校验XML文件结构. XML和XSD介绍 MySQL数据迁移和项目魔法计算器都用到了XML文件,这样可以解耦出配置属性,使项目更加灵活,不用动不动就去改动 ...

  7. 通过xsd校验xml文件

    <script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.sele ...

  8. java xsd校验xml文件

    1.需要maven依赖,版本的话根据自己需求来定 <dependency><groupId>dom4j</groupId><artifactId>dom ...

  9. java xsd 解析 xml文件_xsd解析xml

    下面讲述根据xml生成对应序列化反序列化类的过程,xml需要首先转化为xsd,然后再生成为实体类.其中,XSD是XML Schema Definition的缩写. 1.拥有一个xml文件 2.打开vs ...

最新文章

  1. xtraTabbedMdiManager 双击最大化和关闭后返回主界面 z
  2. OpenStack Swift源码安装
  3. android setContentView()
  4. python npv 计算公式_机器学习各种相似性度量及Python实现
  5. Java 原子类的操作 AtomicInteger
  6. 合格linux运维人员必会的30道shell编程面试题及讲解
  7. ubuntu nginx配置负载均衡篇(二)
  8. shell基础05 处理用户输入
  9. 为什么有的网站要改服务器才能打开吗,为什么有些网站进不了,怎样设置DNS才能进 – 手机爱问...
  10. 安装nginx的过程
  11. Google日历服务快捷、简便
  12. 如何关闭谷歌的安全搜索?
  13. 微服务网关选型,请收下我的膝盖!
  14. win7修复计算机卡了,Win7修复漏洞补丁后系统变卡的原因和解决方法
  15. HTML学生个人网站作业设计:动漫网站设计——梦幻西游(15页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  16. 分形之城--没过,吃宵夜去了,生蚝真好吃
  17. luckysheet 只读模式和编辑模式
  18. 微博爬取(Python)--中大微博前100条微博内容以及评论转发点赞数目爬取
  19. 计算机一级vlookup函数的使用方法,电子档Excel中vlookup函数的使用方法(图解详细说明)...
  20. java注解检验集合对象_Java 对list对象进行属性校验

热门文章

  1. C++实现输出内容存入到TXT文档中
  2. Inductive Robust Principal Component Analysis
  3. R,Python,Scala,Go,Julia
  4. 【研究院】滴滴研究院,都在做什么
  5. [caffe解读] caffe从数学公式到代码实现5-caffe中的卷积
  6. 全球及中国清洁能源发电行业需求容量及应用前景分析报告2021-2027年
  7. openssl简介-指令asn1parse
  8. 兴林村脱贫谋定向往宜居村庄-农业大健康·万祥军:美丽蝶变
  9. C# 移动开发(Xamarin.Form) Plugin.BLE 蓝牙连接
  10. 业务规则的生命周期管理