Convalida XSD (XML Schema) con XmlSchemaCollection
È possibile usare il tipo XmlSchemaCollection per convalidare un documento XML in base a schemi XSD (XML Schema Definition Language). Il tipo XmlSchemaCollection migliora le prestazioni archiviando gli schemi nella raccolta in modo che non vengano caricati in memoria ogni volta che viene eseguita la convalida. Se lo schema esiste nella raccolta di schemi, l'attributo schemaLocation
verrà usato per cercare lo schema nella raccolta.
Importante
La classe XmlSchemaCollection è obsoleta ed è stata sostituita dalla classe XmlSchemaSet. Per altre informazioni sulla classe XmlSchemaSet, vedere XmlSchemaSet per la compilazione di schemi.
Nell'esempio seguente viene illustrato l'elemento radice di un file di dati.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:bookstore-schema"
elementFormDefault="qualified"
targetNamespace="urn:bookstore-schema">
In questo esempio, il valore dell'attributo targetNamespace
è urn:bookstore-schema
, ovvero lo stesso spazio dei nomi usato quando si aggiunge lo schema all'oggetto XmlSchemaCollection.
Nell'esempio di codice seguente viene aggiunto uno schema XML al tipo XmlSchemaCollection.
Dim xsc As New XmlSchemaCollection()
' XML Schema.
xsc.Add("urn:bookstore-schema", schema)
reader = New XmlTextReader(filename)
vreader = New XmlValidatingReader(reader)
vreader.Schemas.Add(xsc)
XmlSchemaCollection xsc = new XmlSchemaCollection();
// XML Schema.
xsc.Add("urn:bookstore-schema", schema);
reader = new XmlTextReader (filename);
vreader = new XmlValidatingReader (reader);
vreader.Schemas.Add(xsc);
In genere, l'attributo targetNamespace
viene usato per aggiungere la proprietà namespaceURI
nel metodo Add per l'oggetto XmlSchemaCollection. È possibile specificare un riferimento null prima di aggiungere lo schema al tipo XmlSchemaCollection. Per gli schemi senza uno spazio dei nomi è necessario usare una stringa vuota (""). Nel tipo XmlSchemaCollection può essere presente solo uno schema senza uno spazio dei nomi.
Nell'esempio di codice seguente viene aggiunto uno schema XML, HeadCount.xsd, al tipo XmlSchemaCollection e viene eseguita la convalida di HeadCount.xml.
Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Schema
Namespace ValidationSample
Class Sample
Public Shared Sub Main()
Dim tr As New XmlTextReader("HeadCount.xml")
Dim vr As New XmlValidatingReader(tr)
vr.Schemas.Add("xsdHeadCount", "HeadCount.xsd")
vr.ValidationType = ValidationType.Schema
AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler
While vr.Read()
End While
Console.WriteLine("Validation finished")
End Sub
' Main
Public Shared Sub ValidationHandler(sender As Object, args As ValidationEventArgs)
Console.WriteLine("***Validation error")
Console.WriteLine("Severity:{0}", args.Severity)
Console.WriteLine("Message:{0}", args.Message)
End Sub
' ValidationHandler
End Class
' Sample
End Namespace
' ValidationSample
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
namespace ValidationSample
{
class Sample
{
public static void Main()
{
XmlTextReader tr = new XmlTextReader("HeadCount.xml");
XmlValidatingReader vr = new XmlValidatingReader(tr);
vr.Schemas.Add("xsdHeadCount", "HeadCount.xsd");
vr.ValidationType = ValidationType.Schema;
vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);
while(vr.Read());
Console.WriteLine("Validation finished");
}
public static void ValidationHandler(object sender, ValidationEventArgs args)
{
Console.WriteLine("***Validation error");
Console.WriteLine("\tSeverity:{0}", args.Severity);
Console.WriteLine("\tMessage :{0}", args.Message);
}
}
}
Di seguito viene indicato il contenuto del file di input, HeadCount.xml, da convalidare.
<!--Load HeadCount.xsd in SchemaCollection for Validation-->
<hc:HeadCount xmlns:hc='xsdHeadCount'>
<Name>Waldo Pepper</Name>
<Name>Red Pepper</Name>
</hc:HeadCount>
Di seguito viene indicato il contenuto del file di XML Schema, HeadCount.xsd, in base al quale eseguire la convalida.
<xs:schema xmlns="xsdHeadCount" targetNamespace="xsdHeadCount" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='HeadCount' type="HEADCOUNT"/>
<xs:complexType name="HEADCOUNT">
<xs:sequence>
<xs:element name='Name' type='xs:string' maxOccurs='unbounded'/>
</xs:sequence>
<xs:attribute name='division' type='xs:int' use='optional' default='8'/>
</xs:complexType>
</xs:schema>
Nell'esempio di codice seguente viene creato un XmlValidatingReader che accetta un XmlTextReader. Il file di input, sample4.xml, viene convalidato in base a XML Schema, sample4.xsd.
Dim tr As New XmlTextReader("sample4.xml")
Dim vr As New XmlValidatingReader(tr)
vr.ValidationType = ValidationType.Schema
vr.Schemas.Add("datatypesTest", "sample4.xsd")
AddHandler vr.ValidationEventHandler, AddressOf ValidationCallBack
While vr.Read()
Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name)
End While
XmlTextReader tr = new XmlTextReader("sample4.xml");
XmlValidatingReader vr = new XmlValidatingReader(tr);
vr.ValidationType = ValidationType.Schema;
vr.Schemas.Add("datatypesTest", "sample4.xsd");
vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
while(vr.Read()) {
Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name);
}
Di seguito viene indicato il contenuto del file di input, sample4.xml, da convalidare.
<datatypes xmlns="datatypesTest">
<number>
<number_1>123</number_1>
</number>
</datatypes>
Di seguito viene indicato il contenuto del file di XML Schema, sample4.xsd, in base al quale eseguire la convalida.
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="datatypesTest"
targetNamespace="datatypesTest"
elementFormDefault="qualified">
<xs:element name = "datatypes">
<xs:complexType>
<xs:all>
<xs:element name="number">
<xs:complexType>
<xs:sequence>
<xs:element name="number_1" type="xs:decimal" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per