Laden...

Mit XSD, ValidationEventHandler ganzen Dokument prüfen

Erstellt von f.ritz vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.710 Views
f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren
Mit XSD, ValidationEventHandler ganzen Dokument prüfen

Hallo zusammen!

Ich möchte mit der vorhandenen XSD-Schema den ganzen XML-Dokument "scannen". D.h. dass er nicht bei dem ersten Fehler die Exception werfen soll, sondern alle vorhandene Fehler, in der XML-Datei, prüfen und anzeigen.

Habt Ihr eine Idee wie man es machen könnte?

S
8.746 Beiträge seit 2005
vor 16 Jahren

Ich verstehe dich Frage nicht ganz. Du kennst doch schon den Event und in der Hilfe steht auch, wie man dafür sorgt, dass er gefeurt wird. Einfach einen Event einhängen und gut ist.

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Das Problenm ist, dass bei einem Fehler die XmlSchemaValidationException ausgelöst wird bevor überhaupt ein Event ausgelöst wurde. Weiter Prüfung findet dann nicht statt...
Ich bin nach diesen Beispiel hier gegangen.

S
8.746 Beiträge seit 2005
vor 16 Jahren

Was ist das für eine Exception?

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Beispiel:
The 'http://www..../wareneinausgangsys:belegdatum' element is invalid - The value '2007.01.01' is invalid according to its datatype 'http://www....../wareneinausgangsys:t_datum' - The string '2007.01.01' is not a valid XsdDateTime value.

S
8.746 Beiträge seit 2005
vor 16 Jahren

Habs mal getestet: Der Beispielcode von MS ist...nunja: GÜLLE.

Da wird ein Reader mit einem Schema beschickt, aber kein (!) Eventhandler eingehängt. Dann wird geladen, und gemäß Doku kommt beim Load() eine Exception. Das nachfolgende Validate() kann ebenfalls nicht klappen, weil das XmlDocument kein Schema zugewiesen bekommen hat. Dafür gibt hier einen Event.

Hängt man den Event (beim Reader), bzw. das Schema (xmlDocument.Schema.Add()) korrekt ein, klappt alles wie erwartet.

Die Frage ist: Was willst du machen? Bei Einlesen validieren (dafür reicht der Settings-Kram) oder nachträglich (z.B. nachdem du das XmlDocument verändert hast) via Validate()? MS macht im Beispiel beides aber keines von beiden richtig. Sehr peinlich.

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Ich verstehe es noch nicht so ganz.
Der Reader hat doch, an sich, gar kein Event und dem XMLDocument kann man auch kann Schema anhängen(so wie es du gezeigt hast)...
Hast du eventuell ein passendes Beispiel?
Mein Ziel ist es ein Vorhandenes XML-Dokument durch ein XSD durchzujagen und eventuelle Fehler auswerfen.

S
8.746 Beiträge seit 2005
vor 16 Jahren

Doch, dem Reader kann mit

xmlReaderSettings.ValidationEventHandler += new ValidationEventHandler(xmlReaderSettings_ValidationEventHandler);

ein entsprechender Event mitgegeben werden. Zuvor muss natürlich auch ein Schema dem reader bekannt gegeben werden. Letzteres hat MS gemacht, das andere nicht. Dadurch wird ein Load(reader) zu einer Exception führen (eben weil der Event fehlt).

Bei Validate() ist das im Prinzip ähnlich, aber damit die Validation funktioniert, muss auch dem XmlDocument ein Schema verpasst werden (das wird nicht vom Reader übernommen!):

document.Schemas.Add(xmlSchema);

Der Event (bzw. Delegate) wird diesmal in der Validate()-Methode übergeben:

document.Validate(xmlReaderSettings_ValidationEventHandler);

Hier hat MS den Event angegeben (zwangsweise), aber vergessen das Schema hinzuzufügen.

Wenn du die oberen beiden Codeschnippsel in das MS-Beispiel einfügst, funzt alles wie erwartet.

S
8.746 Beiträge seit 2005
vor 16 Jahren

Kleine Korrektur: Die Aussage, dass ein Schema nicht aus dem Reader in das XmlDocument übernommen wird, war falsch. Das Gegenteil ist der Fall. Validiert man bereits bei der Eingabe über den Reader, dann wird das Schema automatisch in das XmlDocument übernommen. Ich würde es trotzdem per Hand hinzufügen. Denn wenn man später man das validierende Lesen wegläßt, knallt es sofort beim Validate. Und doppelt hinzufügen schadet nix.

Es braucht also nur Codeschnippsel 1 um die Exceptions verschwinden zu lassen. Du musst allerdings das Schema per Hand dem Document anhängen, wenn du auf das validierende Lesen verzichtest. Sonst meckert Validate(), dass da nix zum Validieren sei...

Insofern ist das Beispiel von MS nicht wirklich Gülle, aber wenig erhellend...

B
121 Beiträge seit 2006
vor 16 Jahren

irgend wie funktioniert das ganze bei mir nicht, spricht der landen nach wie vor im catch Block
[php]
try
{
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.Schemas.Add("urn:myurl", "my.xsd");
xmlReaderSettings.ValidationType = ValidationType.Schema;

            XmlReader reader = XmlReader.Create("my.xml", xmlReaderSettings);  

            xmlReaderSettings.ValidationEventHandler += new ValidationEventHandler(xmlReaderSettings_ValidationEventHandler);  


            XmlDocument document = new XmlDocument();  
            document.Load(reader);  

            document.Validate(xmlReaderSettings_ValidationEventHandler);  


            Console.WriteLine("Fertig");  
            Console.ReadKey();  
        }  
        catch (XmlSchemaValidationException e)  
        {  
            Console.WriteLine("Error: {0}", e.Message);  
            Console.ReadKey();  
        }  

[/php]

[php]
static void xmlReaderSettings_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;
}
}

[/php]

Hat jemand idee warum?

B
121 Beiträge seit 2006
vor 16 Jahren

[php]
xmlReaderSettings.ValidationEventHandler += new ValidationEventHandler(xmlReaderSettings_ValidationEventHandler);

XmlReader reader = XmlReader.Create("my.xml", xmlReaderSettings);
[/php]
ok die Zeielen muss man vertauschen.

Trozdem wird so das ganze Dokument nicht gescant!?