Entwickler-Ecke

IO, XML und Registry - XML mit XSD prüfen


Iceman8080 - Mi 08.08.18 13:23
Titel: XML mit XSD prüfen
Hallo zusammen,

ich möchte eine XML Datei gegen eine XSD Datei prüfen. Das funktioniert soweit auch ganz gut mit XMLDocument.Validate.

Jetzt werden allerdinge Errors ausgegeben, sobald in dem XML File ein neues Attribute hinzukommt, was im XSD File nicht aufgeführt ist. Da ich aber nicht bei jedem neuen Attribut im XML, was ich für meine Auswertung eh nicht benutze, ein Fehler geworfen wird, würde ich gerne dem Validate oder im XSD sagen: "Prüfe alles was in der XSD steht und wenn im XML was ist, was nicht definiert ist, ignoriere es".

Geht sowas? bzw. versteht Ihr was ich meine? ;-)

Vielen Dank bereit für Euere Hilfe.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Mi 08.08.18 18:57

Hallo und :welcome:

kannst du denn nicht im ValidationEventHandler auf spezielle Fehler prüfen, wie z.B. in einer der Antworten in How to ignore the validation of Unknown tags? [https://stackoverflow.com/questions/2402452/how-to-ignore-the-validation-of-unknown-tags]


Iceman8080 - Do 09.08.18 07:36

Coole Idee. Allerdings Ändert sich der Error-Text je nach dem was für eine Sprache man eingestellt hat. Somit ist das nicht gerade universell einsetzbar. Ich habe mich nun damit beholfen den ErrorCode abzufragen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
 
        /// <summary>
        /// XML vs. XSD Validation Eventhandler
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            switch (e.Severity)
            {
                case XmlSeverityType.Error:
                    // Ignore Attributes which are not in XSD defined... We don't need them
                    if (((uint)e.Exception.HResult) != 0x80131941)
                    {
                        Log.Message("XML Error: " + e.Message.ToString(), Log.EventType.ERROR);
                        m_xml_errors++;
                    }
                    break;
                case XmlSeverityType.Warning:
                    Log.Message("XML Warning: " + e.Message.ToString(), Log.EventType.WARNING);
                    break;
            }
        }


Danke für Euere Hilfe.

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt