Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Esistono due tipi di eccezione che possono verificarsi durante la convalida dello schema: avvisi ed errori. Un avviso si verifica quando il parser rileva un elemento che non comprende e che pertanto non può convalidare. Il parser può continuare a elaborare il documento dell'istanza dopo che si è verificato un avviso. Contrariamente un errore si verifica quando il parser non può completare la propria attività in quanto ha rilevato una situazione non valida.
Avvisi
Un avviso generalmente si verifica quando il parser rileva elementi per i quali non può trovare informazioni sullo schema rispetto alle quali eseguire la convalida.
Nell'esempio che segue XmlValidatingReader genera degli avvisi sugli elementi che non comprende, quali gli elementi html, p, br, b e i. XmlValidatingReader non genera errori quando rileva questi elementi in quanto l'elemento any indica che l'elemento subject può avere una quantità illimitata di markup da qualsiasi spazio dei nomi all'interno del documento XML.
Lo schema XML che segue evidenzia il contenuto di Warning.xsd.
<?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>
Di seguito viene evidenziato il contenuto di Warning.xml che viene processato facendo uso di Warning.xsd.
<?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>
Errori
Un errore è un evento che impedisce al parser di continuare a elaborare il documento XML in corso di convalida. Può verificarsi se un elemento è posizionato in modo non corretto nel modello di contenuto dell'elemento padre.
Nell'esempio che segue viene generato un errore in quanto l'elemento extension non è un elemento figlio valido per l'elemento complexType.
<xs:complexType>
<xs:extension base='xs:decimal'>
<xs:attribute name='sizing' type='xs:string' />
</xs:extension>
</xs:complexType" />
Gestione degli elementi di convalida
Per gestire errori e avvisi, il modello SOM (Schema Object Model) supporta l'utilizzo di un delegato ValidationEventHandler, che rappresenta una callback appositamente progettata. Essa viene chiamata quando un errore o avviso si verifica durante la convalida.
Se viene registrato un ValidationEventHandler, è possibile per il parser recuperare errori eliminando le informazioni non valide e passando quelle sull'errore a ValidationEventHandler. Se non viene specificato alcun ValidationEventHandler, anziché recuperare gli errori, l'elaborazione si interrompe.
Quando si verifica un evento di convalida, ValidationEventHandler passa un oggetto ValidationEventArgs con una proprietà Severity che è possibile utilizzare per determinare la gravità di un evento di convalida. ValidationEventArgs dispone anche di una proprietà Message contenente il messaggio di errore, nonché una proprietà Exception contenente l'eccezione che verrebbe generata se non è stato specificato alcun ValidationEventHandler.
Nella tabella che segue viene illustrata la relazione tra errori e avvisi e ValidationEventHandler.
| ValidationEventHandler | Nessun ValidationEventHandler | |
|---|---|---|
| Avviso | Se ValidationEventHandler viene chiamato con il passaggio di un ValidationEventArgs.Severity equivalente a XmlSeverityType.Warning, l'elaborazione del documento continuerà. | Non viene generata alcuna eccezione e l'elaborazione del documento dello schema prosegue. |
| Errore | Se ValidationEventHandler viene chiamato con il passaggio di un ValidationEventArgs.Severity equivalente a XmlSeverityType.Error, l'elaborazione del documento continua e i dati non validi vengono ignorati. | Non viene generata alcuna eccezione e l'elaborazione del documento dello schema viene interrotta. |
Nell'esempio che segue viene utilizzato un ValidationEventHandler per gestire gli errori di convalida nel file dello schema XML. Sebbene ci siano errori di convalida nel file, l'intero file è convalidato anziché generare un'eccezione alla prima occorrenza di un errore.
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
Lo schema XML che segue evidenzia il contenuto del file di input, Bad_example.xsd.
<?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>
Vedere anche
SOM (Schema Object Model) XML | Convalida del linguaggio XML con schemi