XmlValidatingReader 유효성 검사 이벤트 처리기 콜백
업데이트: November 2007
ValidationEventHandler 이벤트는 DTD(문서 종류 정의), XDR(XML-Data Reduced) 및 XSD(XML 스키마 정의 언어) 스키마 유효성 검사 오류에 대한 정보를 받을 수 있는 이벤트 처리기를 설정하는 데 사용합니다.
ValidationEventHandler 콜백을 통해 유효성 검사 오류 및 경고가 보고됩니다. ValidationEventHandler를 제공하지 않고 구문 분석 오류가 발생하면 XmlException을 발생시켜 오류를 보고합니다. 유효성 검사 오류가 발생하면 XmlSchemaException이 throw됩니다. 예외가 throw되면 XmlValidatingReader를 다시 시작할 수 없습니다.
참고: |
---|
XmlValidatingReader 클래스는 .NET Framework 버전 2.0에서 사용되지 않습니다. XmlReaderSettings 클래스와 Create 메서드를 사용하여 유효성 검사 XmlReader 인스턴스를 만들 수 있습니다. 자세한 내용은 XmlReader를 사용하여 XML 데이터의 유효성 검사를 참조하십시오. |
ValidationEventHandler 사용
ValidationEventHandler가 있는 유효성 검사 이벤트는 ValidationType 속성이 ValidationType.DTD, ValidationType.Schema, ValidationType.XDR 또는 ValidationType.Auto로 설정된 경우에만 발생합니다. 기본적으로 ValidationType 속성은 ValidationType.Auto로 설정되어 있습니다.
XML 스키마와 XDR 스키마가 XmlSchemaCollection에 추가된 경우 XmlSchemaCollection 클래스에서는 ValidationEventHandler 이벤트를 사용하여 해당 스키마의 유효성 검사 오류를 처리합니다.
다음 코드 예제에서는 유효성 검사 이벤트 처리기가 제공된 경우의 ValidationCallback 메서드를 보여 줍니다.
Sub ValidationCallback(sender As Object, args As ValidationEventArgs)
End Sub
void ValidationCallback(object sender, ValidationEventArgs e)
{
}
ValidationEventArgs 클래스는 텍스트 메시지, 유효성 검사 오류 또는 경고를 나타내는 XmlSeverityType 열거형 및 특정 유효성 검사 오류에 관련된 XmlSchemaException 정보를 포함하는 예외에 대한 속성을 갖고 있습니다.
이벤트 처리기를 제공하지 않으면 XmlSeverityType = Error를 사용하여 첫 번째 유효성 검사 오류에 대해 예외가 throw됩니다. 이 오류 다음에는 XmlValidatingReader를 다시 시작할 수 없습니다. XmlSeverityType = Warning을 사용하여 유효성 검사 오류에 대한 예외를 발생시키지 않습니다. 스키마나 DTD에 대해 유효성을 검사하는 동안 유효성 검사 오류가 throw되면 XmlSchemaException이 생성됩니다.
내용 모델이 일치하지 않기 때문에 지정한 요소나 특성에서 ValidationCallback 메서드를 통해 유효성 오류를 보고할 경우 해당 요소의 나머지 내용 모델은 유효성 검사를 하지 않습니다. 그러나 지정한 요소나 특성의 자식 요소는 유효성 검사를 수행합니다. XmlValidatingReader에서 지정한 요소에 대해 오류를 확인한 후 해당 요소의 유효성 검사를 중지합니다.
유효성 검사 결과 확인
ValidationEventHandler 이벤트와 XmlSeverityType 열거형을 사용하여 XML 인스턴스 문서의 유효성 검사 상태를 확인할 수 있습니다. 심각한 유효성 검사 오류의 경우 ValidationEventArgs.Severity 속성에는 심각한 오류가 발생했음을 나타내는 XmlSeverityType.Error 값이 있습니다. 심각하지 않은 모든 오류(예: 요소와 특성의 유효성 검사에 사용할 스키마나 DTD 정보가 없기 때문에 반환된 오류)의 경우 Severity 속성에는 XmlSeverityType.Warning 값이 있습니다. ValidationType.None을 제외한 모든 ValidationType 값에 대해서는 경고가 발생할 수 있습니다.
참고: |
---|
ValidationEventHandler 내에서 판독기 상태를 변경시키는 메서드의 호출은 지원되지 않습니다. 예를 들어, 이벤트 처리기에서 암시적으로나 명시적으로 판독기에 대해 Read()를 호출하면 판독기 상태를 보장할 수 없습니다. |
다음 코드 예제에서는 XmlSchemaCollection의 XML 스키마에 대해 XML 인스턴스 문서의 유효성 검사를 위해 ValidationEventHandler 이벤트를 사용하는 것을 보여 줍니다.
Private Shared reader As XmlValidatingReader = Nothing
Private Shared treader As XmlTextReader = Nothing
Private Shared filename As [String] = String.Empty
Public Overloads Shared Sub Main()
Dim xsc As New XmlSchemaCollection()
Try
xsc.Add(Nothing, New XmlTextReader("MySchema.xsd"))
treader = New XmlTextReader("Myfilename.xml")
reader = New XmlValidatingReader(treader)
reader.Schemas.Add(xsc)
reader.ValidationType = ValidationType.Schema
AddHandler reader.ValidationEventHandler, AddressOf sample.ValidationCallback
While reader.Read()
End While
Catch e As Exception
If Not (reader Is Nothing) Then
reader.Close()
End If
Console.WriteLine(e.ToString())
End Try
End Sub
' Main
Shared Sub ValidationCallback(sender As Object, args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Warning Then
Console.WriteLine("No schema found to enforce validation.")
Console.WriteLine((filename + "(" + treader.LineNumber + "," + treader.LinePosition + ")" + args.Message))
End If
' ValidationCallback
End Sub
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
public class Sample
{
static String filename = "BooksSchema.xml";
static XmlTextReader treader = null;
public static void Main()
{
XmlValidatingReader reader = null;
XmlSchemaCollection xsc = new XmlSchemaCollection();
ValidationEventHandler eventHandler = new ValidationEventHandler(Sample.ValidationCallback);
try
{
xsc.Add(null, new XmlTextReader("Books.xsd"));
treader = new XmlTextReader(filename);
reader = new XmlValidatingReader(treader);
reader.Schemas.Add(xsc);
reader.ValidationType = ValidationType.Schema;
reader.ValidationEventHandler += eventHandler;
while (reader.Read())
{
}
Console.WriteLine("Validation successful.");
}
catch (Exception e)
{
if ( reader != null )
reader.Close();
Console.WriteLine(e.ToString());
}
}
public static void ValidationCallback(object sender, ValidationEventArgs args )
{
if (args.Severity == XmlSeverityType.Warning)
{
Console.WriteLine("No schema found to enforce validation.");
Console.WriteLine(filename + "(" + treader.LineNumber + "," + treader.LinePosition + ")" + args.Message);
}
}
}
다음에서는 유효성 검사를 할 입력 파일 BooksSchema.xml의 내용을 요약합니다.
<?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema">
<book genre="autobiography">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</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>
다음에서는 유효성 검사를 할 입력 파일 Books.xsd의 내용을 요약합니다.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:bookstore-schema"
elementFormDefault="qualified"
targetNamespace="urn:bookstore-schema">
<xs:element name="bookstore" type="bookstoreType"/>
<xs:complexType name="bookstoreType">
<xs:sequence maxOccurs="unbounded">
<xs:element name="book" type="bookType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="authorName"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
<xs:attribute name="genre" type="xs:string"/>
</xs:complexType>
<xs:complexType name="authorName">
<xs:sequence>
<xs:element name="first-name" type="xs:string"/>
<xs:element name="last-name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
다음 코드 예제에서는 ValidationEventHandler 이벤트를 사용하는 방법을 보여 줍니다. 모든 오류는 콘솔에 기록됩니다.
' Set the validation event handler.
AddHandler reader.ValidationEventHandler, AddressOf ValidationCallBack
Private Sub ValidationCallBack(sender As Object, args As ValidationEventArgs)
Console.WriteLine("Validation CallBack: type: {0} message: {1}", args.Severity, args.Message)
' ValidationCallBack
End Sub
// Set the validation event handler.
reader.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
private void ValidationCallBack(object sender, ValidationEventArgs args )
{
Console.WriteLine("Validation CallBack: type: {0} message: {1}", args.Severity, args.Message);
}