java根据xsd验证json文件_使用架构(XSD)验证XML文件

本文详细介绍了如何使用XML Schema (XSD) 对XML文件进行验证。通过一个订单数据的例子,阐述了XSD在定义数据结构和验证XML文档格式中的作用。文中提供了创建XSD文件的步骤,以及在.NET Framework中使用XMLReaderSettings进行验证的方法,包括处理包含命名空间的XML文件。最后,通过实例展示了如何处理验证过程中遇到的问题和错误。
摘要由CSDN通过智能技术生成

使用架构(XSD)验证XML文件

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

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

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

10248

2009-01-01

1

1

2

20

1

1

2

20

1

1

2

20

1

1

2

20

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

•必须有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

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"

>

【备注】这个架构也可以通过Visual Studio的“XML”菜单=》“创建架构”得到。

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

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

代码文件

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}
", ex.Message);

}

finally

{

reader.Close();

}

if (sb.Length == 0)

Response.Write("该文档是合法的");

else

Response.Write(sb.ToString());

}

void settings_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)

{

sb.AppendFormat("{0}
", e.Message);

}

}

}

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

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

1

2009-1-1

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

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

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

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

1

2009-01-01

1

2

3

3

1

2

3

3

1

2

3

3

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

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

Order.xsd

还有一个Order1.xsd

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

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

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

点击架构右侧的那个按钮

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

•首先,你应该选中Order.xsd和Order1.xsd,并将它们保存到项目根目录。因为他们默认是被创建在临时文件夹的

•为Order.xsd添加一个TargetNamespace

•修改一下代码

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" ?>

1

2009/1/1

1

2

3

3

1

2

3

3

1

2

3

3

小结:

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

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

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

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

本文由作者:陈希章 于 2009/6/19 23:17:33 发布在:http://www.cnblogs.com/chenxizhang/

本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值