Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Es gibt zwei Ausnahmeereignisse, die während einer Schemaüberprüfung auftreten können: Warnungen und Fehler. Warnungen treten auf, wenn der Parser ein Element entdeckt, das er nicht identifizieren und somit nicht überprüfen kann. Der Parser kann nach Auftreten der Warnung mit der Verarbeitung des Instanzdokuments fortfahren. Fehler treten auf, wenn der Parser seine Aufgabe nicht fertig stellen kann, weil er mit einer ungültigen Situation konfrontiert worden ist.
Warnungen
Eine Warnung tritt normalerweise dann auf, wenn der Parser Elemente entdeckt, für die er keine Schemainformationen zur Gegenprüfung findet.
Im folgenden Beispiel gibt XmlValidatingReader Warnungen zu Elementen aus, die nicht erkannt werden können, wie z. B. die Elemente html, p, br, b und i. XmlValidatingReader generiert beim Entdecken dieser Elemente jedoch keine Fehler, da das any-Element anzeigt, dass das subject-Element über eine unbegrenzte Menge an Markup von jedem beliebigen Namespace innerhalb des XML-Dokuments verfügen kann.
Im folgenden XML-Schema wird der Inhalt von Warning.xsd dargestellt.
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xs:element name="content" type="contentType" />
<xs:complexType name="contentType">
<xs:sequence>
<xs:element name="subject" type="subjectType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="subjectType" >
<xs:sequence>
<xs:any namespace="##any" processContents="skip" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##any" processContents="skip" />
</xs:complexType>
</xs:schema>
Im folgenden Beispiel wird der Inhalt von Warning.xml dargestellt, der zu Warning.xsd kompiliert wird.
<?xml version="1.0" ?>
<content xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation="Warning.xsd">
<subject>
<html>
<p>sdfsdf</p>
<br/>
<b> bold or <i> italic </i> or strong </b>
</html>
</subject>
</content>
Fehler
Ein Fehler ist ein Ereignis, das die weitere Verarbeitung eines zu überprüfenden XML-Dokuments durch den Parser unterbricht. Ein Fehler kann auftreten, wenn ein Element im Inhaltsmodell seines übergeordneten Elements nicht korrekt positioniert ist.
Im folgenden Beispiel wird ein Fehler generiert, weil das extension-Element kein gültiges untergeordnetes Element für das complexType-Element darstellt.
<xs:complexType>
<xs:extension base='xs:decimal'>
<xs:attribute name='sizing' type='xs:string' />
</xs:extension>
</xs:complexType" />
Behandlung von Überprüfungsereignissen
Zur Behandlung von Fehlern und Warnungen unterstützt das SOM die Verwendung eines ValidationEventHandler-Delegaten. Dabei handelt es sich um einen Rückruf, der von Ihnen entworfen wird. Dieser Rückruf wird bei Auftritt eines Fehlers oder einer Warnung während der Überprüfung aufgerufen.
Ist ein ValidationEventHandler registriert, kann sich der Parser nach Auftritt des Fehlers wieder reaktivieren, indem er die ungültige Information verwirft und die Fehlerinformation an den ValidationEventHandler weitergibt. Ist kein ValidationEventHandler angegeben, wird der Prozess ganz gestoppt und nach Auftritt von Fehlern nicht wieder aufgenommen.
Wenn ein Überprüfungsereignis auftritt, gibt der ValidationEventHandler ein ValidationEventArgs-Objekt mit einer Severity-Eigenschaft weiter, die zur Bestimmung des Überprüfungsgrades eines Überprüfungsereignisses verwendet werden kann. ValidationEventArgs verfügt auch über eine Message-Eigenschaft, die die Fehlermeldung enthält, und außerdem über eine Exception-Eigenschaft. Diese enthält die Ausnahme, die bei fehlender Angabe eines ValidationEventHandler ausgelöst worden wäre.
In der folgenden Tabelle wird die Beziehung zwischen Fehlern, Warnungen und ValidationEventHandler dargestellt.
| ValidationEventHandler | Kein ValidationEventHandler | |
|---|---|---|
| Warnung | Wird der ValidationEventHandler aufgerufen und ein ValidationEventArgs.Severity übergeben, das XmlSeverityType.Warning entspricht, wird mit der Verarbeitung des Dokuments fortgefahren. | Es wird keine Ausnahme ausgelöst und mit der Verarbeitung des Schemadokuments fortgefahren. |
| Fehler | Wird der ValidationEventHandler aufgerufen und ein ValidationEventArgs.Severity übergeben, das XmlSeverityType.Error entspricht, wird mit der Verarbeitung des Dokuments fortgefahren, und die ungültigen Daten werden verworfen. | Es wird eine Ausnahme ausgelöst und die Verarbeitung des Schemadokuments gestoppt. |
Im folgenden Beispiel wird ein ValidationEventHandler verwendet, um die Überprüfungsfehler in der XML-Schemadatei zu behandeln. Beachten Sie, dass trotz vorhandener Überprüfungsfehler die gesamte Datei überprüft wird, anstatt beim ersten Auftreten eines Fehlers eine Ausnahme auszulösen.
Imports System.IO
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Text
Class ReadWriteSample
Public Shared Sub ValidationCallbackOne(sender As Object, args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Warning Then
Console.Write("WARNING: ")
Else
If args.Severity = XmlSeverityType.Error Then
Console.Write("ERROR: ")
End If
End If
Console.WriteLine(args.Message) ' Prints the error to the screen.
End Sub 'ValidationCallbackOne
Public Shared Sub Main()
Try
Dim reader As New XmlTextReader("Bad_example.xsd")
Dim myschema As XmlSchema = XmlSchema.Read(reader, New ValidationEventHandler(AddressOf ValidationCallbackOne))
myschema.Write(Console.Out)
Dim file As New FileStream("New.xsd", FileMode.Create, FileAccess.ReadWrite)
Dim xwriter As New XmlTextWriter(file, New UTF8Encoding())
xwriter.Formatting = Formatting.Indented
myschema.Write(xwriter)
Catch e As Exception
Console.WriteLine(e)
End Try
End Sub 'Main
End Class 'ReadWriteSample
[C#]
using System.IO;
using System;
using System.Xml;
using System.Xml.Schema;
using System.Text;
class ReadWriteSample {
public static void ValidationCallbackOne(object sender, ValidationEventArgs args) {
if(args.Severity == XmlSeverityType.Warning)
Console.Write("WARNING: ");
else if(args.Severity == XmlSeverityType.Error)
Console.Write("ERROR: ");
Console.WriteLine(args.Message); // Print the error to the screen.
}
public static void Main() {
try{
XmlTextReader reader = new XmlTextReader ("Bad_example.xsd");
XmlSchema myschema = XmlSchema.Read(reader, new ValidationEventHandler(ValidationCallbackOne));
myschema.Write(Console.Out);
FileStream file = new FileStream ("New.xsd", FileMode.Create, FileAccess.ReadWrite);
XmlTextWriter xwriter = new XmlTextWriter (file, new UTF8Encoding());
xwriter.Formatting = Formatting.Indented;
myschema.Write (xwriter);
}catch(Exception e){
Console.WriteLine(e);
}
}/* Main() */
}//ReadWriteSample
Im folgenden XML-Schema wird der Inhalt der Eingabedatei Bad_example.xsd dargestellt.
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="Play"
targetNamespace="http://tempuri.org/Play.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/Play.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='myShoeSize'>
<xs:complexType>
<xs:extension base='xs:decimal'>
<xs:attribute name='sizing' type='xs:string' />
<xs:extension />
</xs:extension>
</xs:complexType>
</xs:element>
<player></player>
</xs:schema>
Siehe auch
XML-Schemaobjektmodell (SOM) | Gültigkeitsprüfung von XML mit Schemas