Condividi tramite


XmlSchemaSet per la compilazione di schemi

Viene descritto XmlSchemaSet, ovvero una cache in cui è possibile archiviare e convalidare gli schemi XSD (XML Schema Definition Language).

La classe XmlSchemaSet

Il tipo XmlSchemaSet è una cache in cui è possibile archiviare e convalidare gli schemi XSD (XML Schema Definition Language).

In System.Xml versione 1.0, gli schemi XML venivano caricati in una classe XmlSchemaCollection come una libreria di schemi.In System.Xml versione 2.0, le classi XmlValidatingReader e XmlSchemaCollection sono obsolete e sono state sostituite dai metodi Create e dalla classe XmlSchemaSet rispettivamente.

Il tipo XmlSchemaSet è stato introdotto per risolvere una serie di problemi che includono la compatibilità con gli standard, le prestazioni e il formato obsoleto dello schema XDR (XML-Data Reduced) di Microsoft.

Di seguito viene riportato un confronto tra le classi XmlSchemaCollection e XmlSchemaSet.

XmlSchemaCollection

XmlSchemaSet

Supporta gli schemi XDR di Microsoft e gli schemi XML di W3C.

Supporta solo gli schemi XML di W3C.

Gli schemi vengono compilati quando si chiama il metodo Add.

Gli schemi non vengono compilati quando si chiama il metodo Add.Questo fornisce prestazioni migliori durante la creazione della libreria di schemi.

Ogni schema consente di generare una singola versione compilata che può creare "isole di schemi". Di conseguenza, tutte le operazioni di inclusione e importazione vengono eseguite nell'ambito di tale schema.

Gli schemi compilati consentono di generare un singolo schema logico, ovvero un "set" di schemi.Gli schemi importati all'interno di uno schema vengono aggiunti direttamente al set.Ciò significa che tutti i tipi sono disponibili per tutti gli schemi.

Nella raccolta può essere presente solo uno schema per un determinato spazio dei nomi di destinazione.

È possibile aggiungere più schemi per lo stesso spazio dei nomi di destinazione, a condizione che non si verifichino conflitti di tipi.

Migrazione a XmlSchemaSet

Nel seguente esempio di codice viene fornita una guida per eseguire la migrazione alla nuova classe XmlSchemaSet dalla classe obsoleta XmlSchemaCollection.Nell'esempio di codice vengono illustrate le seguenti differenze principali tra le due classi.

Di seguito è riportato l'esempio di codice obsoleto del tipo XmlSchemaCollection.

Dim schemaCollection As XmlSchemaCollection = New XmlSchemaCollection()
schemaCollection.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd")
schemaCollection.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd")

Dim schema As XmlSchema

For Each schema in schemaCollection

   Console.WriteLine(schema.TargetNamespace)

Next
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd");
schemaCollection.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");

foreach(XmlSchema schema in schemaCollection)
{
   Console.WriteLine(schema.TargetNamespace);
}

Di seguito è riportato l'esempio di codice equivalente del tipo XmlSchemaSet.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd")
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd")
schemaSet.Compile()

Dim schema As XmlSchema

For Each schema in schemaSet.Schemas()

   Console.WriteLine(schema.TargetNamespace)

Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd");
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");
schemaSet.Compile();

foreach(XmlSchema schema in schemaSet.Schemas())
{
   Console.WriteLine(schema.TargetNamespace);
}

Aggiunta e recupero di schemi

Gli schemi vengono aggiunti a un tipo XmlSchemaSet mediante il metodo Add del tipo XmlSchemaSet.Quando viene aggiunto a un tipo XmlSchemaSet, uno schema viene associato a un URI dello spazio dei nomi di destinazione.L'URI dello spazio dei nomi può essere specificato sia come parametro per il metodo Add oppure, se non viene specificato alcuno spazio dei nomi, il tipo XmlSchemaSet utilizza lo spazio dei nomi definito nello schema.

Gli schemi vengono recuperati da un tipo XmlSchemaSet mediante la proprietà Schemas del tipo XmlSchemaSet.La proprietà Schemas del tipo XmlSchemaSet consente di scorrere gli oggetti XmlSchema contenuti nel tipo XmlSchemaSet.La proprietà Schemas restituisce tutti gli oggetti XmlSchema contenuti nel tipo XmlSchemaSet oppure, se viene fornito un parametro per lo spazio dei nomi di destinazione, restituisce tutti gli oggetti XmlSchema che appartengono allo spazio dei nomi di destinazione.Se è specificato null come parametro per lo spazio dei nomi di destinazione, la proprietà Schemas restituisce tutti gli schemi privi di uno spazio dei nomi.

Nell'esempio seguente viene aggiunto lo schema books.xsd dello spazio dei nomi https://www.contoso.com/books a un tipo XmlSchemaSet, vengono recuperati tutti gli schemi appartenenti allo spazio dei nomi https://www.contoso.com/books dal tipo XmlSchemaSet, quindi vengono scritti tali schemi nel tipo Console.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet
schemaSet.Add("https://www.contoso.com/books", "books.xsd")

Dim schema As XmlSchema

For Each schema In schemaSet.Schemas("https://www.contoso.com/books")

   schema.Write(Console.Out)

Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/books", "books.xsd");

foreach (XmlSchema schema in schemaSet.Schemas("https://www.contoso.com/books"))
{
   schema.Write(Console.Out);
}

Per ulteriori informazioni sull'aggiunta e sul recupero di schemi da un oggetto XmlSchemaSet, vedere la documentazione di riferimento per il metodo Add e per la proprietà Schemas.

Compilazione di schemi

Gli schemi di un tipo XmlSchemaSet vengono compilati in un singolo schema logico dal metodo Compile del tipo XmlSchemaSet.

NotaNota

A differenza della classe obsoleta XmlSchemaCollection, gli schemi non vengono compilati quando si chiama il metodo Add.

Se il metodo Compile viene eseguito correttamente, la proprietà IsCompiled del tipo XmlSchemaSet viene impostata su true.

NotaNota

La proprietà IsCompiled non viene influenzata se si apportano modifiche agli schemi contenuti nel tipo XmlSchemaSet.Non viene tenuta traccia degli aggiornamenti dei singoli schemi del tipo XmlSchemaSet.Di conseguenza, la proprietà IsCompiled può essere true anche se viene modificato uno degli schemi contenuti nel tipo XmlSchemaSet, a condizione che non venga aggiunto o rimosso alcuno schema dal tipo XmlSchemaSet.

Nell'esempio seguente viene aggiunto il file books.xsd al tipo XmlSchemaSet, quindi viene chiamato il metodo Compile.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("https://www.contoso.com/books", "books.xsd")
schemaSet.Compile()
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/books", "books.xsd");
schemaSet.Compile();

Per ulteriori informazioni sulla compilazione di schemi di un tipo XmlSchemaSet, vedere la documentazione di riferimento per il metodo Compile.

Rielaborazione di schemi

Nella rielaborazione di uno schema di un tipo XmlSchemaSet vengono eseguiti tutti i passaggi di pre-elaborazione eseguiti su uno schema quando si chiama il metodo Add del tipo XmlSchemaSet.Se la chiamata al metodo Reprocess viene eseguita correttamente, la proprietà IsCompiled del tipo XmlSchemaSet viene impostata su false.

È necessario utilizzare il metodo Reprocess quando uno schema del tipo XmlSchemaSet è stato modificato dopo la compilazione del tipo XmlSchemaSet.

Nel seguente esempio viene illustrata la rielaborazione di uno schema aggiunto al tipo XmlSchemaSet mediante il metodo Reprocess.Dopo aver compilato il tipo XmlSchemaSet utilizzando il metodo Compile e dopo aver modificato lo schema aggiunto al tipo XmlSchemaSet, la proprietà IsCompiled viene impostata su true benché sia stato modificato uno schema del tipo XmlSchemaSet.Se si chiama il metodo Reprocess verranno eseguiti tutti i passaggi di pre-elaborazione eseguiti dal metodo Add e la proprietà IsCompiled verrà impostata su false.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
Dim schema As XmlSchema = schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd")
schemaSet.Compile()

Dim element As XmlSchemaElement = New XmlSchemaElement()
schema.Items.Add(element)
element.Name = "book"
element.SchemaTypeName = New XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema")

schemaSet.Reprocess(schema)
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchema schema = schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");
schemaSet.Compile();

XmlSchemaElement element = new XmlSchemaElement();
schema.Items.Add(element);
element.Name = "book";
element.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");

schemaSet.Reprocess(schema);

Per ulteriori informazioni sulla rielaborazione di uno schema di un tipo XmlSchemaSet, vedere la documentazione di riferimento per il metodo Reprocess.

Verifica di uno schema

È possibile utilizzare il metodo Contains del tipo XmlSchemaSet per verificare se uno schema è contenuto in un tipo XmlSchemaSet.Per eseguire la verifica, il metodo Contains accetta uno spazio dei nomi di destinazione oppure un oggetto XmlSchema.In entrambi i casi, il metodo Contains restituisce true se lo schema è contenuto in un tipo XmlSchemaSet; in caso contrario, restituisce false.

Per ulteriori informazioni sulla verifica di uno schema, vedere la documentazione di riferimento per il metodo Contains.

Rimozione di schemi

Gli schemi vengono rimossi da un tipo XmlSchemaSet utilizzando i metodi Remove e RemoveRecursive del tipo XmlSchemaSet.Il metodo Remove consente di rimuovere dal tipo XmlSchemaSet lo schema specificato, mentre il metodo RemoveRecursive consente di rimuovere dal tipo XmlSchemaSet lo schema specificato e tutti gli schemi da esso importati.

Nell'esempio seguente viene illustrata l'aggiunta di schemi a un tipo XmlSchemaSet e l'utilizzo del metodo RemoveRecursive per rimuovere uno degli schemi e tutti gli schemi da esso importati.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd")
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd")
schemaSet.Add("https://www.contoso.com/music", "https://www.contoso.com/music.xsd")

Dim schema As XmlSchema

For Each schema In schemaSet.Schemas()

   If schema.TargetNamespace = "https://www.contoso.com/music" Then
      schemaSet.RemoveRecursive(schema)
   End If

Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd");
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");
schemaSet.Add("https://www.contoso.com/music", "https://www.contoso.com/music.xsd");

foreach (XmlSchema schema in schemaSet.Schemas())
{
   if (schema.TargetNamespace == "https://www.contoso.com/music")
   {
      schemaSet.RemoveRecursive(schema);
   }
}

Per ulteriori informazioni sulla rimozione di schemi da un tipo XmlSchemaSet, vedere la documentazione di riferimento per i metodi Remove e RemoveRecursive.

Risoluzione di schemi e xs:import

Nei seguenti esempi viene descritto il comportamento del tipo XmlSchemaSet per l'importazione di schemi quando sono presenti più schemi per un determinato spazio dei nomi in XmlSchemaSet.

Ad esempio, si consideri un tipo XmlSchemaSet che contenga più schemi per lo spazio dei nomi http://www.contoso.com.Verrà aggiunto al tipo XmlSchemaSet uno schema con la seguente direttiva xs:import.

<xs:import namespace="https://www.contoso.com" schemaLocation="https://www.contoso.com/schema.xsd" />

Il tipo XmlSchemaSet tenterà di importare uno schema per lo spazio dei nomi https://www.contoso.com caricandolo dall'URL https://www.contoso.com/schema.xsd.Nello schema di importazione sono disponibili solo la dichiarazione dello schema e i tipi dichiarati nel documento dello schema, anche se sono presenti altri documenti dello schema per lo spazio dei nomi https://www.contoso.com nel tipo XmlSchemaSet.Se non è possibile individuare il file schema.xsd nell'URL https://www.contoso.com/schema.xsd, non verrà importato alcuno schema per lo spazio dei nomi https://www.contoso.com.

Convalida di documenti XML

I documenti XML possono essere convalidati in base agli schemi di un tipo XmlSchemaSet.Per eseguire la convalida di un documento XML, è necessario aggiungere uno schema alla proprietà Schemas di un oggetto XmlReaderSettings del tipo XmlSchemaSet oppure aggiungere un tipo XmlSchemaSet alla proprietà Schemas di un oggetto XmlReaderSettings.Quindi l'oggetto XmlReaderSettings verrà utilizzato dal metodo Create della classe XmlReader per creare un oggetto XmlReader e convalidare il documento XML.

Per ulteriori informazioni sulla convalida di documenti XML utilizzando un tipo XmlSchemaSet, vedere Convalida dello schema XML (XSD) con XmlSchemaSet.

Vedere anche

Riferimenti

Add

Schemas

Contains

Compile

Reprocess

Remove

RemoveRecursive

Concetti

XmlSchemaSet per la compilazione di schemi

Convalida dello schema XML (XSD) con XmlSchemaSet