1

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

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

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;
        }
    }
}
4

1 回答 1

1

以下是我配置 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 选项的更多信息。

于 2011-10-26T16:14:39.577 回答