次の方法で共有


XmlValidatingReader.ValidationEventHandler イベント

DTD、XML-Data Reduced (XDR) スキーマ、および XML スキーマ定義言語 (XSD) スキーマ検証エラーに関する情報を受信するためのイベント ハンドラを設定します。

Public Event ValidationEventHandler As ValidationEventHandler
[C#]
public event ValidationEventHandlerValidationEventHandler;
[C++]
public: __event ValidationEventHandler* ValidationEventHandler;

[JScript] JScript では、このクラスで定義されているイベントを処理できます。ただし、独自に定義することはできません。

イベント データ

イベント ハンドラが、このイベントに関連するデータを含む、ValidationEventArgs 型の引数を受け取りました。次の ValidationEventArgs プロパティには、このイベントの固有の情報が記載されます。

プロパティ 説明
Exception 検証イベントに関連付けられている XmlSchemaException を取得します。
Message 検証イベントに対応している説明テキストを取得します。
Severity 検証イベントの重大度レベルを取得します。

解説

これらのイベントは、 Read 中で、DTD、XDR、Schema、または Auto の ValidationType が指定されている場合にだけ発生します。

イベント ハンドラが提供されていない場合、 XmlException が最初の検証エラー (重大度レベルが XmlSeverityType.Error と等価) にスローされます。

メモ   要素が検証エラーを報告すると、その要素の残りのコンテンツ モデルは検証されませんが、その子は検証されます。リーダーは、指定した要素の最初のエラーだけを報告します。

コールバック ハンドラは、 ValidationEventArgs.Severity プロパティを使用して、確実に XML インスタンス ドキュメントをスキーマで検証できます。 Severity プロパティを使用すると、致命的なエラーを示す検証エラー (重大度レベルが XmlSeverityType.Error と等価) とスキーマ情報が使用できないことを示す検証警告 (重大度レベルが XmlSeverityType.Warning と等価) を区別できます。

使用例

[Visual Basic, C#, C++] XML スキーマ (XSD) でファイルを検証する例を次に示します。

 
Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Schema
Imports Microsoft.VisualBasic

Public Class Sample
    
    Private txtreader As XmlTextReader = Nothing
    Private reader As XmlValidatingReader = Nothing
    Private m_success As Boolean = True
    
    Public Sub New()
        'Validate file against the XSD schema. 
        'The validation should fail.
        Validate("notValidXSD.xml")
    End Sub 'New
    
    Public Shared Sub Main()
        Dim validation As New Sample()
    End Sub 'Main
    
    Private Sub Validate(filename As String)
        Try
            Console.WriteLine("Validating XML file " & filename.ToString())
            txtreader = New XmlTextReader(filename)
            reader = New XmlValidatingReader(txtreader)
            
            ' Set the validation event handler
            AddHandler reader.ValidationEventHandler, AddressOf Me.ValidationEventHandle
            
            ' Read XML data
            While reader.Read()
            End While
            Console.WriteLine("Validation finished. Validation {0}", IIf(m_success, "successful", "failed"))
        
        Finally
            'Close the reader.
            If Not (reader Is Nothing) Then
                reader.Close()
            End If
        End Try
    End Sub 'Validate
     
    'Display the validation error.
    Private Sub ValidationEventHandle(sender As Object, args As ValidationEventArgs)
        m_success = False
        Console.WriteLine(ControlChars.CrLf & ControlChars.Tab & "Validation error: " & args.Message)
    End Sub 'ValidationEventHandle
End Class 'Sample

[C#] 
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;

public class Sample
{

  private XmlTextReader txtreader = null;
  private XmlValidatingReader reader = null;
  private Boolean m_success = true;

  public Sample ()
  {
        //Validate file against the XSD schema. 
        //The validation should fail.
        Validate("notValidXSD.xml"); 
  }    

  public static void Main ()
  {
      Sample validation = new Sample();
  }

  private void Validate(String filename)
  {    
     try
     {
        Console.WriteLine("Validating XML file " + filename.ToString());
        txtreader = new XmlTextReader (filename);
        reader = new XmlValidatingReader (txtreader);

        // Set the validation event handler
        reader.ValidationEventHandler += new ValidationEventHandler (this.ValidationEventHandle);

        // Read XML data
        while (reader.Read()){}
        Console.WriteLine ("Validation finished. Validation {0}", (m_success==true ? "successful" : "failed"));
     }

     finally
     {
        //Close the reader.
        if (reader != null)
          reader.Close();
     } 
  }

  //Display the validation error.
  private void ValidationEventHandle (object sender, ValidationEventArgs args)
  {
     m_success = false;
     Console.WriteLine("\r\n\tValidation error: " + args.Message );
  }
}

[C++] 
#using <mscorlib.dll>
#using <System.Xml.dll>
using namespace System;
using namespace System::IO;
using namespace System::Xml;
using namespace System::Xml::Schema;

public __gc class Sample
{
private:
   XmlTextReader* txtreader;
   XmlValidatingReader* reader;
   Boolean m_success;

public:
   Sample ()
   {
      txtreader = 0;
      reader = 0;
      m_success = true;
      //Validate file against the XSD schema. 
      //The validation should fail.
      Validate(S"notValidXSD.xml"); 
   }    

private:
   void Validate(String* filename)
   {    
      try
      {
         Console::WriteLine(S"Validating XML file {0}", filename);
         txtreader = new XmlTextReader (filename);
         reader = new XmlValidatingReader (txtreader);

         // Set the validation event handler
         reader->ValidationEventHandler += new ValidationEventHandler (this, &Sample::ValidationEventHandle);

         // Read XML data
         while (reader->Read()){}
         Console::WriteLine (S"Validation finished. Validation {0}",(m_success==true?S"successful":S"failed"));
      }

      __finally
      {
         //Close the reader.
         if (reader != 0)
            reader->Close();
      } 
   }

   //Display the validation error.
   void ValidationEventHandle (Object* /*sender*/, ValidationEventArgs* args)
   {
      m_success = false;
      Console::WriteLine(S"\r\n\tValidation error: {0}", args->Message );
   }
};

int main ()
{
   new Sample();
}

[Visual Basic, C#, C++] このサンプルでは、次の 2 つの入力ファイルを使用します。

[Visual Basic, C#, C++] notValidXSD.xml (xsi:schemaLocation 属性は、リーダーの XML スキーマ (XSD) を識別します。)

<?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="urn:bookstore-schema books.xsd">
  <book>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
  </book>
  <book genre="novel">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
</bookstore>

[Visual Basic, C#, C++] books.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:bookstore-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:bookstore-schema">

 <xsd:element name="bookstore" type="bookstoreType"/>

 <xsd:complexType name="bookstoreType">
  <xsd:sequence maxOccurs="unbounded">
   <xsd:element name="book"  type="bookType"/>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:complexType name="bookType">
  <xsd:sequence>
   <xsd:element name="title" type="xsd:string"/>
   <xsd:element name="author" type="authorName"/>
   <xsd:element name="price"  type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="genre" type="xsd:string"/>
 </xsd:complexType>

 <xsd:complexType name="authorName">
  <xsd:sequence>
   <xsd:element name="first-name"  type="xsd:string"/>
   <xsd:element name="last-name" type="xsd:string"/>
  </xsd:sequence>
 </xsd:complexType>

</xsd:schema>

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

XmlValidatingReader クラス | XmlValidatingReader メンバ | System.Xml 名前空間 | XmlSeverityType