Condividi tramite


Espressioni regolari e il modello SOM (Schema Object Model)

Il modello SOM (Schema Object Model) consente un accesso completo a espressioni regolari specificate dalla raccomandazione XML Schema Part 2: Datatypes del World Wide Web Consortium (W3C) (informazioni in lingua inglese). Nello schema XML le espressioni regolari vengono utilizzate per limitare uno spazio dei valori ai valori che corrispondono a un'espressione regolare specifica.

L'esempio di codice che segue crea uno schema XML che definisce un elemento SKU (Stock Keeping Unit) che può contenere solo stringhe. Esse sono ulteriormente limitate in quanto devono iniziare con tre cifre, essere seguite da un trattino e terminare con due lettere dell'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);
      }
    }
}

L'output che segue, uno schema XML, viene generato dall'esempio di codice precedente.

<?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>

Restrizioni al modello di espressione regolare non valido

È possibile creare un modello che limita un tipo in un modo non valido.

Il formato del tipo dateTime, ad esempio, è CCYY-MM-DDThh:mm:ss dove CC rappresenta il secolo, YY l'anno, MM il mese e DD il giorno, preceduto da un segno iniziale negativo (-) per indicare un numero negativo. Se viene omesso, si presuppone la presenza di un segno positivo (+). La lettera T è il separatore data/ora e hh, mm, e ss rappresentano rispettivamente l'ora, i minuti e i secondi.

L'esempio di schema XML che segue tenta di limitare il tipo dateTime in modo che assomigli al 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 limitazione nell'esempio precedente non è valida in quanto non crea un sottoinsieme del tipo dateTime. Crea invece un tipo nuovo e differente con una serie di valori potenziali che non si sovrappongono alla serie di valori potenziali del tipo dateTime.

**Nota   **Il processore non segnalerà la creazione di un modello non valido, tuttavia non riuscirà a convalidare tutti i documenti dell'istanza che non corrispondono alla base del tipo limitato.

Per ulteriori informazioni sulle espressioni regolari e gli schemi XML, vedere le appendici della raccomandazione del W3C XML Schema sui Datatype, disponibile all'indirizzo http://www.w3.org/TR/xmlschema-2/\#regexs (informazioni in lingua inglese).

Vedere anche

SOM (Schema Object Model) XML