源码:
========================================================
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Schema; using System.IO; namespace XsdXmlSample { class Program { const string XML_FILE_NAME = "PRItems.xml"; const string SCHEMA_FILE_NAME = "Schema.xsd"; static void Main(string[] args) { if (ValidateXML(XML_FILE_NAME,SCHEMA_FILE_NAME)) { Console.WriteLine("Validate Sucess!"); Console.ReadLine(); } } static bool ValidateXML(string xmlFile,string schemaFile) { bool isValid = true; try { // XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.Add(null,schemaFile); XmlReaderSettings readerSetting = new XmlReaderSettings(); readerSetting.ValidationType = ValidationType.Schema; readerSetting.Schemas = schemaSet; // using (XmlReader xmlReader = XmlReader.Create(xmlFile, readerSetting)) { while (xmlReader.Read()) { } } } catch (Exception ex) { isValid = false; Console.WriteLine("Validate Failure! Error: {0}",ex.Message); } return isValid; } } }
<?xml version="1.0" encoding="utf-8"?> <xs:schema id="PRItemSchema" targetNamespace="http://tempuri.org/schema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/schema.xsd" xmlns:mstns="http://tempuri.org/schema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:element name="PRItem"> <xs:complexType> <xs:group ref="ItemGroup" minOccurs="1" maxOccurs="unbounded" /> </xs:complexType> </xs:element> <xs:group name="ItemGroup"> <xs:sequence> <xs:element name="Item"> <xs:complexType> <xs:sequence> <xs:element name="Company" type="xs:string" /> <xs:element name="PR_No" type="xs:string" /> <xs:element name="PR_Line" type="xs:int" /> <xs:element name="PO_No" type="xs:string" /> <xs:element name="PR_Complete" type="xs:boolean" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:group> </xs:schema>
<?xml version="1.0" encoding="utf-8" ?> <PRItem> <Item> <Company>KK-GZ</Company> <PR_No>PP-2012063001</PR_No> <PR_Line>200</PR_Line> <PR_Complete>True</PR_Complete> <PO_No>PX-2012063001</PO_No> </Item> <Item> <Company>KK-GZ</Company> <PR_No>PP-2012063002</PR_No> <PR_Line>232</PR_Line> <PR_Complete>False</PR_Complete> <PO_No>PX-2012063002</PO_No> </Item> </PRItem>
========================================================
OK,我们进入问题:
小弟的疑惑的就是,不论我怎么改变我的XML文件结构,我得到的结果都是Validate Success!
例子:
<?xml version="1.0" encoding="utf-8" ?> <PRItem> </PRItem> *********************************************** 通过!!! <?xml version="1.0" encoding="utf-8" ?> <PRItem> <Item> <PR_Complete>True</PR_Complete> <PO_No>PX-2012063001</PO_No> </Item> <Item> <Company>KK-GZ</Company> <PR_No>PP-2012063002</PR_No> </Item> </PRItem> *********************************************** 又通过!!! <?xml version="1.0" encoding="utf-8" ?> <OK></OK> *********************************************** 还通过!!! Oh,Shit . 我无语了。。。
事实告诉我:好像xsd验证没有起到任何效果,就像没有进行验证过一样。
大家都知道 如果我的xml格式与xsd文件描述不一样的话是会抛出异常的,
在我的try catch里面就可以捕捉然后就可以判断是否验证通过。。。
小弟是第一次弄这个东西,请大家帮忙看看代码,我实在看不出问题。。。
大家帮忙分析分析。。。验证原理我是清楚了,我就奇怪我这段代码,为什么
没有效果???
小弟在此先谢过各位!
http://www.cnblogs.com/Teco/archive/2012/03/24/2415693.html也許 能幫助你。
<xs:schema id="PRItemSchema" targetNamespace="http://tempuri.org/schema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/schema.xsd" xmlns:mstns="http://tempuri.org/schema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"
設置 好像不正確哦。自己 修改 調試一下。
非常感谢你的文章,问题解决了!
<?xml version="1.0" encoding="utf-8" ?> <PRItem xmlns="http://tempuri.org/schema.xsd" > <Item> <Company>KK-GZ</Company> <PR_No>PP-2012063001</PR_No> <PR_Line>200</PR_Line> <PO_No>PX-2012063001</PO_No> <PR_Complete>true</PR_Complete> </Item> <Item> <Company>KK-GZ</Company> <PR_No>PP-2012063002</PR_No> <PR_Line>232</PR_Line> <PO_No>PX-2012063001</PO_No> <PR_Complete>false</PR_Complete> </Item> </PRItem>
原来我是没有引用验证的Schema文件 NameSpaces :
"xmlns="http://tempuri.org/schema.xsd"
XmlReader 在执行验证的时候不光需要xsd文件,还需要xml文件显示的
引用xsd的NameSpaces,这样才就可以去匹配验证每个元素。。。
没这样使用过,所以没办法帮你解决,不过,假如是DATASET,可以new一个DATASET来验证看。
另外,检查下xmlReader的read结果看?也许这里的某一个参数的默认配置是忽略错误呢?
谢谢!