标签:
在.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,这我们的程序不会输出任何错误信息.
标签:
原文地址:http://www.cnblogs.com/kuillldan/p/5008520.html