次の方法で共有


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">
thydszwy.alert_note(ja-jp,VS.90).gifメモ :

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

参照

概念

XmlReader による XML の読み取り

その他の技術情報

XmlReader クラスの使用