代码改变世界

使用XSD文件验证XML文件

2011-07-22 16:18  Johnny Qian  阅读(6460)  评论(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;
}