Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Mit XSD, ValidationEventHandler ganzen Dokument prüfen
f.ritz
myCSharp.de - Member

Avatar #avatar-2331.jpg


Dabei seit:
Beiträge: 341
Herkunft: Sibirien

Themenstarter:

Mit XSD, ValidationEventHandler ganzen Dokument prüfen

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von svenson am .
private Nachricht | Beiträge des Benutzers
f.ritz
myCSharp.de - Member

Avatar #avatar-2331.jpg


Dabei seit:
Beiträge: 341
Herkunft: Sibirien

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Was ist das für eine Exception?
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von svenson am .
private Nachricht | Beiträge des Benutzers
f.ritz
myCSharp.de - Member

Avatar #avatar-2331.jpg


Dabei seit:
Beiträge: 341
Herkunft: Sibirien

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von svenson am .
private Nachricht | Beiträge des Benutzers
f.ritz
myCSharp.de - Member

Avatar #avatar-2331.jpg


Dabei seit:
Beiträge: 341
Herkunft: Sibirien

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von svenson am .
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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...
Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von svenson am .
private Nachricht | Beiträge des Benutzers
bigpoint
myCSharp.de - Member



Dabei seit:
Beiträge: 121
Herkunft: Bayern

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
bigpoint
myCSharp.de - Member



Dabei seit:
Beiträge: 121
Herkunft: Bayern

beantworten | zitieren | melden

[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!?
private Nachricht | Beiträge des Benutzers