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?
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.
Was ist das für eine Exception?
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.
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.
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.
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.
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...
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?
[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!?