Validation XSD с использованием саксонского API
-
28-10-2019 - |
Вопрос
Я пытаюсь проверить проверку XSD с помощью саксонского. Когда я добираюсь до фактической проверки, только первая ошибка поймана, потому что validator.run () бросает исключение, когда она доходит до первой ошибки и не продолжается впоследствии. Это, очевидно, не то, что вы хотите, когда у вас есть XML -файл со многими ошибками. Есть ли способ продолжить проверку после того, как исключение брошено или есть другой метод проверки с использованием саксона?
Этот код основан на одном примере для проверки, который Saxon имеет в папке документации Sakes 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;
}
}
}
Решение
Вот как я настроил саксонику, чтобы вернуть более одной ошибки:
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 здесь.