Laden...

XSD Validierung deutlich gesprächiger machen

Erstellt von Seikilos vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.728 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 10 Jahren
XSD Validierung deutlich gesprächiger machen

Ich generiere XML Daten und muss auf der XSD Ebene eine Validierung durchführen.

Gängige Techniken wie XmlDocument.Validate, XDocument.Validate und XmlReader mit einem ValidationEventHandler sehen alle recht ähnlich aus:


public void Validate()
{
  var schemas = new XmlSchemaSet();
  schemas.Add("", fullXsdPath);
  var doc = XDocument.Load(metaXmlFile);
  doc.Validate(schemas,ValidationEventHandler);
}

public void ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            switch (e.Severity)
            {
                case XmlSeverityType.Error:
                    Console.WriteLine("Error: {0}", e.Message);
                    break;
                case XmlSeverityType.Warning:
                    Console.WriteLine("Warning {0}", e.Message);
                    break;
            }

        }

liefern aber sehr magere Ergebnisse aus.
Ich bekomme Meldungen wie > Fehlermeldung:

The 'name' attribute is invalid - The value '' is invalid according to
its datatype 'NonEmptyStringNoWhitespacesAtBeginningAndEnd' - The
Pattern constraint failed.

Diese Meldung hilft mir jedoch nicht weiter, weil es weder den XML Kontext im Sinne von ein paar Zeilen XML um die Stelle herum zeigt noch eine Zeile oder ähnliches ausgibt, wo ich gucken muss.

Die XML kann sehr groß werden und nicht alle "name" attribute sind obligatorisch. Bestimmte Typen können einen Leerstring haben, usw. Aus dieser Meldung ist nicht sehr leicht ableitbar, wo das Problem ist.

Notepad++ mit den XML Tools liefert mir diesbezüglich folgende Ausgabe

Fehlermeldung:
ERROR: Element 'LightSource', attribute 'name': [facet 'minLength'] The value '' has a length of '0'; this underruns the allowed minimum length of '1'.
ERROR: Element 'LightSource', attribute 'name': [facet 'pattern'] The value '' is not accepted by the pattern '.*\S'.
ERROR: Element 'LightSource', attribute 'name': '' is not a valid value of the atomic type 'NonEmptyStringNoWhitespacesAtBeginningAndEnd'.

Damit kann man deutlich mehr anfangen, auch wenn die Antwort sehr technisch ist, so ist doch zumindest das Element zu sehen.

Gibt es einen Weg, wie man deutlich mehr Informationen durch die C# Validierungen bekommen kann?

Life is a short

4.939 Beiträge seit 2008
vor 10 Jahren

Hallo,

in den Eigenschaften e.Exception.LineNumber und e.Exception.LinePosition stehen Zeile und Spalte.
Ich habe mir den Fehlerstring so zusammengesetzt:


string errorMessage = string.Format(
                       "Xml validation failed against schema: '{0}', Message: {1}, Severity: {2}, Line: {3}, Position: {4}",
                       uriXsd, e.Message, e.Severity, e.Exception.LineNumber, e.Exception.LinePosition);

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 10 Jahren

Ich muss sagen, ich bin irritiert.
Ich habe diese Werte bereits im Debugger betrachtet und sie waren damals immer 0 und 0.

Wahrscheinlich habe ich zu dem Zeitpunkt ein in-memory XML mit dem XDocument validiert, klar dass es dort keine Zeilen geben kann.

Danke.

Life is a short

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 10 Jahren

Was mir gerade auffällt, ein Teil der Frage ist noch offen, ob man bei Verletzung von Constraints mehr Details bekommen kann.> Fehlermeldung:

The 'name' attribute is invalid - The value '' is invalid according to
its datatype 'NonEmptyStringNoWhitespacesAtBeginningAndEnd' - The
Pattern constraint failed.

Erfordert einen Blick in die XSD um genau sagen zu können, was fehlgeschlagen ist. auch wenn der lange Name versucht es bereits auszudrücken.

Der XML Parsers von Notepad++ ist wesentlich Aussagekräftiger:> Fehlermeldung:

ERROR: Element 'LightSource', attribute 'name': [facet 'minLength'] The value '' has a length of '0'; this underruns the allowed minimum length of '1'.
ERROR: Element 'LightSource', attribute 'name': [facet 'pattern'] The value '' is not accepted by the pattern '.*\S'.
ERROR: Element 'LightSource', attribute 'name': '' is not a valid value of the atomic type 'NonEmptyStringNoWhitespacesAtBeginningAndEnd'.

Hängt das generell mit der Validator Implementierung in .net zusammen? Die Exception für solche Fälle gibt leider nicht mehr her.

Life is a short