XmlValidatingReader を使用した XML スキーマ (XSD) に基づく検証
更新 : November 2007
XML スキーマ定義言語 (XSD) スキーマ検証は、W3C (World Wide Web Consortium) 勧告『XML Schema』で定義されている検証制約を使用して実装されます。Microsoft .NET Framework は、W3C 勧告『XML Schema 2001』をサポートしています。つまり、すべての XML スキーマには、名前空間 http://www.w3c.org/2001/XMLSchema がインクルードされている必要があります。
XML スキーマは、それぞれが名前空間 URI (Uniform Resource Identifier) に関連付けられています。XmlValidatingReader は、データ ファイル内の XML スキーマ (XSD) の schemaLocation 属性を使用できます。この属性は、XML スキーマ インスタンスの名前空間 http://www.w3.org/2001/XMLSchema-instance に関連付けられています。スキーマが XmlSchemaCollection に格納されている場合、XmlValidatingReader は、スキーマがコレクションに追加されたときに指定された名前空間 URI を使用します。通常、この URI がそのスキーマのターゲット名前空間です。
XmlValidatingReader は、schemaLocation 属性を使用して XML スキーマを識別します。データ ファイルのルート要素の例を次に示します。
<bookstore xmlns="urn:bookstore-schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:bookstore-schema books.xsd">
メモ : |
---|
.NET Framework version 2.0 では、XmlValidatingReader クラスが廃止されています。XmlReaderSettings クラスと Create メソッドを使用して、検証用の XmlReader インスタンスを作成できます。詳細については、「XmlReader による XML データの検証」を参照してください。 |
例
XmlTextReader を受け取る XmlValidatingReader を作成するコード サンプルを次に示します。XML スキーマ ファイル HeadCount.xsd を基準として、入力ファイル HeadCount.xml を検証します。
Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Schema
Namespace ValidationSample
Class Sample
Public Shared Sub Main()
Dim tr As New XmlTextReader("HeadCount.xml")
Dim vr As New XmlValidatingReader(tr)
vr.ValidationType = ValidationType.Schema
AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler
While vr.Read()
PrintTypeInfo(vr)
If vr.NodeType = XmlNodeType.Element Then
While vr.MoveToNextAttribute()
PrintTypeInfo(vr)
End While
End If
End While
Console.WriteLine("Validation finished")
End Sub
' Main
Public Shared Sub PrintTypeInfo(vr As XmlValidatingReader)
If Not (vr.SchemaType Is Nothing) Then
If TypeOf vr.SchemaType Is XmlSchemaDatatype Or TypeOf vr.SchemaType Is XmlSchemaSimpleType Then
Dim value As Object = vr.ReadTypedValue()
Console.WriteLine("{0}({1},{2}):{3}", vr.NodeType, vr.Name, value.GetType().Name, value)
Else
If TypeOf vr.SchemaType Is XmlSchemaComplexType Then
Dim sct As XmlSchemaComplexType = CType(vr.SchemaType, XmlSchemaComplexType)
Console.WriteLine("{0}({1},{2})", vr.NodeType, vr.Name, sct.Name)
End If
End If
End If
End Sub
' PrintTypeInfo
Public Shared Sub ValidationHandler(sender As Object, args As ValidationEventArgs)
Console.WriteLine("***Validation error")
Console.WriteLine("Severity:{0}", args.Severity)
Console.WriteLine("Message:{0}", args.Message)
End Sub
' ValidationHandler
End Class
' Sample
End Namespace
' ValidationSample
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
namespace ValidationSample
{
class Sample
{
public static void Main()
{
XmlTextReader tr = new XmlTextReader("HeadCount.xml");
XmlValidatingReader vr = new XmlValidatingReader(tr);
vr.ValidationType = ValidationType.Schema;
vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);
while(vr.Read())
{
PrintTypeInfo(vr);
if(vr.NodeType == XmlNodeType.Element)
{
while(vr.MoveToNextAttribute())
PrintTypeInfo(vr);
}
}
Console.WriteLine("Validation finished");
}
public static void PrintTypeInfo(XmlValidatingReader vr)
{
if(vr.SchemaType != null)
{
if(vr.SchemaType is XmlSchemaDatatype || vr.SchemaType is XmlSchemaSimpleType)
{
object value = vr.ReadTypedValue();
Console.WriteLine("{0}({1},{2}):{3}", vr.NodeType, vr.Name, value.GetType().Name, value);
}
else if(vr.SchemaType is XmlSchemaComplexType)
{
XmlSchemaComplexType sct = (XmlSchemaComplexType)vr.SchemaType;
Console.WriteLine("{0}({1},{2})", vr.NodeType, vr.Name, sct.Name);
}
}
}
public static void ValidationHandler(object sender, ValidationEventArgs args)
{
Console.WriteLine("***Validation error");
Console.WriteLine("\tSeverity:{0}", args.Severity);
Console.WriteLine("\tMessage:{0}", args.Message);
}
}
}
検証対象の入力ファイル HeadCount.xml の内容について、次に概略を示します。
<hc:HeadCount xmlns:hc='xsdHeadCount' xsi:schemaLocation='xsdHeadCount HeadCount.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<Name>Waldo Pepper</Name>
<Name>Red Pepper</Name>
</hc:HeadCount>
検証の基準とする XML スキーマ ファイル HeadCount.xsd の内容について、次に概略を示します。
<xs:schema xmlns="xsdHeadCount" targetNamespace="xsdHeadCount" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='HeadCount' type="HEADCOUNT"/>
<xs:complexType name="HEADCOUNT">
<xs:sequence>
<xs:element name='Name' type='xs:string' maxOccurs='unbounded'/>
</xs:sequence>
<xs:attribute name='division' type='xs:int' use='optional' default='8'/>
</xs:complexType>
</xs:schema>