[XML.NET] 16. 유효성 검사 설정 XmlReader 개체 만들기

 이번에는 XmlSchemaSet 개체로 유효성 검사를 할 수 있게 XmlReader 개체를 생성하는 방법을 살펴볼게요.

예제에서는 XmlSchemaSet 개체를 생성하여 이미 작성한 스키마 파일 “data.xsd”의 내용을 XmlSchemaSet에 추가하고 XmlReaderSettings 개체의Schemas 속성에 설정합니다. 그리고 XmlReader 개체를 이용하여 데이터 소스에 유효성이 위배한 부분을 발견할 때 처리하기 위한 이벤트 핸들러를 추가합니다.

 이와 같은 작업을 한 후에 XmlReaderSettings 개체를 전달하여 XmlReader 개체를 생성하면 이후에 읽기 작업 등에서 데이터 소스에 유효성이 위배한 부분을 발견하면 설정한 이벤트 핸들러가 동작합니다.

using System;
using System.Xml.Schema;
using System.Xml;

namespace 예제_3._3_유효성_검사를_설정한_XmlReader_개체_만들기
{
    class Program
    {
        static void Main(string[] args)
        {

            XmlSchemaSet sc = new XmlSchemaSet();
            sc.Add("urn:books-schema", "data.xsd");

            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.Schemas = sc;
            settings.ValidationEventHandler += ValidationCallBack;
            XmlReader reader = XmlReader.Create("data.xml", settings);
            WirteConsole(reader);
            reader.Close();
        }

        //유효성 위배가 있을 시 콜솔에 출력
        private static void ValidationCallBack(object sender, ValidationEventArgs e)
        {
            Console.WriteLine("Validation Error: {0}", e.Message);
        }

        private static void WirteConsole(XmlReader reader)
        {
            XmlWriter xwriter = XmlWriter.Create(Console.Out);
            xwriter.WriteNode(reader, false);
            xwriter.Close();
            Console.WriteLine();
        }
    }
}

  유효성 검사는 XmlSchemaSet 개체를 이용하는 방법 외에도 DTD를 사용하거나 래핑된 XmlReader 개체를 사용하는 방법 등이 있으니 MSDN을 참고하시기 바랍니다.

 다음은 미리 작성한 스키마 파일 “data.xsd”와 데이터 소스로 사용할 “data.xml” 파일의 내용입니다.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:books-schema"
        elementFormDefault="qualified"    targetNamespace="urn:books-schema">
 <xsd:element name="books" type="booksType"/>
 <xsd:complexType name="booksType">
  <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="price"  type="xsd:int"/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:schema>
<?xml version="1.0" encoding="utf-8"?>
<books xmlns="urn:books-schema">
  <book>
    <title>XML.NET 과 ADO.NET</title>
    <price>2200.0</price>
  </book>
</books>
실행 화면