Frage

Ich versuche die XSD -Validierung mit Saxon zu testen. Wenn ich zur tatsächlichen Validierung komme, wird nur der erste Fehler gefangen, da Validator.run () eine Ausnahme ausgelöst hat, wenn er den ersten Fehler erreicht, und danach nicht weitergeht. Dies ist offensichtlich nicht das, was Sie wollen, wenn Sie eine XML -Datei mit vielen Fehlern haben. Gibt es eine Möglichkeit, die Validierung fortzusetzen, nachdem die Ausnahme ausgelöst wurde, oder gibt es eine andere Validierungsmethode mit Saxon?

Dieser Code basiert auf dem einen Beispiel für die Validierung, den Saxon im Dokumentationsordner des Beispiels saxon hat. Dies ist der Abschnitt, der die Validierung ausführt.

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;
        }
    }
}
War es hilfreich?

Lösung

So konfigurierte ich Saxonica, um mehr als einen Fehler zurückzugeben:

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

Arbeitscode unten:

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

Sie können mehr über die sehen Option validation_warnings hier.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top