Generar y editar esquemas XML
Las clases del espacio de nombres System.Xml.Schema se asignan a las estructuras definidas en la recomendación de XML Schema del W3C (World Wide Web Consortium). Puesto que algunos elementos del esquema pueden tener atributos y contener elementos secundarios, las clases correspondientes en SOM (Schema Object Model, Modelo de objetos de esquemas) tienen propiedades que pueden contener atributos y elementos secundarios.
Puede manipular un esquema en la memoria si recorre SOM y establece o anula ciertas propiedades, en función de la creación, inserción o eliminación de nodos y atributos en un documento de esquema. De acuerdo con la recomendación de XML Schema del W3C, el modelo de contenido de un esquema dado es el siguiente:
Content: ((include | import | redefine | annotation)*, (((simpleType | complexType | group | attributeGroup) | element | attribute | notation), annotation*)*).
Al tiempo que se agregan nuevos elementos a SOM, se debe agregar el primer conjunto de elementos del modelo de contenido (include, import y redefine) a la colección Schema.Includes y los demás elementos del modelo de contenido se deben agregar a la colección Schema.Items.
En el ejemplo siguiente se crea un esquema XML vacío, se modifica el esquema para que contenga un elemento Price
con el tipo xs:integer
y, a continuación, se vuelve a modificar el esquema para anidar un elemento simpleType que tiene una base de restricción de xs:positiveInteger
.
Imports System.IO
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Text
Imports Microsoft.VisualBasic
Public Class EditSOM
Public Shared Sub ValidationCallbackOne(sender As Object, args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Warning Then
Console.Write("WARNING: ")
Else
If args.Severity = XmlSeverityType.Error Then
Console.Write("ERROR: ")
End If
End If
Console.WriteLine(args.Message)
End Sub ' ValidationCallbackOne
Public Shared Sub Main()
Dim schema As New XmlSchema()
Console.WriteLine("Printing empty schema...")
schema.Compile(AddressOf ValidationCallbackOne)
schema.Write(Console.Out)
Console.WriteLine(ControlChars.CrLf & ControlChars.CrLf)
Dim priceElem As New XmlSchemaElement()
priceElem.Name = "Price"
priceElem.SchemaTypeName = New XmlQualifiedName("integer", "http://www.w3.org/2001/XMLSchema")
schema.Items.Add(priceElem)
schema.Compile(AddressOf ValidationCallbackOne)
Console.WriteLine("Printing modified schema containing element with type=""integer""")
schema.Write(Console.Out)
Console.WriteLine(ControlChars.CrLf & ControlChars.CrLf)
priceElem.SchemaTypeName = Nothing
Dim PriceType As New XmlSchemaSimpleType()
Dim PriceRestriction As New XmlSchemaSimpleTypeRestriction()
PriceRestriction.BaseTypeName = New XmlQualifiedName("positiveInteger", "http://www.w3.org/2001/XMLSchema")
PriceType.Content = PriceRestriction
Dim maxExclusive As New XmlSchemaMaxExclusiveFacet()
maxExclusive.Value = "100"
PriceRestriction.Facets.Add(maxExclusive)
priceElem.SchemaType = PriceType
schema.Compile(AddressOf ValidationCallbackOne)
Console.WriteLine("Printing modified schema containing element with nested simpleType")
schema.Write(Console.Out)
End Sub 'Main
End Class 'EditSOM
' Main(string[])
' EditSOM
[C#]
using System.IO;
using System;
using System.Xml;
using System.Xml.Schema;
using System.Text;
public class EditSOM {
public static void ValidationCallbackOne(object sender, ValidationEventArgs args) {
if(args.Severity == XmlSeverityType.Warning)
Console.Write("WARNING: ");
else if(args.Severity == XmlSeverityType.Error)
Console.Write("ERROR: ");
Console.WriteLine(args.Message);
}
public static void Main(string[] args){
XmlSchema schema = new XmlSchema();
Console.WriteLine("Printing empty schema...");
schema.Compile(new ValidationEventHandler(ValidationCallbackOne));
schema.Write(Console.Out);
Console.WriteLine("\n\n");
XmlSchemaElement priceElem = new XmlSchemaElement();
priceElem.Name = "Price";
priceElem.SchemaTypeName = new XmlQualifiedName("integer", "http://www.w3.org/2001/XMLSchema");
schema.Items.Add(priceElem);
schema.Compile(new ValidationEventHandler(ValidationCallbackOne));
Console.WriteLine("Printing modified schema containing element with type=\"integer\"");
schema.Write(Console.Out);
Console.WriteLine("\n\n");
priceElem.SchemaTypeName = null;
XmlSchemaSimpleType PriceType = new XmlSchemaSimpleType();
XmlSchemaSimpleTypeRestriction PriceRestriction =
new XmlSchemaSimpleTypeRestriction();
PriceRestriction.BaseTypeName =
new XmlQualifiedName("positiveInteger", "http://www.w3.org/2001/XMLSchema");
PriceType.Content = PriceRestriction;
XmlSchemaMaxExclusiveFacet maxExclusive =
new XmlSchemaMaxExclusiveFacet();
maxExclusive.Value = "100";
PriceRestriction.Facets.Add(maxExclusive);
priceElem.SchemaType = PriceType;
schema.Compile(new ValidationEventHandler(ValidationCallbackOne));
Console.WriteLine("Printing modified schema containing element with nested simpleType");
schema.Write(Console.Out);
}/* Main(string[]) */
}// EditSOM
La salida siguiente se genera a partir del ejemplo de código anterior.
Printing empty schema...
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
</schema>
Printing modified schema containing element with type="integer"
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="Price" type="integer"/>
</schema>
Printing modified schema containing element with nested simpleType
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:apo="http://www.example.com/PO1">
<element name="Price">
<simpleType>
<restiction base="positiveInteger">
<maxExclusive="100" />
</restriction>
</simpleType>
</element>
</schema>
Vea también
Modelo de objetos de esquemas XML (SOM) | Referencia de esquemas XML (XSD) | System.Xml.Schema (Espacio de nombres)