Compartir a través de


XmlSchemaSet para la compilación de esquemas

Describe , XmlSchemaSetuna caché donde se pueden almacenar y validar los esquemas del lenguaje de definición de esquemas XML (XSD).

La clase XmlSchemaSet

XmlSchemaSet es una memoria caché en la que se pueden almacenar y validar los esquemas del lenguaje de definición de esquemas XML (XSD).

En System.Xml la versión 1.0, los esquemas XML se cargaron en una XmlSchemaCollection clase como una biblioteca de esquemas. En la versión 2.0 de System.Xml, las clases XmlValidatingReader y XmlSchemaCollection están obsoletas y se han reemplazado por los métodos Create y la clase XmlSchemaSet, respectivamente.

XmlSchemaSet se introdujo para solucionar una serie de problemas, entre los que se incluyen la compatibilidad con estándares, el rendimiento y el formato obsoleto de esquemas reducidos de datos XML (XDR) de Microsoft.

A continuación se muestra una comparación entre la XmlSchemaCollection clase y la XmlSchemaSet clase .

XmlSchemaCollection XmlSchemaSet
Admite esquemas XML de Microsoft XDR y W3C. Solo admite esquemas XML W3C.
Los esquemas se compilan cuando se llama al Add método . Los esquemas no se compilan cuando se llama al Add método . Esto proporciona una mejora del rendimiento durante la creación de la biblioteca de esquemas.
Cada esquema genera una versión compilada individual que puede dar lugar a "islas de esquema". Como resultado, todos los ámbitos de inclusión e importación solo están dentro de ese esquema. Los esquemas compilados generan un único esquema lógico, un "conjunto" de esquemas. Los esquemas importados dentro de un esquema que se agregan al conjunto se agregan directamente al conjunto. Esto significa que todos los tipos están disponibles para todos los esquemas.
Solo puede existir un esquema para un espacio de nombres de destino determinado en la colección. Se pueden agregar varios esquemas para el mismo espacio de nombres de destino siempre que no haya conflictos de tipos.

Migración a XmlSchemaSet

En el ejemplo de código siguiente se proporciona una guía para migrar a la nueva XmlSchemaSet clase de la clase obsoleta XmlSchemaCollection . En el ejemplo de código se muestran las siguientes diferencias principales entre las dos clases.

A continuación se muestra el ejemplo de código obsoleto 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);  
}  

A continuación se muestra el ejemplo de código equivalente 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);  
}  

Agregar y recuperar esquemas

Los esquemas se agregan a un XmlSchemaSet mediante el método Add de XmlSchemaSet. Cuando se agrega un esquema a un XmlSchemaSet, está asociado con un URI de espacio de nombres de destino. El URI del espacio de nombres de destino se puede especificar como parámetro para el Add método o si no se especifica ningún espacio de nombres de destino, XmlSchemaSet usa el espacio de nombres de destino definido en el esquema.

Los esquemas se recuperan de un XmlSchemaSet mediante la propiedad Schemas del XmlSchemaSet. La propiedad Schemas de XmlSchemaSet permite iterar sobre los objetos XmlSchema contenidos en XmlSchemaSet. La Schemas propiedad devuelve todos los XmlSchema objetos contenidos en XmlSchemaSeto, dado un parámetro de espacio de nombres de destino, devuelve todos los XmlSchema objetos que pertenecen al espacio de nombres de destino. Si null se especifica como parámetro de espacio de nombres de destino, la Schemas propiedad devuelve todos los esquemas sin un espacio de nombres.

En el ejemplo siguiente, se agrega el esquema books.xsd en el espacio de nombres http://www.contoso.com/books a un XmlSchemaSet, se recuperan todos los esquemas que pertenecen al espacio de nombres http://www.contoso.com/books desde el XmlSchemaSet, y luego se escriben esos esquemas en el 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);  
}  

Para obtener más información sobre cómo agregar y recuperar esquemas de un XmlSchemaSet objeto, vea el Add método y la documentación de referencia de propiedades Schemas .

Compilar esquemas

Los esquemas de un XmlSchemaSet se compilan en un esquema lógico mediante el método Compile de XmlSchemaSet.

Nota:

A diferencia de la clase obsoleta XmlSchemaCollection , los esquemas no se compilan cuando se llama al Add método .

Si el Compile método se ejecuta correctamente, la IsCompiled propiedad de XmlSchemaSet se establece en true.

Nota:

La IsCompiled propiedad no se ve afectada si los esquemas se editan mientras se encuentran en .XmlSchemaSet No se realiza un seguimiento de las actualizaciones de los esquemas individuales de XmlSchemaSet . Como resultado, la IsCompiled propiedad puede ser true incluso aunque se haya modificado uno de los esquemas contenidos en , XmlSchemaSet siempre y cuando no se hayan agregado ni quitado ningún esquema de XmlSchemaSet.

En el ejemplo siguiente, se agrega el archivo books.xsd a XmlSchemaSet, y a continuación se llama al método 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();  

Para obtener más información sobre la compilación de esquemas en un XmlSchemaSet, consulte la documentación de referencia del Compile método.

Reprocesamiento de esquemas

Al volver a procesar un esquema en XmlSchemaSet, se realizan todos los pasos de preprocesamiento realizados en un esquema cuando se llama al método Add del XmlSchemaSet. Si la llamada al Reprocess método se realiza correctamente, la IsCompiled propiedad de XmlSchemaSet se establece en false.

El Reprocess método se debe usar cuando se ha modificado un esquema de XmlSchemaSet una vez realizada la XmlSchemaSet compilación.

En el ejemplo siguiente se muestra cómo volver a procesar un esquema agregado al XmlSchemaSet mediante el Reprocess método . Una vez que el XmlSchemaSet se compila utilizando el método Compile y se modifica el esquema agregado a XmlSchemaSet, la propiedad IsCompiled se establece en true aunque se haya modificado un esquema en XmlSchemaSet. Al llamar al método Reprocess, se realiza todo el preprocesamiento llevado a cabo por el método Add y se establece la propiedad IsCompiled en 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);  

Para obtener más información sobre cómo volver a procesar un esquema en un XmlSchemaSet, consulte la documentación de referencia del método Reprocess.

Comprobación de un esquema

Puede usar el Contains método de XmlSchemaSet para comprobar si un esquema está contenido en un XmlSchemaSet. El método Contains toma un espacio de nombres de destino o un objeto XmlSchema para comprobarlos. En cualquier caso, el Contains método devuelve true si el esquema está contenido en XmlSchemaSet; de lo contrario, devuelve false.

Para obtener más información sobre la comprobación de un esquema, consulte la documentación de referencia del Contains método.

Eliminar esquemas

Los esquemas se quitan de un XmlSchemaSet utilizando los métodos Remove y RemoveRecursive de XmlSchemaSet. El Remove método quita el esquema especificado de XmlSchemaSet, mientras que el RemoveRecursive método quita el esquema especificado y todos los esquemas que importa de .XmlSchemaSet

En el ejemplo siguiente se muestra cómo agregar varios esquemas a un XmlSchemaSet y luego usar el método RemoveRecursive para quitar uno de los esquemas y todos los esquemas que importa.

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);  
   }  
}  

Para obtener más información sobre cómo quitar esquemas de un XmlSchemaSet, consulte la documentación de referencia sobre los métodos Remove y RemoveRecursive.

Resolución de esquemas y xs:import

En los ejemplos siguientes se describe el XmlSchemaSet comportamiento para importar esquemas cuando existen varios esquemas para un espacio de nombres determinado en un XmlSchemaSet.

Por ejemplo, considere un XmlSchemaSet que contiene varios esquemas para el http://www.contoso.com espacio de nombres. Se agrega un esquema con la siguiente directiva xs:import a XmlSchemaSet.

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

El XmlSchemaSet intenta importar un esquema para el espacio de nombres http://www.contoso.com cargándolo desde la URL http://www.contoso.com/schema.xsd. En el esquema de importación solo están disponibles los tipos y la declaración de esquema que se declaran en el documento de esquema, aunque hay otros documentos de esquema para el espacio de nombres http://www.contoso.com en XmlSchemaSet. Si no se puede encontrar el archivo schema.xsd en la URL http://www.contoso.com/schema.xsd, no se importa ningún esquema para el espacio de nombres http://www.contoso.com al esquema de importación.

Validación de documentos XML

Los documentos XML se pueden validar contra esquemas en un XmlSchemaSet. Para validar un documento XML, agregue un esquema a la XmlSchemaSetSchemas propiedad de un XmlReaderSettings objeto o agregue un XmlSchemaSet objeto a la Schemas propiedad de un XmlReaderSettings objeto. Después, el método de la clase XmlReaderSettings usa el objeto Create para crear un objeto XmlReader y validar el documento XML.

Para obtener más información sobre cómo validar documentos XML mediante un XmlSchemaSet, vea Validación del esquema XML (XSD) con XmlSchemaSet.

Consulte también