Expresiones regulares y el Modelo de objetos de esquemas
El Modelo de objetos de esquemas (SOM, Schema Object Model) permite un acceso completo a las expresiones regulares especificadas por el W3C (World Wide Web Consortium) en la parte 2, Datatypes, de la recomendación de XML Schema. En el esquema XML, las expresiones regulares se utilizan para restringir los valores de un espacio de valores a aquéllos que coinciden con una expresión regular determinada.
En el ejemplo de código siguiente se crea un esquema XML que define un elemento SKU (Stock Keeping Unit, unidad de conservación en almacén) que sólo puede contener cadenas. Las cadenas tienen restricciones adicionales porque deben comenzar por tres dígitos seguidos de un guión y deben terminar en dos letras del alfabeto.
Imports System.IO
Imports System
Imports System.Xml
Imports System.Xml.Schema
Class RegexSample
Public Shared Sub ValidationCallbackOne(sender As Object, args As ValidationEventArgs)
Console.WriteLine(args.Message)
End Sub 'ValidationCallbackOne
Public Shared Sub Main()
Try
Dim schema As New XmlSchema()
' <xs:element name="quantity">
Dim skuElem As New XmlSchemaElement()
skuElem.Name = "SKU"
schema.Items.Add(skuElem)
' <xs:simpleType name="SKU">
Dim SKUType As New XmlSchemaSimpleType()
skuElem.SchemaType = SKUType
' <xs:restriction base="xs:string">
Dim SKURestriction As New XmlSchemaSimpleTypeRestriction()
SKURestriction.BaseTypeName = New XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema")
SKUType.Content = SKURestriction
'<xs:pattern value="\d{3}-[A-Z]{2}"/>
Dim SKUpattern As New XmlSchemaPatternFacet()
SKUpattern.Value = "\d{3}-[A-Z]{2}"
SKURestriction.Facets.Add(SKUpattern)
'Compile and print to the screen.
schema.Compile(AddressOf ValidationCallbackOne)
schema.Write(Console.Out)
Catch e As Exception
Console.WriteLine(e)
End Try
End Sub
End Class
[C#]
using System.IO;
using System;
using System.Xml;
using System.Xml.Schema;
class RegexSample {
public static void ValidationCallbackOne(object sender, ValidationEventArgs args) {
Console.WriteLine(args.Message);
}
public static void Main() {
try{
XmlSchema schema = new XmlSchema();
// <xs:element name="quantity">
XmlSchemaElement skuElem = new XmlSchemaElement();
skuElem.Name = "SKU";
schema.Items.Add(skuElem);
// <xs:simpleType name="SKU">
XmlSchemaSimpleType SKUType = new XmlSchemaSimpleType();
skuElem.SchemaType = SKUType;
// <xs:restriction base="xs:string">
XmlSchemaSimpleTypeRestriction SKURestriction =
new XmlSchemaSimpleTypeRestriction();
SKURestriction.BaseTypeName =
new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");
SKUType.Content = SKURestriction;
// <xs:pattern value="\d{3}-[A-Z]{2}"/>
XmlSchemaPatternFacet SKUpattern = new XmlSchemaPatternFacet();
SKUpattern.Value = "\\d{3}-[A-Z]{2}";
SKURestriction.Facets.Add(SKUpattern);
// Compile and print to the screen.
schema.Compile(new ValidationEventHandler(ValidationCallbackOne));
schema.Write(Console.Out);
}catch(Exception e){
Console.WriteLine(e);
}
}
}
El ejemplo de código anterior genera la salida siguiente, que es un esquema XML.
<?xml version="1.0" encoding="IBM437"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SKU">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-[A-Z]{2}" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
Restricciones del modelo de expresiones regulares no válidas
Es posible crear un modelo que restrinja un tipo de una manera no válida.
Por ejemplo, el formato del tipo dateTime es CCYY-MM-DDThh:mm:ss
, donde CC
representa el siglo, YY
el año, MM
el mes y DD
el día, precedidos de un signo negativo opcional (-) para indicar un número negativo. Si se omite el signo, se supone que es positivo (+). La letra T
es el separador de fecha y hora, y hh
, mm
y ss
representan la hora, los minutos y los segundos, respectivamente.
En el ejemplo de esquema XML siguiente se intenta restringir el tipo dateTime de forma que refleje el tipo time.
<xs:simpleType name="time">
<xs:restriction base="xs:dateTime">
<xs:pattern value="\d\d:\d\d(:\d\d)?" />
</xs:restriction>
</xs:simpleType>
La restricción del ejemplo anterior no es válida porque no crea un subconjunto del tipo dateTime. En cambio, crea un tipo nuevo y diferente con un conjunto de valores posibles que no se superpone con el conjunto de valores posibles del tipo dateTime.
**Nota **El procesador no avisará si se crea un modelo no válido, pero no validará los documentos de instancia cuyo contenido no coincida con la base del tipo restringido.
Para obtener más información acerca de las expresiones regulares y los esquemas XML, vea los apéndices de la recomendación de XML Schema del W3C acerca de los tipos de datos, que se puede encontrar en la dirección http://www.w3.org/TR/xmlschema-2/\#regexs.