【问题标题】:Validate an XML against XSD with imports using C#使用 C# 通过导入验证 XML 与 XSD
【发布时间】:2018-08-08 02:37:25
【问题描述】:

我需要根据一组 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 文档,它就会被忽略,没有任何异常。

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

【问题讨论】:

    标签: c# xml xsd xsd-validation


    【解决方案1】:

    如果您需要在验证文档之前验证架构,您可以执行以下操作:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多