使用Saxon API的XSD验证

本文关键字:XSD 验证 API Saxon 使用 | 更新日期: 2023-09-27 18:08:05

我正在尝试使用Saxon测试Xsd验证。当我进行实际验证时,只有第一个错误被捕获,因为validator.Run()在遇到第一个错误时抛出异常,之后不再继续执行。当您的xml文件有许多错误时,这显然不是您想要的。是否有一种方法可以在抛出异常后继续验证,或者是否有使用Saxon的另一种验证方法?

这段代码基于Saxon文档的samples文件夹中的一个验证示例,这是运行验证的部分。

SchemaValidator validator = manager.NewSchemaValidator();
using (Stream xmlFile = File.OpenRead(fileName))
{
    using (XmlReader xmlValidatingReader = XmlReader.Create(xmlFile))
    {
        validator.SetSource(xmlValidatingReader);
        validator.ErrorList = new ArrayList();
        try
        {
            validator.Run();
        }
        catch (Exception)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("Instance validation failed with " + validator.ErrorList.Count + " errors");
            foreach (StaticError error in validator.ErrorList)
            {
                sb.AppendLine("At line " + error.LineNumber + ": " + error.Message);
                tbXsdOutput.Text = sb.ToString();
            }
            return;
        }
    }
}

使用Saxon API的XSD验证

下面是我如何配置Saxonica返回多个错误的:

proc.SetProperty(net.sf.saxon.lib.FeatureKeys.VALIDATION_WARNINGS,"true");

工作代码如下:

static void Main(string[] args)
{
    try
    {
        errors = new ArrayList();
        Saxon.Api.Processor proc = new Processor(true);
        proc.SetProperty(net.sf.saxon.lib.FeatureKeys.VALIDATION_WARNINGS,"true");
        //this is the property to set!
        SchemaManager schemaManager = proc.SchemaManager;
        FileStream xsdFs = new FileStream(@"C:'path'to.xsd", FileMode.Open);
        schemaManager.Compile(XmlReader.Create(xsdFs));
        SchemaValidator schemaValidator = schemaManager.NewSchemaValidator();
        FileStream xmlFs = new FileStream(@"C:'path'to.xml", FileMode.Open);
        schemaValidator.SetSource(XmlReader.Create(xmlFs));
        schemaValidator.ErrorList = errors;
        schemaValidator.Run();
    }
    catch(net.sf.saxon.type.ValidationException e)
    {
        foreach(StaticError error in errors)
        {
            Console.WriteLine(error.ToString());
        }
        Console.ReadKey(true);
        Environment.Exit(0);
    }
    foreach (StaticError error in errors)
    {
        Console.WriteLine(error.ToString());
    }
    Console.ReadKey(true);
}

您可以在这里看到更多关于VALIDATION_WARNINGS选项的信息