XmlSchemaCollection を使用して、XML スキーマ定義言語 (XSD) スキーマを基準として XML ドキュメントを検証できます。XmlSchemaCollection は、検証を行うたびにスキーマをメモリに読み込まなくてもいいように、スキーマをコレクションに格納することによってパフォーマンスの向上を図ります。スキーマがスキーマ コレクション内にある場合、コレクション内のスキーマの位置を特定するには schemaLocation 属性を使用します。
データ ファイルのルート要素の例を次に示します。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:bookstore-schema"
elementFormDefault="qualified"
targetNamespace="urn:bookstore-schema">
この例では、targetNamespace 属性の値として、スキーマを XmlSchemaCollection に追加するときに使用される名前空間と同じ urn:bookstore-schema が指定されています。
XML スキーマを XmlSchemaCollection に追加するサンプル コードを次に示します。
Dim xsc As New XmlSchemaCollection()
' XML Schema.
xsc.Add("urn:bookstore-schema", schema)
reader = New XmlTextReader(filename)
vreader = New XmlValidatingReader(reader)
vreader.Schemas.Add(xsc)
[C#]
XmlSchemaCollection xsc = new XmlSchemaCollection();
// XML Schema.
xsc.Add("urn:bookstore-schema", schema);
reader = new XmlTextReader (filename);
vreader = new XmlValidatingReader (reader);
vreader.Schemas.Add(xsc);
一般に、targetNamespace 属性は、XmlSchemaCollection の Add メソッドをとおして namespaceURI プロパティを追加するときに使用されます。スキーマを XmlSchemaCollection に追加する前に、null 参照を指定することもできます。名前空間が関連付けられていないスキーマに対しては、空の文字列 ("") を使用する必要があります。XmlSchemaCollection には、名前空間が関連付けられていないスキーマを 1 つだけ含めることができます。
XML スキーマ HeadCount.xsd を XmlSchemaCollection に追加し、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.Schemas.Add("xsdHeadCount", "HeadCount.xsd")
vr.ValidationType = ValidationType.Schema
AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler
While vr.Read()
End While
Console.WriteLine("Validation finished")
End Sub
' Main
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
[C#]
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.Schemas.Add("xsdHeadCount", "HeadCount.xsd");
vr.ValidationType = ValidationType.Schema;
vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);
while(vr.Read());
Console.WriteLine("Validation finished");
}
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 の内容について、次に概略を示します。
<!--Load HeadCount.xsd in SchemaCollection for Validation-->
<hc:HeadCount xmlns:hc='xsdHeadCount'>
<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>
XmlTextReader を受け取る XmlValidatingReader を作成するサンプル コードを次に示します。XML スキーマ sample4.xsd を基準として、入力ファイル sample4.xml を検証します。
Dim tr As New XmlTextReader("sample4.xml")
Dim vr As New XmlValidatingReader(tr)
vr.ValidationType = ValidationType.Schema
vr.Schemas.Add("datatypesTest", "sample4.xsd")
AddHandler vr.ValidationEventHandler, AddressOf ValidationCallBack
While vr.Read()
Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name)
End While
[C#]
XmlTextReader tr = new XmlTextReader("sample4.xml");
XmlValidatingReader vr = new XmlValidatingReader(tr);
vr.ValidationType = ValidationType.Schema;
vr.Schemas.Add("datatypesTest", "sample4.xsd");
vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
while(vr.Read()) {
Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name);
}
検証対象とする入力ファイル sample4.xml の内容について、次に概略を示します。
<datatypes xmlns="datatypesTest">
<number>
<number_1>123</number_1>
</number>
</datatypes>
検証の基準とする XML スキーマ ファイル sample4.xsd の内容について、次に概略を示します。
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="datatypesTest"
targetNamespace="datatypesTest"
elementFormDefault="qualified">
<xs:element name = "datatypes">
<xs:complexType>
<xs:all>
<xs:element name="number">
<xs:complexType>
<xs:sequence>
<xs:element name="number_1" type="xs:decimal" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
参照
スキーマ キャッシュとしての XmlSchemaCollection | スキーマとの XML の検証 | XmlParserContext クラス | XmlValidatingReader.ValidationEventHandler イベント | XmlValidatingReader.Schemas プロパティ