C# - Schemainformationen für das Element konnten nicht gefunden werden?
Hallo,
ich wollte eine Xml-Datei Xsd validieren was aber nicht so funktioniert hat, wie ich es mir vorgestellt habe. Das Programm liest beim klick auf den Öffnen Button die Xml-Datei ein und sollte Schema validieren. Ich bekomme beim klick auf den Öffnen Button aber immer die Meldung:
"Die Schemainformationen für das Element 'Personenkonfiguration' konnten nicht gefunden werden."
Beim klicken auf den OK Button erscheint die selbe Meldung nochmal für die anderen Elemente.
Danke im voraus.
2 Antworten
Spontan hab ich keine Idee, zumindest nicht aus dem Kopf, ich müsste selber probieren, um die Lösung zu finden.
Wenn ich jetzt den eigentlich Fehler lösen müsste, würde ich als erstes ausprobieren, was passiert, wenn ich bei der Angabe für die Schema-Datei den Namespace weg lasse.
Aber warum willst Du überhaupt mit XSD validieren?
Deserialisiere doch die Datei und prüfe danach das Ergebnis. Der XmlSerializer tut das zumindest teilweise schon für dich, er prüft, ob er den Properties, für die er einen Wert, Diesen auch zuweisen kann.
Du musst also prüfen, ob die Properties einen Wert haben und ob er funktioniert. Auf diese Weise hast Du auch weit mehr Möglichkeiten als mit XSD.
Was mir zuerst einmal auffällt: Du benutzt den using-Block falsch. Erst erstellst du das Objekt außerhalb und dann noch nach dem Block für die Schleife. Der using-Block ist aber dazu da, ein Objekt nur in dessen Kontext zu halten. Mit Ende des Blocks wird das Element eigentlich explizit zerstört (es ruft seine Methode Dispose auf).
Also entweder du lässt den Block weg oder du schreibst es so:
using (var xmlFileReader = XmlReader.Create(fileName, xmlReaderSettings)
{
// ...
while (xmlFileReader.Read())
{
}
}
Bei dem xmlReaderSettingsValidationEventHandler kannst du mit einem logischen OR übrigens einige Zeilen Code sparen und die Methodennamen solltest du stets mit einem Großbuchstaben beginnen, um stringent zu bleiben.
Zu deinem Problem:
Wieso nutzt du denn die URL zu W3Schools als Target-Namespace bzw. was wäre denn, wenn du stattdessen das Argument null übergeben würdest? Vergleiche außerdem nochmal mit dem Beispiel aus der Dokumentation: https://msdn.microsoft.com/en-us/library/as3tta56(v=vs.100).aspx