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("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaCollection.Add("http://www.contoso.com/books", "http://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("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaCollection.Add("http://www.contoso.com/books", "http://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("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaSet.Add("http://www.contoso.com/books", "http://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("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaSet.Add("http://www.contoso.com/books", "http://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 usa 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 http://www.contoso.com/books a un tipo XmlSchemaSet, vengono recuperati tutti gli schemi appartenenti allo spazio dei nomi http://www.contoso.com/books dal tipo XmlSchemaSet, quindi vengono scritti tali schemi nel tipo Console.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet  
schemaSet.Add("http://www.contoso.com/books", "books.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema In schemaSet.Schemas("http://www.contoso.com/books")  
  
   schema.Write(Console.Out)  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/books", "books.xsd");  
  
foreach (XmlSchema schema in schemaSet.Schemas("http://www.contoso.com/books"))  
{  
   schema.Write(Console.Out);  
}  

Per altre 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.

Nota

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.

Nota

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("http://www.contoso.com/books", "books.xsd")  
schemaSet.Compile()  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/books", "books.xsd");  
schemaSet.Compile();  

Per altre 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 usare 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 usando 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("http://www.contoso.com/books", "http://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("http://www.contoso.com/books", "http://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 altre informazioni sulla rielaborazione di uno schema di un tipo XmlSchemaSet, vedere la documentazione di riferimento per il metodo Reprocess.

Verifica di uno schema

È possibile usare 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 altre 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 usando 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'uso del metodo RemoveRecursive per rimuovere uno degli schemi e tutti gli schemi da esso importati.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema In schemaSet.Schemas()  
  
   If schema.TargetNamespace = "http://www.contoso.com/music" Then  
      schemaSet.RemoveRecursive(schema)  
   End If  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd");  
  
foreach (XmlSchema schema in schemaSet.Schemas())  
{  
   if (schema.TargetNamespace == "http://www.contoso.com/music")  
   {  
      schemaSet.RemoveRecursive(schema);  
   }  
}  

Per altre 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 xs:import uno schema con la seguente direttiva XmlSchemaSet.

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

Il tipo XmlSchemaSet tenterà di importare uno schema per lo spazio dei nomi http://www.contoso.com caricandolo dall'URL http://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 http://www.contoso.com nel tipo XmlSchemaSet. Se non è possibile individuare il file schema.xsd nell'URL http://www.contoso.com/schema.xsd, non verrà importato alcuno schema per lo spazio dei nomi http://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à XmlSchemaSet di un oggetto Schemas del tipo XmlReaderSettings oppure aggiungere un tipo XmlSchemaSet alla proprietà Schemas di un oggetto XmlReaderSettings. Quindi l'oggetto XmlReaderSettings verrà usato dal metodo Create della classe XmlReader per creare un oggetto XmlReader e convalidare il documento XML.

Per altre informazioni sulla convalida di documenti XML tramite XmlSchemaSet, vedere Convalida di XML Schema (XSD) con XmlSchemaSet.

Vedi anche