XML Validierung mit XSD Schema und xmldocument.validate methode

  • C#
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von stepper71.

    XML Validierung mit XSD Schema und xmldocument.validate methode

    Hallo,

    ich schlage mich mit der Validierung von XML Dateien durch XSD Schemas herum und hatte eigentlich unter msdn.microsoft.com/de-de/library/ms162371(v=vs.110).aspx eine übersichtliche Möglichkeit gefunden wie eine xml Datei mit einem xsd shema validiert werden kann.

    Mein Code sieht so aus:


    C#-Quellcode

    1. void Test()
    2. {
    3. // Set the validation settings.
    4. XmlReaderSettings settings = new XmlReaderSettings();
    5. settings.Schemas.Add("urn:skogforsk:stanford2010", "HarvestedProduction_V2p1.xsd");
    6. settings.ValidationType = ValidationType.Schema;
    7. XmlReader reader = XmlReader.Create(@"..\..\Harvester2.1.xml", settings);
    8. //XML Document erzeugen
    9. XmlDocument xmldoc = new XmlDocument();
    10. xmldoc.Load(reader);
    11. ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
    12. //Validierung durchführen
    13. xmldoc.Validate(eventHandler);
    14. }
    15. static void ValidationEventHandler(object sender, ValidationEventArgs e)
    16. {
    17. switch (e.Severity)
    18. {
    19. case XmlSeverityType.Error:
    20. Console.WriteLine("Error: {0}", e.Message);
    21. break;
    22. case XmlSeverityType.Warning:
    23. Console.WriteLine("Warning {0}", e.Message);
    24. break;
    25. }
    26. }


    Mein Problem ist, das scheinbar die Validierung schon mit dem Laden der XML Datei in der Zeile 13 (xmldoc.Load(reader);) stattfindet.
    Wenn die XML Datei zum XSD Schema passt, läuft der Code so durch.
    Wenn ich in der XML Datei eine Änderung vornehme (z.B. Knoten umbenenne) erhalte ich bereits beim laden die Meldung:

    "Ein Ausnahmefehler des Typs "System.Xml.Schema.XmlSchemaValidationException" ist in System.Xml.dll aufgetreten.

    Zusätzliche Informationen: Das Element 'Machine' in Namespace 'urn:skogforsk:stanford2010' hat ein ungültiges untergeordnetes Element 'MachineOwner2' in Namespace 'urn:skogforsk:stanford2010'. Erwartet wurde die Liste der möglichen Elemente: 'RegistrationNumber, MachineOwner' in Namespace 'urn:skogforsk:stanford2010'."

    Laut Beispiel sollte die Validierung erst durch den Befehl xmldoc.validate erfolgen.
    Was bringt mir jetzt die Validierung wenn bereits beim laden diese erfoglt und einen Programmabruch hervorruft?

    Was mache ich hier falsch?

    Vielen Dank für jede Hilfe im voraus!

    Gruß
    Horten

    stepper71 schrieb:

    Was bringt mir jetzt die Validierung wenn bereits beim laden diese erfoglt und einen Programmabruch hervorruft?
    Naja, was soll eine Validierung denn schon bringen? Sie sagt dir, dass die Daten ungültig sind.

    stepper71 schrieb:

    Was mache ich hier falsch?
    NIx - aber ich sehe auch kein Problem.
    Es ist doch das erwünschte Verhalten, dass ungültige Daten garnet erst geladen werden, oder?
    Es ist doch das erwünschte Verhalten, dass ungültige Daten garnet erst geladen werden, oder?


    Im Prinzip ja, aber... wenn das schon von Microsoft als Beispiel angeführt wird und es nicht so funktioniert bin ich erstmal skeptisch.
    Somit wäre die xmldocument.validate Methode vollkommen unbrauchbar.

    Gefühlt wäre es auch eleganter das über den Eventhandler abzugangen als über ein Try Catch oder ist das im Prinzip das gleiche?
    Der XmlReader validiert, weil du ihn dazu angewiesen hast: settings.ValidationType = ValidationType.Schema;. Die Einstellungen scheint der XmlReader an das erstelle XmlDocument weiterzureichen. Wenn du das nicht willst, lade das Dokument ohne Validierung und validiere explizit erst später:

    C#-Quellcode

    1. // Default: No validation
    2. XmlReader reader = XmlReader.Create(@"..\..\Harvester2.1.xml");
    3. //XML Document erzeugen
    4. XmlDocument xmldoc = new XmlDocument();
    5. xmldoc.Load(reader);
    6. xmldoc.Schemas.Add("urn:skogforsk:stanford2010", "HarvestedProduction_V2p1.xsd");
    7. ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
    8. //Validierung durchführen
    9. xmldoc.Validate(eventHandler);

    Das XmlDocument ist im Speicher änderbar. Die Validate-Methode ermöglicht es, das XmlDocument ggf. erneut zu validieren.
    Gruß
    hal2000