使用XSD文件验证XML文件
2011-07-22 16:18 Johnny Qian 阅读(6528) 评论(0) 编辑 收藏 举报相信大家对XML文件不会陌生。与XML文件在一起的通常还会有XSD文件。在我初步了解XML的时候就知道这个文件可以用来验证XML文件的schema,但是具体怎么个验证法,怎么用代码来对XML文件做校验,一直是模棱两可。刚好项目中用到了,于是就想写下来。
先来看看XSD文件的介绍。XSD是XML Schema Definition的缩写,翻译成中文就是XML架构定义。它本身也是基于XML文件格式。
XML Schema 的作用是定义 XML 文档的结构XML Schema:
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序
- 定义子元素的数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
在这之前,DTD(Document Type Definition)也曾用来验证XML的schema, 但是XSD比DTD更为强大:
- XML Schema针对将来的额外内容是可扩展的
- XML Schema内容比DTD丰富,作用也更大
- XML Schema是以XML语言编写而成的
- XML Schema支持数据类型
- XML Schema支持名称空间(namespaces)
理论就不多讲了, 详细可参看W3C School的Schema教程。下面来看看怎么使用XSD文件。
1. 使用XSD文件实时辅助XML文件的编辑
在Visual Studio中打开你需要编辑的XML文件,按F4或者从菜单中选择 View->Properties Window打开属性窗口, 选择相应的Schema文件,此时Visual studio的智能提示就会告诉你编辑建议:
在错误的提示处按F12,visual studio 将会定位到schema 的定义位置。在选择schema 的对话框中,我们可以看到VS已经为我们提供了很多的定义好的Schema,其中就有我们见的比较多的W3C定义的schema:
2.使用代码对XML文件进行校验
static void Main(string[] args) { try { ValidateXml(GetXMLFile(), GetSchemaSettings()); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); } // Throw XmlSchemaValidationException/XmlException exception if validation fails public static void ValidateXml(string PubXml, XmlReaderSettings Settings) { // Create the XmlReader object. byte[] bytes = System.Text.Encoding.UTF8.GetBytes(PubXml); using (MemoryStream memoryStream = new MemoryStream(bytes)) { using (XmlReader reader = XmlReader.Create(memoryStream, Settings)) { // Parse the file. while (reader.Read()) ; } } } private static XmlReaderSettings GetSchemaSettings() { XmlReader streamReader = XmlReader.Create("schema.xsd"); // Create the XmlSchemaSet class. XmlSchemaSet sc = new XmlSchemaSet(); // Add the schema to the collection. sc.Add(null, streamReader); XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.Schemas = sc; return settings; } public static string GetXMLFile() { XmlDocument doc = new XmlDocument(); doc.Load("test.xml"); return doc.OuterXml; }
本文基于知识共享署名 2.5 中国大陆许可协议发布,欢迎转载、演绎或用于商业目的,但是必须保留本文的署名Johnny Qian和链接。