スキーマ オブジェクト モデル (SOM) は、W3C『XML Schema Part 2: Datatypes Recommendation』で指定された正規表現に完全にアクセスできます。XML スキーマでは、特定の正規表現と一致する値に値スペースを制約するために、正規表現が使用されます。
次のコード例では、文字列だけを含むことのできる SKU (在庫管理単位) 要素を定義する XML スキーマを作成しています。これらの文字列には、上の制約以外にも、先頭は 3 桁の数字、続けてハイフン、2 文字の英字で終了するという制約があります。
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);
}
}
}
次の 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>
無効な正規表現パターン制限
型を制限するために作成したパターンが無効である場合があります。
たとえば、dateTime 型の形式は、CCYY-MM-DDThh:mm:ss
となります。CC
は世紀、YY
は年、MM
は月、DD
は日を表し、先頭に省略可能な負の (-) 符号を付けて、負の値を示します。この符号を省略すると、正の (+) 値であると見なされます。文字 T
は日付/時刻の区切り記号で、hh
、mm
、および ss
は時、分、および秒を表します。
dateTime 型を制限して time 型のようにしようとする XML スキーマの例を次に示します。
<xs:simpleType name="time">
<xs:restriction base="xs:dateTime">
<xs:pattern value="\d\d:\d\d(:\d\d)?" />
</xs:restriction>
</xs:simpleType>
上の例の制限は、dateTime 型のサブセットを作成しないため、無効です。代わりに、ここでは、出現の可能性のある dateTime 型の値のセットとは重複しない、新規の異なる種類の値のセットを作成します。
**メモ **無効なパターンを作成してもプロセッサは警告しません。ただし、制限された型のベースと一致しない内容を含むすべてのインスタンス ドキュメントは検証されません。
正規表現と XML スキーマの詳細については、http://www.w3.org/TR/xmlschema-2/#regexs にある W3C『XML Schema Recommendation on Datatypes』の付録を参照してください。