使用C#导入使用XSD验证XML

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C#导入使用XSD验证XML相关的知识,希望对你有一定的参考价值。

我需要针对一组XSD架构验证XML文档。有一个导入其他模式的顶级模式,嵌套模式也可能导入一些模式。例如,模式a.xsd导入b.xsd和c.xsd; b.xsd导入d.xsd。在此示例中,a.xsd是顶级架构。

我使用以下代码进行此类验证:

static void Main(string[] args)
{
    try
    {
        var settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.Schema;
        settings.ConformanceLevel = ConformanceLevel.Document;
        settings.Schemas.Add("targetNs", "path/to/a.xsd");
        settings.ValidationEventHandler += ValidateHandler;

        var reader = XmlReader.Create("path/to/file.xml", settings);
        while (reader.Read()) ;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

private static void ValidateHandler(object sender, ValidationEventArgs e)
{
    Console.WriteLine(e.Message);
}

虽然上面的代码使用嵌套模式进行评估,但是存在一个问题:如果某些嵌套模式是无效的XML文档,则只会忽略它而不会有任何异常。

你能帮帮我解决这个问题吗?

答案

如果需要在验证文档之前验证架构,可以按如下方式执行:

try
{
    using (FileStream fs = File.OpenRead("path/to/a.xsd"))
    {
        XmlSchema schema = XmlSchema.Read(fs, ValidateHandler);
    }
}
catch (Exception e)
{
    throw new Exception("Schema file is invalid. " + e.Message);
}

然后将架构添加到您的设置,如下所示:

schema.TargetNamespace = "targetNs";
settings.Schemas.Addschema(schema);

以上是关于使用C#导入使用XSD验证XML的主要内容,如果未能解决你的问题,请参考以下文章

针对多个模式定义验证 XML 文件

可以在运行时使用代码针对 xsd 验证 xml 吗?

使用 C++ 针对 xsd 验证 xml

可以在运行时使用 Objc/iPhone 代码针对 xsd 验证 xml

如何在 C#2.0 中验证 XML 文件

在 Java 中针对 xsd 的 XML 验证