码迷,mamicode.com
首页 > Web开发 > 详细

.Net中使用xsd验证xml文档

时间:2015-11-30 22:16:02      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:

在.NET中使用XSD可以方便的验证一个XML文档是否符合规范。这里的XSD本质上是一个xml文件,XSD相当于数据库中的表结构或者C#语言中的一个抽象类,它规定了被验证的目标xml的结构,如目标xml具有哪些节点,每个节点的顺序关系,每个节点的数据类型,每个节点的出现次数等信息。

.NET中通过XmlReader和XmlReaderSettrings类可以方便的对XML进行验证,示例代码如下:

 1         static void Main(string[] args)
 2         {
 3             //指定目标xml的namespace
 4             string ns = "http://www.kui.com";
 5             //创建XmlReaderSettrings对象,该对象传入XmlReader中,在XmlReader读取文档是使用该settings指定的xsd对目标xml进行验证
 6             XmlReaderSettings settings = new XmlReaderSettings();
 7             //将xsd文件出入settring中,改方法的第一个参数指定了待验证的目标xml所具有的namespace,如果传入null则使用xsd中的targetnamespace
 8             //该Add方法有另外3个重载方法,这里不再列举
 9             settings.Schemas.Add(ns,@"books.xsd");    
10             //指定验证类型为Schema(note:验证一个xml是否符合特定格式有多种方式,其中常用的有
11             //XSD和DTD,本例中指定schema即使用XSD方式)
12             settings.ValidationType = ValidationType.Schema;
13             //指定验证过程中如果发生错误的处理函数
14             settings.ValidationEventHandler += new ValidationEventHandler((sender,e) => 
15             { 
16                 Console.WriteLine(e.Message);18             });
19             //创建XmlReader,并传入XmlReaderSettrings对象对Xml进行验证
20             XmlReader rdr = XmlReader.Create(@"books.xml",settings);
21             //读取整个XML文档,如果目标xml中的某个节点验证失败,则会调用ValidationEventHandler指定的函数进行处理
22             while (rdr.Read())
23             {
24             }
25 
26              
27             PressQToExit();
28         }
29 
30         static void PressQToExit()
31         {
32             Console.WriteLine("Press Q key to exit.");
33             ConsoleKey key;
34             do
35             {
36                 key = Console.ReadKey(true).Key;
37             } while (key != ConsoleKey.Q);
38         }

本例中使用的XML文档:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <bookstore xmlns="http://www.kui.com">
 3     <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
 4         <title>The Autobiography of Benjamin Franklin</title>
 5         <author>
 6             <first-name>Benjamin</first-name>
 7             <last-name>Franklin</last-name>
 8         </author>
 9         <price>8.99</price>
10     </book>
11     <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
12         <title>The Confidence Man</title>
13         <author>
14             <first-name>Herman</first-name>
15             <last-name>Melville</last-name>
16         </author>
17         <price>11.99</price>
18     </book>
19     <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
20         <title>The Gorgias</title>
21         <author>
22             <name>Plato</name>
23         </author>
24         <price>9.99</price>
25     </book>
26 </bookstore>

本例中使用的XSD文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <xs:schema attributeFormDefault="unqualified"
 3         elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 4     <xs:element name="bookstore">
 5         <xs:complexType>
 6             <xs:sequence>
 7                 <xs:element maxOccurs="unbounded" name="book">
 8                     <xs:complexType>
 9                         <xs:sequence>
10                             <xs:element name="title" type="xs:string" />
11                             <xs:element name="author">
12                                 <xs:complexType>
13                                     <xs:sequence>
14                                         <xs:element minOccurs="0" name="name"
15                                                 type="xs:string" />
16                                         <xs:element minOccurs="0" name="first-name"
17                                                 type="xs:string" />
18                                         <xs:element minOccurs="0" name="last-name"
19                                                 type="xs:string" />
20                                     </xs:sequence>
21                                 </xs:complexType>
22                             </xs:element>
23                             <xs:element name="price" type="xs:decimal" />
24                         </xs:sequence>
25                         <xs:attribute name="genre" type="xs:string" use="required" />
26                         <xs:attribute name="publicationdate"
27                                 type="xs:string" use="required" />
28                         <xs:attribute name="ISBN" type="xs:string" use="required" />
29                     </xs:complexType>
30                 </xs:element>
31             </xs:sequence>
32         </xs:complexType>
33     </xs:element>
34 </xs:schema>

输出结果为:

技术分享

如果我们将目标XML的结构改变,如将book节点变为book_changed,此时验证会失败,输出结果为:

技术分享

在本例中要注意一个细节就是targetNamespace。如果C#代码中Schema.Add中指定的targetNamespace和待验证的XML文档中的namespace不一致,则验证不会报错,我们会误以为文档通过了验证。实际情况是我们的C#代码中的XmlReader根本就找不到具有该namespace的节点,然后其向后继续寻找一直到文档结束都没找到合适的xml内容,此时验证结束。

比如我们将待验证的xml文档中的默认命名空间改为http://www.omg.com,这我们的程序不会输出任何错误信息.

.Net中使用xsd验证xml文档

标签:

原文地址:http://www.cnblogs.com/kuillldan/p/5008520.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!