使用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;
}
}
}
下面是我如何配置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选项的信息