XmlSchemaSet para compilación de esquemas
Describe la clase XmlSchemaSet, una caché en la que se pueden almacenar y validar esquemas del lenguaje de definición de esquemas XML (XSD).
La clase XmlSchemaSet
XmlSchemaSet es una caché en la que se pueden almacenar y validar esquemas del lenguaje de definición de esquemas XML (XSD).
En la versión 1.0 de System.Xml, los esquemas se cargaban en una clase XmlSchemaCollection 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 ofrece una comparación entre la clase XmlSchemaCollection y la clase XmlSchemaSet.
XmlSchemaCollection | XmlSchemaSet |
---|---|
Es compatible con los esquemas XML del W3C y del XDR de Microsoft. | Solo es compatible con los esquemas XML del W3C. |
Los esquemas se compilan cuando se llama al método Add. | Los esquemas no se compilan cuando se llama al método Add. 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 producir "islas de esquemas". Como resultado, todas las inclusiones e importaciones solo tienen el ámbito de ese esquema. | Los esquemas compilados generan un esquema único lógico, es decir, un "conjunto" de esquemas. Cualquier esquema importado a un esquema que se haya agregado al conjunto, también se agrega directamente al conjunto. Esto significa que todos los tipos están disponibles para todos los esquemas. |
Solo puede haber en la colección un esquema para un espacio de nombres de destino concreto. | Se pueden agregar varios esquemas para el mismo espacio de nombres de destino siempre y cuando no haya conflictos de tipo. |
Migración a XmlSchemaSet
En el siguiente código muestra se proporciona una guía para realizar la migración a la nueva clase XmlSchemaSet desde la clase XmlSchemaCollection obsoleta. El código muestra ilustra las siguientes diferencias principales entre las dos clases.
Al contrario que el método Add de la clase XmlSchemaCollection, los esquemas no se compilan al llamar al método Add de XmlSchemaSet. El método Compile de XmlSchemaSet se llama explícitamente en el código muestra.
Para iterar sobre XmlSchemaSet, se debe utilizar la propiedad Schemas de XmlSchemaSet.
Éste es el código muestra de XmlSchemaCollection obsoleto.
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);
}
Éste es el código muestra de XmlSchemaSet equivalente.
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);
}
Adición y recuperación de esquemas
Los esquemas se agregan a XmlSchemaSet con el método Add de XmlSchemaSet. Cuando se agrega un esquema a XmlSchemaSet, se asocia a un identificador URI de espacio de nombres de destino. El identificador URI de espacio de nombres de destino se puede especificar como parámetro para el método Add o, si no se especifica ningún espacio de nombres de destino, XmlSchemaSet utiliza el espacio de nombres de destino que se ha definido en el esquema.
Los esquemas se recuperan de XmlSchemaSet con la propiedad Schemas de XmlSchemaSet. La propiedad Schemas de XmlSchemaSet permite iterar sobre los objetos XmlSchema contenidos en XmlSchemaSet. La propiedad Schemas devuelve todos los objetos XmlSchema contenidos en XmlSchemaSet o, dado un parámetro de espacio de nombres de destino, devuelve todos los objetos XmlSchema que pertenecen al espacio de nombres de destino. Si se especifica null
como el parámetro del espacio de nombres de destino, la propiedad Schemas devuelve todos los esquemas sin un espacio de nombres.
En el siguiente ejemplo se agrega el esquema books.xsd
del espacio de nombres http://www.contoso.com/books
a XmlSchemaSet, se recuperan todos los esquemas que pertenecen al espacio de nombres http://www.contoso.com/books
del XmlSchemaSet y, a continuación, se escriben dichos esquemas en 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 objeto XmlSchemaSet, vea la documentación de referencia del método Add y la propiedad Schemas
Compilación de esquemas
Los esquemas de XmlSchemaSet se compilan en un solo esquema lógico por medio del método Compile de XmlSchemaSet.
Nota
A diferencia de la clase XmlSchemaCollection obsoleta, los esquemas no se compilan cuando se llama al método Add.
Si el método Compile se ejecuta correctamente, la propiedad IsCompiled de XmlSchemaSet se establece en true
.
Nota
La propiedad IsCompiled no resulta afectada si se editan los esquemas mientras está en XmlSchemaSet. No se realiza un seguimiento de las actualizaciones de los esquemas individuales en XmlSchemaSet. Como resultado, la propiedad IsCompiled puede ser true
aunque se haya modificado uno de los esquemas contenidos en XmlSchemaSet, siempre y cuando no se hayan agregado ni quitado esquemas de XmlSchemaSet.
En el siguiente ejemplo, 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 XmlSchemaSet, vea la documentación de referencia del método Compile.
Reprocesamiento de esquemas
El reprocesamiento de un esquema en XmlSchemaSet realiza todos los pasos previos al procesamiento que se deben realizar en un esquema cuando se llama al método Add de XmlSchemaSet. Si la llamada al método Reprocess es correcta, la propiedad IsCompiled de XmlSchemaSet se establece en false
.
El método Reprocess se debería utilizar cuando se haya modificado un esquema de XmlSchemaSet después de que XmlSchemaSet haya realizado la compilación.
En el siguiente ejemplo se ilustra el reprocesamiento de un esquema agregado a XmlSchemaSet utilizando el método Reprocess. Después de compilar XmlSchemaSet con el método Compile y después de modificar el esquema agregado a XmlSchemaSet, se establece la propiedad IsCompiled en true
aunque se haya modificado un esquema en XmlSchemaSet. Al llamar al método Reprocess, se realiza todo el procesamiento previo mediante el método Add y la propiedad IsCompiled se establece 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 el reprocesamiento de un esquema en XmlSchemaSet, vea la documentación de referencia del método Reprocess.
Comprobación de un esquema
Puede utilizar el método Contains de XmlSchemaSet para comprobar si hay contenido un esquema en XmlSchemaSet. El método Contains toma un espacio de nombres de destino o un objeto XmlSchema para comprobarlos. En cualquiera de los casos, el método Contains 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, vea la documentación de referencia del método Contains.
Cómo quitar esquemas
Los esquemas se quitan de un XmlSchemaSet utilizando los métodos Remove y RemoveRecursive de XmlSchemaSet. El método Remove elimina el esquema especificado de XmlSchemaSet, mientras el método RemoveRecursive quita el esquema especificado y el resto de los esquemas que importa desde XmlSchemaSet.
El siguiente ejemplo ilustra cómo agregar varios esquemas a XmlSchemaSet y, a continuación, cómo utilizar 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 XmlSchemaSet, vea Remove y la documentación de referencia del método RemoveRecursive.
Resolución de esquemas y xs:import
En los siguientes ejemplos se describe el comportamiento de XmlSchemaSet para importar esquemas cuando existen varios esquemas para un espacio de nombres determinado en XmlSchemaSet.
Por ejemplo, piense en un XmlSchemaSet que contiene múltiples esquemas para el espacio de nombres http://www.contoso.com
. Se agrega un esquema con la directiva xs:import
siguiente a XmlSchemaSet.
<xs:import namespace="http://www.contoso.com" schemaLocation="http://www.contoso.com/schema.xsd" />
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 con esquemas en XmlSchemaSet. Para validar un documento XML, agregue un esquema a la propiedad XmlSchemaSetSchemas de un objeto XmlReaderSettings o agregue XmlSchemaSet a la propiedad Schemas de un objeto XmlReaderSettings. A continuación, el método XmlReaderSettings de la clase Create utiliza el objeto XmlReader para crear un objeto XmlReader y validar el documento XML.
Para más información sobre la validación de documentos XML con una clase XmlSchemaSet, vea Validación de esquema XML (XSD) con XmlSchemaSet.